diff --git a/.dependabot/config.yml b/.dependabot/config.yml new file mode 100644 index 000000000..02dfd18aa --- /dev/null +++ b/.dependabot/config.yml @@ -0,0 +1,5 @@ +version: 1 +update_configs: + - package_manager: "javascript" + directory: "/" + update_schedule: "weekly" diff --git a/.eslintrc.js b/.eslintrc.js index 6a01fe5bf..4a3fec944 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -40,6 +40,7 @@ module.exports = { 'no-multiple-empty-lines': ["error", { "max": 1 }], 'no-trailing-spaces': ["error"], 'one-var': ["error", "never"], + 'quotes': ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": false }], 'semi': ["error"], 'space-before-blocks': ["error"] }, @@ -182,7 +183,9 @@ module.exports = { 'Uint32Array', 'Float32Array', 'Float64Array', - 'Reflect' + 'Reflect', + // Temporary while eslint-compat-plugin is buggy + 'document.querySelector' ] } } diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e902dc712..a35eb9981 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,4 @@ -# Joshua must review all changes to deployment and build.sh -deployment/* @joshuaboniface +.ci @dkanada @EraYaN +.github @jellyfin/core build.sh @joshuaboniface +deployment @joshuaboniface diff --git a/.gitignore b/.gitignore index 4adf9558b..9bccd32fb 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ node_modules # ide .idea -.vscode \ No newline at end of file +.vscode + +#log +yarn-error.log diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index aa3ec707e..2eae7e693 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -34,6 +34,7 @@ - [Ryan Hartzell](https://github.com/ryan-hartzell) - [Thibault Nocchi](https://github.com/ThibaultNocchi) - [MrTimscampi](https://github.com/MrTimscampi) + - [Sarab Singh](https://github.com/sarab97) # Emby Contributors diff --git a/babel.config.json b/babel.config.json deleted file mode 100644 index 1320b9a32..000000000 --- a/babel.config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-env"] -} diff --git a/gulpfile.js b/gulpfile.js index 0e9732455..6c3316738 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -8,8 +8,8 @@ const htmlmin = require('gulp-htmlmin'); const imagemin = require('gulp-imagemin'); const sourcemaps = require('gulp-sourcemaps'); const mode = require('gulp-mode')({ - modes: ["development", "production"], - default: "development", + modes: ['development', 'production'], + default: 'development', verbose: false }); const stream = require('webpack-stream'); @@ -55,7 +55,7 @@ const options = { function serve() { browserSync.init({ server: { - baseDir: "./dist" + baseDir: './dist' }, port: 8080 }); diff --git a/package.json b/package.json index c22437bfc..1e7ebfd0c 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "^7.8.6", - "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/core": "^7.9.6", + "@babel/plugin-transform-modules-amd": "^7.9.6", "@babel/polyfill": "^7.8.7", "@babel/preset-env": "^7.8.6", "autoprefixer": "^9.7.6", @@ -36,46 +36,47 @@ "gulp-sass": "^4.0.2", "gulp-sourcemaps": "^2.6.5", "gulp-terser": "^1.2.0", - "html-webpack-plugin": "^4.0.2", + "html-webpack-plugin": "^4.3.0", "lazypipe": "^1.0.2", "node-sass": "^4.13.1", "postcss-loader": "^3.0.0", "postcss-preset-env": "^6.7.0", "style-loader": "^1.1.3", - "stylelint": "^13.1.0", + "stylelint": "^13.3.3", "stylelint-config-rational-order": "^0.1.2", "stylelint-no-browser-hacks": "^1.2.1", "stylelint-order": "^4.0.0", "webpack": "^4.41.5", "webpack-cli": "^3.3.10", "webpack-concat-plugin": "^3.0.0", - "webpack-dev-server": "^3.10.3", + "webpack-dev-server": "^3.11.0", "webpack-merge": "^4.2.2", "webpack-stream": "^5.2.1" }, "dependencies": { "alameda": "^1.4.0", "classlist.js": "https://github.com/eligrey/classList.js/archive/1.2.20180112.tar.gz", - "core-js": "^3.6.4", - "date-fns": "^2.11.1", + "core-js": "^3.6.5", + "date-fns": "^2.13.0", "document-register-element": "^1.14.3", "fast-text-encoding": "^1.0.1", "flv.js": "^1.5.0", "headroom.js": "^0.11.0", "hls.js": "^0.13.1", "howler": "^2.1.3", - "intersection-observer": "^0.7.0", + "intersection-observer": "^0.10.0", + "jellyfin-apiclient": "^1.1.1", "jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto", - "jquery": "^3.4.1", + "jquery": "^3.5.1", "jstree": "^3.3.7", - "libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf-cordova", + "libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf-smarttv", "material-design-icons-iconfont": "^5.0.1", "native-promise-only": "^0.8.0-a", - "page": "^1.11.5", + "page": "^1.11.6", "query-string": "^6.11.1", "resize-observer-polyfill": "^1.5.1", "screenfull": "^5.0.2", - "shaka-player": "^2.5.10", + "shaka-player": "^2.5.11", "sortablejs": "^1.10.2", "swiper": "^5.3.7", "webcomponents.js": "^0.7.24", @@ -90,18 +91,25 @@ "test": [ "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", - "src/scripts/dom.js", "src/components/filedownloader.js", - "src/components/filesystem.js", - "src/scripts/keyboardnavigation.js", + "src/components/images/imageLoader.js", + "src/components/lazyloader/lazyloader-intersectionobserver.js", + "src/components/playback/mediasession.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", + "src/scripts/dfnshelper.js", + "src/scripts/dom.js", + "src/scripts/filesystem.js", + "src/scripts/imagehelper.js", + "src/scripts/inputManager.js", + "src/components/deletehelper.js", + "src/components/actionsheet/actionsheet.js", + "src/components/playmenu.js", + "src/components/indicators/indicators.js", + "src/scripts/keyboardnavigation.js", "src/scripts/settings/appSettings.js", "src/scripts/settings/userSettings.js", - "src/scripts/settings/webSettings.js", - "src/scripts/dfnshelper.js", - "src/scripts/imagehelper.js", - "src/scripts/inputManager.js" + "src/scripts/settings/webSettings.js" ], "plugins": [ "@babel/plugin-transform-modules-amd" diff --git a/postcss.config.js b/postcss.config.js index 9ce2e16af..bd1651fa1 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,11 +1,14 @@ +const packageConfig = require('./package.json'); const postcssPresetEnv = require('postcss-preset-env'); const autoprefixer = require('autoprefixer'); const cssnano = require('cssnano'); const config = () => ({ plugins: [ - postcssPresetEnv(), - autoprefixer(), + // Explicitly specify browserslist to override ones from node_modules + // For example, Swiper has it in its package.json + postcssPresetEnv({browsers: packageConfig.browserslist}), + autoprefixer({overrideBrowserslist: packageConfig.browserslist}), cssnano() ] }); diff --git a/src/addplugin.html b/src/addplugin.html index 30e42a2c5..81c671d5b 100644 --- a/src/addplugin.html +++ b/src/addplugin.html @@ -5,7 +5,7 @@

- ${Help} + ${Help}

diff --git a/src/addserver.html b/src/addserver.html index 763f56851..02850fffb 100644 --- a/src/addserver.html +++ b/src/addserver.html @@ -3,7 +3,7 @@

${HeaderConnectToServer}

- +
${LabelServerHostHelp}

diff --git a/src/apikeys.html b/src/apikeys.html index 6f766ae6c..3cb7cd6de 100644 --- a/src/apikeys.html +++ b/src/apikeys.html @@ -4,18 +4,19 @@

${HeaderApiKeys}

${HeaderApiKeysHelp}


+ - - - - + + + + diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index f7a116046..82e704f07 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -644,12 +644,7 @@ div.itemDetailGalleryLink.defaultCardBackground { height: 23vw; /* Dirty hack to get it to look somewhat square. Less than ideal. */ } -.btnSyncComplete i { - -webkit-border-radius: 100em; - border-radius: 100em; -} - -.itemDetailGalleryLink.defaultCardBackground > i { +.itemDetailGalleryLink.defaultCardBackground > .material-icons { font-size: 15vw; margin-top: 50%; transform: translateY(-50%); @@ -681,10 +676,6 @@ div.itemDetailGalleryLink.defaultCardBackground { } } -.btnSyncComplete { - background: #673ab7 !important; -} - .emby-button.detailFloatingButton { position: absolute; background-color: rgba(0, 0, 0, 0.5) !important; @@ -696,7 +687,7 @@ div.itemDetailGalleryLink.defaultCardBackground { color: rgba(255, 255, 255, 0.76); } -.emby-button.detailFloatingButton i { +.emby-button.detailFloatingButton .material-icons { font-size: 3.5em; } diff --git a/src/assets/css/site.css b/src/assets/css/site.css index e59b639f4..627145abc 100644 --- a/src/assets/css/site.css +++ b/src/assets/css/site.css @@ -5,6 +5,17 @@ html { height: 100%; } +.clipForScreenReader { + clip: rect(1px, 1px, 1px, 1px); + clip-path: inset(50%); + height: 1px; + width: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; +} + .material-icons { /* Fix font ligatures on older WebOS versions */ -webkit-font-feature-settings: "liga"; diff --git a/src/bundle.js b/src/bundle.js index 8a829103f..d7ba6c6a5 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -5,150 +5,174 @@ var _define = window.define; // document-register-element -var docRegister = require("document-register-element"); -_define("document-register-element", function() { +var docRegister = require('document-register-element'); +_define('document-register-element', function() { return docRegister; }); // fetch -var fetch = require("whatwg-fetch"); -_define("fetch", function() { +var fetch = require('whatwg-fetch'); +_define('fetch', function() { return fetch; }); // query-string -var query = require("query-string"); -_define("queryString", function() { +var query = require('query-string'); +_define('queryString', function() { return query; }); // flvjs -var flvjs = require("flv.js/dist/flv").default; -_define("flvjs", function() { +var flvjs = require('flv.js/dist/flv').default; +_define('flvjs', function() { return flvjs; }); // jstree -var jstree = require("jstree"); -require("jstree/dist/themes/default/style.css"); -_define("jstree", function() { +var jstree = require('jstree'); +require('jstree/dist/themes/default/style.css'); +_define('jstree', function() { return jstree; }); // jquery -var jquery = require("jquery"); -_define("jQuery", function() { +var jquery = require('jquery'); +_define('jQuery', function() { return jquery; }); // hlsjs -var hlsjs = require("hls.js"); -_define("hlsjs", function() { +var hlsjs = require('hls.js'); +_define('hlsjs', function() { return hlsjs; }); // howler -var howler = require("howler"); -_define("howler", function() { +var howler = require('howler'); +_define('howler', function() { return howler; }); // resize-observer-polyfill -var resize = require("resize-observer-polyfill").default; -_define("resize-observer-polyfill", function() { +var resize = require('resize-observer-polyfill').default; +_define('resize-observer-polyfill', function() { return resize; }); // shaka -var shaka = require("shaka-player"); -_define("shaka", function() { +var shaka = require('shaka-player'); +_define('shaka', function() { return shaka; }); // swiper -var swiper = require("swiper/js/swiper"); -require("swiper/css/swiper.min.css"); -_define("swiper", function() { +var swiper = require('swiper/js/swiper'); +require('swiper/css/swiper.min.css'); +_define('swiper', function() { return swiper; }); // sortable -var sortable = require("sortablejs").default; -_define("sortable", function() { +var sortable = require('sortablejs').default; +_define('sortable', function() { return sortable; }); // webcomponents -var webcomponents = require("webcomponents.js/webcomponents-lite"); -_define("webcomponents", function() { +var webcomponents = require('webcomponents.js/webcomponents-lite'); +_define('webcomponents', function() { return webcomponents; }); // libass-wasm -var libassWasm = require("libass-wasm"); -_define("JavascriptSubtitlesOctopus", function() { +var libassWasm = require('libass-wasm'); +_define('JavascriptSubtitlesOctopus', function() { return libassWasm; }); // material-icons -var materialIcons = require("material-design-icons-iconfont/dist/material-design-icons.css"); -_define("material-icons", function() { +var materialIcons = require('material-design-icons-iconfont/dist/material-design-icons.css'); +_define('material-icons', function() { return materialIcons; }); // noto font -var noto = require("jellyfin-noto"); -_define("jellyfin-noto", function () { +var noto = require('jellyfin-noto'); +_define('jellyfin-noto', function () { return noto; }); // page.js -var page = require("page"); -_define("page", function() { +var page = require('page'); +_define('page', function() { return page; }); -var polyfill = require("@babel/polyfill/dist/polyfill"); -_define("polyfill", function () { +// core-js +var polyfill = require('@babel/polyfill/dist/polyfill'); +_define('polyfill', function () { return polyfill; }); // domtokenlist-shim -var classlist = require("classlist.js"); -_define("classlist-polyfill", function () { +var classlist = require('classlist.js'); +_define('classlist-polyfill', function () { return classlist; }); // Date-FNS -var dateFns = require("date-fns"); -_define("date-fns", function () { +var dateFns = require('date-fns'); +_define('date-fns', function () { return dateFns; }); -var dateFnsLocale = require("date-fns/locale"); -_define("date-fns/locale", function () { +var dateFnsLocale = require('date-fns/locale'); +_define('date-fns/locale', function () { return dateFnsLocale; }); -var fast_text_encoding = require("fast-text-encoding"); -_define("fast-text-encoding", function () { +var fast_text_encoding = require('fast-text-encoding'); +_define('fast-text-encoding', function () { return fast_text_encoding; }); // intersection-observer -var intersection_observer = require("intersection-observer"); -_define("intersection-observer", function () { +var intersection_observer = require('intersection-observer'); +_define('intersection-observer', function () { return intersection_observer; }); // screenfull -var screenfull = require("screenfull"); -_define("screenfull", function () { +var screenfull = require('screenfull'); +_define('screenfull', function () { return screenfull; }); // headroom.js -var headroom = require("headroom.js/dist/headroom"); -_define("headroom", function () { +var headroom = require('headroom.js/dist/headroom'); +_define('headroom', function () { return headroom; }); + +// apiclient +var apiclient = require('jellyfin-apiclient'); + +_define('apiclient', function () { + return apiclient.ApiClient; +}); + +_define('events', function () { + return apiclient.Events; +}); + +_define('credentialprovider', function () { + return apiclient.Credentials; +}); + +_define('connectionManagerFactory', function () { + return apiclient.ConnectionManager; +}); + +_define('appStorage', function () { + return apiclient.AppStorage; +}); diff --git a/src/components/accessschedule/accessschedule.js b/src/components/accessschedule/accessschedule.js index 28b09b893..870231cf0 100644 --- a/src/components/accessschedule/accessschedule.js +++ b/src/components/accessschedule/accessschedule.js @@ -1,5 +1,5 @@ -define(["dialogHelper", "datetime", "globalize", "emby-select", "paper-icon-button-light", "formDialogStyle"], function (dialogHelper, datetime, globalize) { - "use strict"; +define(['dialogHelper', 'datetime', 'globalize', 'emby-select', 'paper-icon-button-light', 'formDialogStyle'], function (dialogHelper, datetime, globalize) { + 'use strict'; function getDisplayTime(hours) { var minutes = 0; @@ -13,32 +13,32 @@ define(["dialogHelper", "datetime", "globalize", "emby-select", "paper-icon-butt } function populateHours(context) { - var html = ""; + var html = ''; for (var i = 0; i < 24; i++) { - html += '"; + html += ''; } - html += '"; - context.querySelector("#selectStart").innerHTML = html; - context.querySelector("#selectEnd").innerHTML = 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; + 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 + DayOfWeek: context.querySelector('#selectDay').value, + StartHour: context.querySelector('#selectStart').value, + EndHour: context.querySelector('#selectEnd').value }; if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) { - return void alert(globalize.translate("ErrorMessageStartHourGreaterThanEnd")); + return void alert(globalize.translate('ErrorMessageStartHourGreaterThanEnd')); } context.submitted = true; @@ -50,32 +50,32 @@ define(["dialogHelper", "datetime", "globalize", "emby-select", "paper-icon-butt show: function (options) { return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); - xhr.open("GET", "components/accessschedule/accessschedule.template.html", true); + 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" + size: 'small' }); - dlg.classList.add("formDialog"); - var html = ""; + 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 () { + dlg.addEventListener('close', function () { if (dlg.submitted) { resolve(options.schedule); } else { reject(); } }); - dlg.querySelector(".btnCancel").addEventListener("click", function (e) { + dlg.querySelector('.btnCancel').addEventListener('click', function (e) { dialogHelper.close(dlg); }); - dlg.querySelector("form").addEventListener("submit", function (e) { + dlg.querySelector('form').addEventListener('submit', function (e) { submitSchedule(dlg, options); e.preventDefault(); return false; diff --git a/src/components/accessschedule/accessschedule.template.html b/src/components/accessschedule/accessschedule.template.html index 02f11942e..493150ae5 100644 --- a/src/components/accessschedule/accessschedule.template.html +++ b/src/components/accessschedule/accessschedule.template.html @@ -1,6 +1,6 @@
-

${HeaderAccessSchedule} diff --git a/src/components/actionsheet/actionsheet.js b/src/components/actionsheet/actionsheet.js index 926d63b63..18239f8de 100644 --- a/src/components/actionsheet/actionsheet.js +++ b/src/components/actionsheet/actionsheet.js @@ -1,360 +1,343 @@ -define(['dialogHelper', 'layoutManager', 'globalize', 'browser', 'dom', 'emby-button', 'css!./actionsheet', 'material-icons', 'scrollStyles', 'listViewStyle'], function (dialogHelper, layoutManager, globalize, browser, dom) { - 'use strict'; +import dialogHelper from 'dialogHelper'; +import layoutManager from 'layoutManager'; +import globalize from 'globalize'; +import dom from 'dom'; +import 'emby-button'; +import 'css!./actionsheet'; +import 'material-icons'; +import 'scrollStyles'; +import 'listViewStyle'; - function getOffsets(elems) { +function getOffsets(elems) { - var doc = document; - var results = []; - - if (!doc) { - return results; - } - - var box; - var elem; - - for (var i = 0, length = elems.length; i < length; i++) { - - elem = elems[i]; - // Support: BlackBerry 5, iOS 3 (original iPhone) - // If we don't have gBCR, just use 0,0 rather than error - if (elem.getBoundingClientRect) { - box = elem.getBoundingClientRect(); - } else { - box = { top: 0, left: 0 }; - } - - results[i] = { - top: box.top, - left: box.left, - width: box.width, - height: box.height - }; - } + let results = []; + if (!document) { return results; } - function getPosition(options, dlg) { - - var windowSize = dom.getWindowSize(); - var windowHeight = windowSize.innerHeight; - var windowWidth = windowSize.innerWidth; - - var pos = getOffsets([options.positionTo])[0]; - - if (options.positionY !== 'top') { - pos.top += (pos.height || 0) / 2; + let box; + for (let elem of elems) { + // Support: BlackBerry 5, iOS 3 (original iPhone) + // If we don't have gBCR, just use 0,0 rather than error + if (elem.getBoundingClientRect) { + box = elem.getBoundingClientRect(); + } else { + box = { top: 0, left: 0 }; } - pos.left += (pos.width || 0) / 2; - - var height = dlg.offsetHeight || 300; - var width = dlg.offsetWidth || 160; - - // Account for popup size - pos.top -= height / 2; - pos.left -= width / 2; - - // Avoid showing too close to the bottom - var overflowX = pos.left + width - windowWidth; - var overflowY = pos.top + height - windowHeight; - - if (overflowX > 0) { - pos.left -= (overflowX + 20); - } - if (overflowY > 0) { - pos.top -= (overflowY + 20); - } - - pos.top += (options.offsetTop || 0); - pos.left += (options.offsetLeft || 0); - - // Do some boundary checking - pos.top = Math.max(pos.top, 10); - pos.left = Math.max(pos.left, 10); - - return pos; - } - - function centerFocus(elem, horiz, on) { - require(['scrollHelper'], function (scrollHelper) { - var fn = on ? 'on' : 'off'; - scrollHelper.centerFocus[fn](elem, horiz); + results.push({ + top: box.top, + left: box.left, + width: box.width, + height: box.height }); } - function show(options) { + return results; +} - // items - // positionTo - // showCancel - // title - var dialogOptions = { - removeOnClose: true, - enableHistory: options.enableHistory, - scrollY: false - }; +function getPosition(options, dlg) { - var backButton = false; - var isFullscreen; + const windowSize = dom.getWindowSize(); + const windowHeight = windowSize.innerHeight; + const windowWidth = windowSize.innerWidth; - if (layoutManager.tv) { - dialogOptions.size = 'fullscreen'; - isFullscreen = true; - backButton = true; - dialogOptions.autoFocus = true; - } else { + let pos = getOffsets([options.positionTo])[0]; - dialogOptions.modal = false; - dialogOptions.entryAnimation = options.entryAnimation; - dialogOptions.exitAnimation = options.exitAnimation; - dialogOptions.entryAnimationDuration = options.entryAnimationDuration || 140; - dialogOptions.exitAnimationDuration = options.exitAnimationDuration || 100; - dialogOptions.autoFocus = false; + if (options.positionY !== 'top') { + pos.top += (pos.height || 0) / 2; + } + + pos.left += (pos.width || 0) / 2; + + const height = dlg.offsetHeight || 300; + const width = dlg.offsetWidth || 160; + + // Account for popup size + pos.top -= height / 2; + pos.left -= width / 2; + + // Avoid showing too close to the bottom + const overflowX = pos.left + width - windowWidth; + const overflowY = pos.top + height - windowHeight; + + if (overflowX > 0) { + pos.left -= (overflowX + 20); + } + if (overflowY > 0) { + pos.top -= (overflowY + 20); + } + + pos.top += (options.offsetTop || 0); + pos.left += (options.offsetLeft || 0); + + // Do some boundary checking + pos.top = Math.max(pos.top, 10); + pos.left = Math.max(pos.left, 10); + + return pos; +} + +function centerFocus(elem, horiz, on) { + require(['scrollHelper'], function (scrollHelper) { + const fn = on ? 'on' : 'off'; + scrollHelper.centerFocus[fn](elem, horiz); + }); +} + +export function show(options) { + + // items + // positionTo + // showCancel + // title + let dialogOptions = { + removeOnClose: true, + enableHistory: options.enableHistory, + scrollY: false + }; + + let isFullscreen; + + if (layoutManager.tv) { + dialogOptions.size = 'fullscreen'; + isFullscreen = true; + dialogOptions.autoFocus = true; + } else { + + dialogOptions.modal = false; + dialogOptions.entryAnimation = options.entryAnimation; + dialogOptions.exitAnimation = options.exitAnimation; + dialogOptions.entryAnimationDuration = options.entryAnimationDuration || 140; + dialogOptions.exitAnimationDuration = options.exitAnimationDuration || 100; + dialogOptions.autoFocus = false; + } + + let dlg = dialogHelper.createDialog(dialogOptions); + + if (isFullscreen) { + dlg.classList.add('actionsheet-fullscreen'); + } else { + dlg.classList.add('actionsheet-not-fullscreen'); + } + + dlg.classList.add('actionSheet'); + + if (options.dialogClass) { + dlg.classList.add(options.dialogClass); + } + + let html = ''; + + const scrollClassName = layoutManager.tv ? 'scrollY smoothScrollY hiddenScrollY' : 'scrollY'; + let style = ''; + + // Admittedly a hack but right now the scrollbar is being factored into the width which is causing truncation + if (options.items.length > 20) { + const minWidth = dom.getWindowSize().innerWidth >= 300 ? 240 : 200; + style += 'min-width:' + minWidth + 'px;'; + } + + let renderIcon = false; + let icons = []; + let itemIcon; + for (let item of options.items) { + + itemIcon = item.icon || (item.selected ? 'check' : null); + + if (itemIcon) { + renderIcon = true; + } + icons.push(itemIcon || ''); + } + + if (layoutManager.tv) { + html += ''; + } + + // If any items have an icon, give them all an icon just to make sure they're all lined up evenly + const center = options.title && (!renderIcon /*|| itemsWithIcons.length != options.items.length*/); + + if (center || layoutManager.tv) { + html += '
'; + } else { + html += '
'; + } + + if (options.title) { + + html += '

' + options.title + '

'; + } + if (options.text) { + html += '

' + options.text + '

'; + } + + let scrollerClassName = 'actionSheetScroller'; + if (layoutManager.tv) { + scrollerClassName += ' actionSheetScroller-tv focuscontainer-x focuscontainer-y'; + } + html += '
'; + + let menuItemClass = 'listItem listItem-button actionSheetMenuItem'; + + if (options.border || options.shaded) { + menuItemClass += ' listItem-border'; + } + + if (options.menuItemClass) { + menuItemClass += ' ' + options.menuItemClass; + } + + if (layoutManager.tv) { + menuItemClass += ' listItem-focusscale'; + } + + if (layoutManager.mobile) { + menuItemClass += ' actionsheet-xlargeFont'; + } + + for (let [i, item] of options.items.entries()) { + + if (item.divider) { + + html += '
'; + continue; } - var dlg = dialogHelper.createDialog(dialogOptions); + const autoFocus = item.selected && layoutManager.tv ? ' autoFocus' : ''; - if (isFullscreen) { - dlg.classList.add('actionsheet-fullscreen'); - } else { - dlg.classList.add('actionsheet-not-fullscreen'); + // Check for null in case int 0 was passed in + const optionId = item.id == null || item.id === '' ? item.value : item.id; + html += ''; + + itemIcon = icons[i]; + + if (itemIcon) { + html += ''; + } else if (renderIcon && !center) { + html += ''; } - dlg.classList.add('actionSheet'); + html += '
'; - if (options.dialogClass) { - dlg.classList.add(options.dialogClass); - } - - var html = ''; - - var scrollClassName = layoutManager.tv ? 'scrollY smoothScrollY hiddenScrollY' : 'scrollY'; - var style = ''; - - // Admittedly a hack but right now the scrollbar is being factored into the width which is causing truncation - if (options.items.length > 20) { - var minWidth = dom.getWindowSize().innerWidth >= 300 ? 240 : 200; - style += "min-width:" + minWidth + "px;"; - } - - var i; - var length; - var option; - var renderIcon = false; - var icons = []; - var itemIcon; - for (i = 0, length = options.items.length; i < length; i++) { - - option = options.items[i]; - - itemIcon = option.icon || (option.selected ? 'check' : null); - - if (itemIcon) { - renderIcon = true; - } - icons.push(itemIcon || ''); - } - - if (layoutManager.tv) { - html += ''; - } - - // If any items have an icon, give them all an icon just to make sure they're all lined up evenly - var center = options.title && (!renderIcon /*|| itemsWithIcons.length != options.items.length*/); - - if (center || layoutManager.tv) { - html += '
'; - } else { - html += '
'; - } - - if (options.title) { - - html += '

'; - html += options.title; - html += '

'; - } - if (options.text) { - html += '

'; - html += options.text; - html += '

'; - } - - var scrollerClassName = 'actionSheetScroller'; - if (layoutManager.tv) { - scrollerClassName += ' actionSheetScroller-tv focuscontainer-x focuscontainer-y'; - } - html += '
'; - - var menuItemClass = 'listItem listItem-button actionSheetMenuItem'; - - if (options.border || options.shaded) { - menuItemClass += ' listItem-border'; - } - - if (options.menuItemClass) { - menuItemClass += ' ' + options.menuItemClass; - } - - if (layoutManager.tv) { - menuItemClass += ' listItem-focusscale'; - } - - if (layoutManager.mobile) { - menuItemClass += ' actionsheet-xlargeFont'; - } - - for (i = 0, length = options.items.length; i < length; i++) { - - option = options.items[i]; - - if (option.divider) { - - html += '
'; - continue; - } - - var autoFocus = option.selected && layoutManager.tv ? ' autoFocus' : ''; - - // Check for null in case int 0 was passed in - var optionId = option.id == null || option.id === '' ? option.value : option.id; - html += ''; - - itemIcon = icons[i]; - - if (itemIcon) { - - html += '' + itemIcon + ''; - } else if (renderIcon && !center) { - html += ''; - } - - html += '
'; - - html += '
'; - html += (option.name || option.textContent || option.innerText); - html += '
'; - - if (option.secondaryText) { - html += '
'; - html += option.secondaryText; - html += '
'; - } - - html += '
'; - - if (option.asideText) { - html += '
'; - html += option.asideText; - html += '
'; - } - - html += ''; - } - - if (options.showCancel) { - html += '
'; - html += ''; - html += '
'; - } + html += '
'; + html += (item.name || item.textContent || item.innerText); html += '
'; - dlg.innerHTML = html; - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.actionSheetScroller'), false, true); + if (item.secondaryText) { + html += '
' + item.secondaryText + '
'; } - var btnCloseActionSheet = dlg.querySelector('.btnCloseActionSheet'); - if (btnCloseActionSheet) { - dlg.querySelector('.btnCloseActionSheet').addEventListener('click', function () { - dialogHelper.close(dlg); - }); + html += '
'; + + if (item.asideText) { + html += '
' + item.asideText + '
'; } - // Seeing an issue in some non-chrome browsers where this is requiring a double click - //var eventName = browser.firefox ? 'mousedown' : 'click'; - var selectedId; + html += ''; + } - var timeout; - if (options.timeout) { - timeout = setTimeout(function () { - dialogHelper.close(dlg); - }, options.timeout); - } + if (options.showCancel) { + html += '
'; + html += ''; + html += '
'; + } + html += '
'; - return new Promise(function (resolve, reject) { + dlg.innerHTML = html; - var isResolved; + if (layoutManager.tv) { + centerFocus(dlg.querySelector('.actionSheetScroller'), false, true); + } - dlg.addEventListener('click', function (e) { + let btnCloseActionSheet = dlg.querySelector('.btnCloseActionSheet'); + if (btnCloseActionSheet) { + btnCloseActionSheet.addEventListener('click', function () { + dialogHelper.close(dlg); + }); + } - var actionSheetMenuItem = dom.parentWithClass(e.target, 'actionSheetMenuItem'); + // Seeing an issue in some non-chrome browsers where this is requiring a double click + //var eventName = browser.firefox ? 'mousedown' : 'click'; + let selectedId; - if (actionSheetMenuItem) { - selectedId = actionSheetMenuItem.getAttribute('data-id'); + let timeout; + if (options.timeout) { + timeout = setTimeout(function () { + dialogHelper.close(dlg); + }, options.timeout); + } - if (options.resolveOnClick) { + return new Promise(function (resolve, reject) { - if (options.resolveOnClick.indexOf) { + let isResolved; - if (options.resolveOnClick.indexOf(selectedId) !== -1) { + dlg.addEventListener('click', function (e) { - resolve(selectedId); - isResolved = true; - } + const actionSheetMenuItem = dom.parentWithClass(e.target, 'actionSheetMenuItem'); + + if (actionSheetMenuItem) { + selectedId = actionSheetMenuItem.getAttribute('data-id'); + + if (options.resolveOnClick) { + + if (options.resolveOnClick.indexOf) { + + if (options.resolveOnClick.indexOf(selectedId) !== -1) { - } else { resolve(selectedId); isResolved = true; } - } - dialogHelper.close(dlg); - } - - }); - - dlg.addEventListener('close', function () { - - if (layoutManager.tv) { - centerFocus(dlg.querySelector('.actionSheetScroller'), false, false); - } - - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - - if (!isResolved) { - if (selectedId != null) { - if (options.callback) { - options.callback(selectedId); - } - - resolve(selectedId); } else { - reject(); + resolve(selectedId); + isResolved = true; } } - }); - dialogHelper.open(dlg); + dialogHelper.close(dlg); + } - var pos = options.positionTo && dialogOptions.size !== 'fullscreen' ? getPosition(options, dlg) : null; + }); - if (pos) { - dlg.style.position = 'fixed'; - dlg.style.margin = 0; - dlg.style.left = pos.left + 'px'; - dlg.style.top = pos.top + 'px'; + dlg.addEventListener('close', function () { + + if (layoutManager.tv) { + centerFocus(dlg.querySelector('.actionSheetScroller'), false, false); + } + + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + + if (!isResolved) { + if (selectedId != null) { + if (options.callback) { + options.callback(selectedId); + } + + resolve(selectedId); + } else { + reject(); + } } }); - } - return { - show: show - }; -}); + dialogHelper.open(dlg); + + const pos = options.positionTo && dialogOptions.size !== 'fullscreen' ? getPosition(options, dlg) : null; + + if (pos) { + dlg.style.position = 'fixed'; + dlg.style.margin = 0; + dlg.style.left = pos.left + 'px'; + dlg.style.top = pos.top + 'px'; + } + }); +} + +export default { + show: show +}; diff --git a/src/components/activitylog.js b/src/components/activitylog.js index 62eda74d5..a7b3f48bc 100644 --- a/src/components/activitylog.js +++ b/src/components/activitylog.js @@ -1,59 +1,59 @@ -define(["events", "globalize", "dom", "date-fns", "dfnshelper", "userSettings", "serverNotifications", "connectionManager", "emby-button", "listViewStyle"], function (events, globalize, dom, datefns, dfnshelper, userSettings, serverNotifications, connectionManager) { - "use strict"; +define(['events', 'globalize', 'dom', 'date-fns', 'dfnshelper', 'userSettings', 'serverNotifications', 'connectionManager', 'emby-button', 'listViewStyle'], function (events, globalize, dom, datefns, dfnshelper, userSettings, serverNotifications, connectionManager) { + 'use strict'; function getEntryHtml(entry, apiClient) { - var html = ""; + var html = ''; html += '
'; - var color = "#00a4dc"; - var icon = "notifications"; + var color = '#00a4dc'; + var icon = 'notifications'; - if ("Error" == entry.Severity || "Fatal" == entry.Severity || "Warn" == entry.Severity) { - color = "#cc0000"; - icon = "notification_important"; + if ('Error' == entry.Severity || 'Fatal' == entry.Severity || 'Warn' == entry.Severity) { + color = '#cc0000'; + icon = 'notification_important'; } if (entry.UserId && entry.UserPrimaryImageTag) { - html += 'dvr"; + }) + "');background-repeat:no-repeat;background-position:center center;background-size: cover;\">"; } else { - html += '' + icon + ''; + html += ''; } html += '
'; html += '
'; html += entry.Name; - html += "
"; + html += '
'; html += '
'; html += datefns.formatRelative(Date.parse(entry.Date), Date.parse(new Date()), { locale: dfnshelper.getLocale() }); - html += "
"; + html += '
'; html += '
'; - html += entry.ShortOverview || ""; - html += "
"; - html += "
"; + html += entry.ShortOverview || ''; + html += '
'; + html += '
'; if (entry.Overview) { - html += ''; + html += ''; } - return html += "
"; + return html += '
'; } function renderList(elem, apiClient, result, startIndex, limit) { elem.innerHTML = result.Items.map(function (i) { return getEntryHtml(i, apiClient); - }).join(""); + }).join(''); } function reloadData(instance, elem, apiClient, startIndex, limit) { if (null == startIndex) { - startIndex = parseInt(elem.getAttribute("data-activitystartindex") || "0"); + startIndex = parseInt(elem.getAttribute('data-activitystartindex') || '0'); } - limit = limit || parseInt(elem.getAttribute("data-activitylimit") || "7"); + limit = limit || parseInt(elem.getAttribute('data-activitylimit') || '7'); var minDate = new Date(); - var hasUserId = "false" !== elem.getAttribute("data-useractivity"); + var hasUserId = 'false' !== elem.getAttribute('data-useractivity'); if (hasUserId) { minDate.setTime(minDate.getTime() - 24 * 60 * 60 * 1000); // one day back @@ -61,22 +61,22 @@ define(["events", "globalize", "dom", "date-fns", "dfnshelper", "userSettings", minDate.setTime(minDate.getTime() - 7 * 24 * 60 * 60 * 1000); // one week back } - ApiClient.getJSON(ApiClient.getUrl("System/ActivityLog/Entries", { + ApiClient.getJSON(ApiClient.getUrl('System/ActivityLog/Entries', { startIndex: startIndex, limit: limit, minDate: minDate.toISOString(), hasUserId: hasUserId })).then(function (result) { - elem.setAttribute("data-activitystartindex", startIndex); - elem.setAttribute("data-activitylimit", limit); + elem.setAttribute('data-activitystartindex', startIndex); + elem.setAttribute('data-activitylimit', limit); if (!startIndex) { - var activityContainer = dom.parentWithClass(elem, "activityContainer"); + var activityContainer = dom.parentWithClass(elem, 'activityContainer'); if (activityContainer) { if (result.Items.length) { - activityContainer.classList.remove("hide"); + activityContainer.classList.remove('hide'); } else { - activityContainer.classList.add("hide"); + activityContainer.classList.add('hide'); } } } @@ -95,10 +95,10 @@ define(["events", "globalize", "dom", "date-fns", "dfnshelper", "userSettings", } function onListClick(e) { - var btnEntryInfo = dom.parentWithClass(e.target, "btnEntryInfo"); + var btnEntryInfo = dom.parentWithClass(e.target, 'btnEntryInfo'); if (btnEntryInfo) { - var id = btnEntryInfo.getAttribute("data-id"); + var id = btnEntryInfo.getAttribute('data-id'); var items = this.items; if (items) { @@ -114,7 +114,7 @@ define(["events", "globalize", "dom", "date-fns", "dfnshelper", "userSettings", } function showItemOverview(item) { - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert({ text: item.Overview }); @@ -124,28 +124,28 @@ define(["events", "globalize", "dom", "date-fns", "dfnshelper", "userSettings", function ActivityLog(options) { this.options = options; var element = options.element; - element.classList.add("activityLogListWidget"); - element.addEventListener("click", onListClick.bind(this)); + element.classList.add('activityLogListWidget'); + element.addEventListener('click', onListClick.bind(this)); var apiClient = connectionManager.getApiClient(options.serverId); reloadData(this, element, apiClient); var onUpdate = onActivityLogUpdate.bind(this); this.updateFn = onUpdate; - events.on(serverNotifications, "ActivityLogEntry", onUpdate); - apiClient.sendMessage("ActivityLogEntryStart", "0,1500"); + events.on(serverNotifications, 'ActivityLogEntry', onUpdate); + apiClient.sendMessage('ActivityLogEntryStart', '0,1500'); } ActivityLog.prototype.destroy = function () { var options = this.options; if (options) { - options.element.classList.remove("activityLogListWidget"); - connectionManager.getApiClient(options.serverId).sendMessage("ActivityLogEntryStop", "0,1500"); + options.element.classList.remove('activityLogListWidget'); + connectionManager.getApiClient(options.serverId).sendMessage('ActivityLogEntryStop', '0,1500'); } var onUpdate = this.updateFn; if (onUpdate) { - events.off(serverNotifications, "ActivityLogEntry", onUpdate); + events.off(serverNotifications, 'ActivityLogEntry', onUpdate); } this.items = null; diff --git a/src/components/alphapicker/alphapicker.js b/src/components/alphapicker/alphapicker.js index 455a43b46..79f74879e 100644 --- a/src/components/alphapicker/alphapicker.js +++ b/src/components/alphapicker/alphapicker.js @@ -67,7 +67,7 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b html += '
'; if (options.mode === 'keyboard') { - html += ''; + html += ''; } else { letters = ['#']; html += mapLetters(letters, vertical).join(''); @@ -77,7 +77,7 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b html += mapLetters(letters, vertical).join(''); if (options.mode === 'keyboard') { - html += ''; + html += ''; html += '
'; letters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; @@ -132,7 +132,7 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b if (alphaPickerButton) { var value = alphaPickerButton.getAttribute('data-value'); - element.dispatchEvent(new CustomEvent("alphavalueclicked", { + element.dispatchEvent(new CustomEvent('alphavalueclicked', { cancelable: false, detail: { value: value @@ -262,7 +262,7 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b } if (applyValue) { - element.dispatchEvent(new CustomEvent("alphavaluechanged", { + element.dispatchEvent(new CustomEvent('alphavaluechanged', { cancelable: false, detail: { value: value diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 17b51b376..2e11ef88d 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -16,7 +16,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM show('/settings/settings.html'); }, showNowPlaying: function () { - show("/nowplaying.html"); + show('/nowplaying.html'); } }; @@ -201,7 +201,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM var apiClient = this; if (data.status === 403) { - if (data.errorCode === "ParentalControl") { + if (data.errorCode === 'ParentalControl') { var isCurrentAllowed = currentRouteInfo ? (currentRouteInfo.route.anonymous || currentRouteInfo.route.startup) : true; @@ -541,15 +541,15 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } function param(name, url) { - name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); - var regexS = "[\\?&]" + name + "=([^&#]*)"; - var regex = new RegExp(regexS, "i"); + name = name.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]'); + var regexS = '[\\?&]' + name + '=([^&#]*)'; + var regex = new RegExp(regexS, 'i'); var results = regex.exec(url || getWindowLocationSearch()); if (results == null) { - return ""; + return ''; } else { - return decodeURIComponent(results[1].replace(/\+/g, " ")); + return decodeURIComponent(results[1].replace(/\+/g, ' ')); } } diff --git a/src/components/apphost.js b/src/components/apphost.js index 2240aff52..75e8ba17f 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -1,17 +1,17 @@ -define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "globalize"], function (appSettings, browser, events, htmlMediaHelper, webSettings, globalize) { - "use strict"; +define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'globalize'], function (appSettings, browser, events, htmlMediaHelper, webSettings, globalize) { + 'use strict'; function getBaseProfileOptions(item) { var disableHlsVideoAudioCodecs = []; if (item && htmlMediaHelper.enableHlsJsPlayer(item.RunTimeTicks, item.MediaType)) { if (browser.edge || browser.msie) { - disableHlsVideoAudioCodecs.push("mp3"); + disableHlsVideoAudioCodecs.push('mp3'); } - disableHlsVideoAudioCodecs.push("ac3"); - disableHlsVideoAudioCodecs.push("eac3"); - disableHlsVideoAudioCodecs.push("opus"); + disableHlsVideoAudioCodecs.push('ac3'); + disableHlsVideoAudioCodecs.push('eac3'); + disableHlsVideoAudioCodecs.push('opus'); } return { @@ -22,7 +22,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g function getDeviceProfileForWindowsUwp(item) { return new Promise(function (resolve, reject) { - require(["browserdeviceprofile", "environments/windows-uwp/mediacaps"], function (profileBuilder, uwpMediaCaps) { + require(['browserdeviceprofile', 'environments/windows-uwp/mediacaps'], function (profileBuilder, uwpMediaCaps) { var profileOptions = getBaseProfileOptions(item); profileOptions.supportsDts = uwpMediaCaps.supportsDTS(); profileOptions.supportsTrueHd = uwpMediaCaps.supportsDolby(); @@ -40,26 +40,15 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g } return new Promise(function (resolve) { - require(["browserdeviceprofile"], function (profileBuilder) { + require(['browserdeviceprofile'], function (profileBuilder) { var profile; if (window.NativeShell) { profile = window.NativeShell.AppHost.getDeviceProfile(profileBuilder); } else { - profile = profileBuilder(getBaseProfileOptions(item)); - - if (item && !options.isRetry && "allcomplexformats" !== appSettings.get("subtitleburnin")) { - if (!browser.orsay && !browser.tizen) { - profile.SubtitleProfiles.push({ - Format: "ass", - Method: "External" - }); - profile.SubtitleProfiles.push({ - Format: "ssa", - Method: "External" - }); - } - } + var builderOpts = getBaseProfileOptions(item); + builderOpts.enableSsaRender = (item && !options.isRetry && 'allcomplexformats' !== appSettings.get('subtitleburnin')); + profile = profileBuilder(builderOpts); } resolve(profile); @@ -68,12 +57,12 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g } function escapeRegExp(str) { - return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); + return str.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, '\\$1'); } function replaceAll(originalString, strReplace, strWith) { var strReplace2 = escapeRegExp(strReplace); - var reg = new RegExp(strReplace2, "ig"); + var reg = new RegExp(strReplace2, 'ig'); return originalString.replace(reg, strWith); } @@ -81,7 +70,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g var keys = []; if (keys.push(navigator.userAgent), keys.push(new Date().getTime()), self.btoa) { - var result = replaceAll(btoa(keys.join("|")), "=", "1"); + var result = replaceAll(btoa(keys.join('|')), '=', '1'); return Promise.resolve(result); } @@ -89,7 +78,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g } function getDeviceId() { - var key = "_deviceId2"; + var key = '_deviceId2'; var deviceId = appSettings.get(key); if (deviceId) { @@ -104,16 +93,16 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g function getDeviceName() { var deviceName; - deviceName = browser.tizen ? "Samsung Smart TV" : browser.web0s ? "LG Smart TV" : browser.operaTv ? "Opera TV" : browser.xboxOne ? "Xbox One" : browser.ps4 ? "Sony PS4" : browser.chrome ? "Chrome" : browser.edge ? "Edge" : browser.firefox ? "Firefox" : browser.msie ? "Internet Explorer" : browser.opera ? "Opera" : browser.safari ? "Safari" : "Web Browser"; + deviceName = browser.tizen ? 'Samsung Smart TV' : browser.web0s ? 'LG Smart TV' : browser.operaTv ? 'Opera TV' : browser.xboxOne ? 'Xbox One' : browser.ps4 ? 'Sony PS4' : browser.chrome ? 'Chrome' : browser.edge ? 'Edge' : browser.firefox ? 'Firefox' : browser.msie ? 'Internet Explorer' : browser.opera ? 'Opera' : browser.safari ? 'Safari' : 'Web Browser'; if (browser.ipad) { - deviceName += " iPad"; + deviceName += ' iPad'; } else { if (browser.iphone) { - deviceName += " iPhone"; + deviceName += ' iPhone'; } else { if (browser.android) { - deviceName += " Android"; + deviceName += ' Android'; } } } @@ -135,12 +124,12 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g } var element = document.documentElement; - return (element.requestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen || element.msRequestFullscreen) || document.createElement("video").webkitEnterFullscreen; + return (element.requestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen || element.msRequestFullscreen) || document.createElement('video').webkitEnterFullscreen; } function getSyncProfile() { return new Promise(function (resolve) { - require(["browserdeviceprofile", "appSettings"], function (profileBuilder, appSettings) { + require(['browserdeviceprofile', 'appSettings'], function (profileBuilder, appSettings) { var profile; if (window.NativeShell) { @@ -156,7 +145,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g } function getDefaultLayout() { - return "desktop"; + return 'desktop'; } function supportsHtmlMediaAutoplay() { @@ -173,20 +162,20 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g function supportsCue() { try { - var video = document.createElement("video"); - var style = document.createElement("style"); + var video = document.createElement('video'); + var style = document.createElement('style'); - style.textContent = "video::cue {background: inherit}"; + style.textContent = 'video::cue {background: inherit}'; document.body.appendChild(style); document.body.appendChild(video); - var cue = window.getComputedStyle(video, "::cue").background; + var cue = window.getComputedStyle(video, '::cue').background; document.body.removeChild(style); document.body.removeChild(video); return !!cue.length; } catch (err) { - console.error("error detecting cue support: " + err); + console.error('error detecting cue support: ' + err); return false; } } @@ -194,15 +183,15 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g function onAppVisible() { if (isHidden) { isHidden = false; - console.debug("triggering app resume event"); - events.trigger(appHost, "resume"); + console.debug('triggering app resume event'); + events.trigger(appHost, 'resume'); } } function onAppHidden() { if (!isHidden) { isHidden = true; - console.debug("app is hidden"); + console.debug('app is hidden'); } } @@ -210,88 +199,88 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g var features = []; if (navigator.share) { - features.push("sharing"); + features.push('sharing'); } if (!browser.edgeUwp && !browser.tv && !browser.xboxOne && !browser.ps4) { - features.push("filedownload"); + features.push('filedownload'); } if (browser.operaTv || browser.tizen || browser.orsay || browser.web0s) { - features.push("exit"); + features.push('exit'); } else { - features.push("exitmenu"); - features.push("plugins"); + features.push('exitmenu'); + features.push('plugins'); } if (!browser.operaTv && !browser.tizen && !browser.orsay && !browser.web0s && !browser.ps4) { - features.push("externallinks"); - features.push("externalpremium"); + features.push('externallinks'); + features.push('externalpremium'); } if (!browser.operaTv) { - features.push("externallinkdisplay"); + features.push('externallinkdisplay'); } if (supportsVoiceInput()) { - features.push("voiceinput"); + features.push('voiceinput'); } if (supportsHtmlMediaAutoplay()) { - features.push("htmlaudioautoplay"); - features.push("htmlvideoautoplay"); + features.push('htmlaudioautoplay'); + features.push('htmlvideoautoplay'); } if (browser.edgeUwp) { - features.push("sync"); + features.push('sync'); } if (supportsFullscreen()) { - features.push("fullscreenchange"); + features.push('fullscreenchange'); } if (browser.chrome || browser.edge && !browser.slow) { if (!browser.noAnimation && !browser.edgeUwp && !browser.xboxOne) { - features.push("imageanalysis"); + features.push('imageanalysis'); } } if (browser.tv || browser.xboxOne || browser.ps4 || browser.mobile) { - features.push("physicalvolumecontrol"); + features.push('physicalvolumecontrol'); } if (!browser.tv && !browser.xboxOne && !browser.ps4) { - features.push("remotecontrol"); + features.push('remotecontrol'); } if (!browser.operaTv && !browser.tizen && !browser.orsay && !browser.web0s && !browser.edgeUwp) { - features.push("remotevideo"); + features.push('remotevideo'); } - features.push("displaylanguage"); - features.push("otherapppromotions"); - features.push("displaymode"); - features.push("targetblank"); - features.push("screensaver"); + features.push('displaylanguage'); + features.push('otherapppromotions'); + features.push('displaymode'); + features.push('targetblank'); + features.push('screensaver'); webSettings.enableMultiServer().then(enabled => { - if (enabled) features.push("multiserver"); + if (enabled) features.push('multiserver'); }); if (!browser.orsay && !browser.msie && (browser.firefox || browser.ps4 || browser.edge || supportsCue())) { - features.push("subtitleappearancesettings"); + features.push('subtitleappearancesettings'); } if (!browser.orsay) { - features.push("subtitleburnsettings"); + features.push('subtitleburnsettings'); } if (!browser.tv && !browser.ps4 && !browser.xboxOne) { - features.push("fileinput"); + features.push('fileinput'); } if (browser.chrome) { - features.push("chromecast"); + features.push('chromecast'); } return features; @@ -312,7 +301,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g window.close(); } } catch (err) { - console.error("error closing application: " + err); + console.error('error closing application: ' + err); } } @@ -326,15 +315,15 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g return; } - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { exitPromise = actionsheet.show({ - title: globalize.translate("MessageConfirmAppExit"), + title: globalize.translate('MessageConfirmAppExit'), items: [ - {id: "yes", name: globalize.translate("Yes")}, - {id: "no", name: globalize.translate("No")} + {id: 'yes', name: globalize.translate('Yes')}, + {id: 'no', name: globalize.translate('No')} ] }).then(function (value) { - if (value === "yes") { + if (value === 'yes') { doExit(); } }).finally(function () { @@ -345,15 +334,15 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g var deviceId; var deviceName; - var appName = "Jellyfin Web"; - var appVersion = "10.6.0"; + var appName = 'Jellyfin Web'; + var appVersion = '10.6.0'; var appHost = { getWindowState: function () { - return document.windowState || "Normal"; + return document.windowState || 'Normal'; }, setWindowState: function (state) { - alert("setWindowState is not supported and should not be called"); + alert('setWindowState is not supported and should not be called'); }, exit: function () { if (!!window.appMode && browser.tizen) { @@ -370,6 +359,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g return -1 !== supportedFeatures.indexOf(command.toLowerCase()); }, preferVisualCards: browser.android || browser.chrome, + moreIcon: browser.android ? 'more_vert' : 'more_horiz', getSyncProfile: getSyncProfile, getDefaultLayout: function () { if (window.NativeShell) { @@ -405,16 +395,16 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g return {}; }, setThemeColor: function (color) { - var metaThemeColor = document.querySelector("meta[name=theme-color]"); + var metaThemeColor = document.querySelector('meta[name=theme-color]'); if (metaThemeColor) { - metaThemeColor.setAttribute("content", color); + metaThemeColor.setAttribute('content', color); } }, setUserScalable: function (scalable) { if (!browser.tv) { - var att = scalable ? "width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes" : "width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"; - document.querySelector("meta[name=viewport]").setAttribute("content", att); + var att = scalable ? 'width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes' : 'width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no'; + document.querySelector('meta[name=viewport]').setAttribute('content', att); } } }; @@ -423,12 +413,12 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g var hidden; var visibilityChange; - if (typeof document.hidden !== "undefined") { /* eslint-disable-line compat/compat */ - hidden = "hidden"; - visibilityChange = "visibilitychange"; - } else if (typeof document.webkitHidden !== "undefined") { - hidden = "webkitHidden"; - visibilityChange = "webkitvisibilitychange"; + if (typeof document.hidden !== 'undefined') { /* eslint-disable-line compat/compat */ + hidden = 'hidden'; + visibilityChange = 'visibilitychange'; + } else if (typeof document.webkitHidden !== 'undefined') { + hidden = 'webkitHidden'; + visibilityChange = 'webkitvisibilitychange'; } document.addEventListener(visibilityChange, function () { @@ -441,8 +431,8 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings", "g }, false); if (self.addEventListener) { - self.addEventListener("focus", onAppVisible); - self.addEventListener("blur", onAppHidden); + self.addEventListener('focus', onAppVisible); + self.addEventListener('blur', onAppHidden); } return appHost; diff --git a/src/components/autoFocuser.js b/src/components/autoFocuser.js index 43c341bfd..0a10cabd2 100644 --- a/src/components/autoFocuser.js +++ b/src/components/autoFocuser.js @@ -5,8 +5,8 @@ * @module components/autoFocuser */ -import focusManager from "focusManager"; -import layoutManager from "layoutManager"; +import focusManager from 'focusManager'; +import layoutManager from 'layoutManager'; /** * Previously selected element. @@ -28,11 +28,11 @@ import layoutManager from "layoutManager"; return; } - window.addEventListener("focusin", function (e) { + window.addEventListener('focusin', function (e) { activeElement = e.target; }); - console.debug("AutoFocuser enabled"); + console.debug('AutoFocuser enabled'); } /** @@ -51,21 +51,21 @@ import layoutManager from "layoutManager"; if (activeElement) { // These elements are recreated - if (activeElement.classList.contains("btnPreviousPage")) { - candidates.push(container.querySelector(".btnPreviousPage")); - candidates.push(container.querySelector(".btnNextPage")); - } else if (activeElement.classList.contains("btnNextPage")) { - candidates.push(container.querySelector(".btnNextPage")); - candidates.push(container.querySelector(".btnPreviousPage")); - } else if (activeElement.classList.contains("btnSelectView")) { - candidates.push(container.querySelector(".btnSelectView")); + if (activeElement.classList.contains('btnPreviousPage')) { + candidates.push(container.querySelector('.btnPreviousPage')); + candidates.push(container.querySelector('.btnNextPage')); + } else if (activeElement.classList.contains('btnNextPage')) { + candidates.push(container.querySelector('.btnNextPage')); + candidates.push(container.querySelector('.btnPreviousPage')); + } else if (activeElement.classList.contains('btnSelectView')) { + candidates.push(container.querySelector('.btnSelectView')); } candidates.push(activeElement); } - candidates = candidates.concat(Array.from(container.querySelectorAll(".btnResume"))); - candidates = candidates.concat(Array.from(container.querySelectorAll(".btnPlay"))); + candidates = candidates.concat(Array.from(container.querySelectorAll('.btnResume'))); + candidates = candidates.concat(Array.from(container.querySelectorAll('.btnPlay'))); let focusedElement; @@ -81,7 +81,7 @@ import layoutManager from "layoutManager"; if (!focusedElement) { // FIXME: Multiple itemsContainers - const itemsContainer = container.querySelector(".itemsContainer"); + const itemsContainer = container.querySelector('.itemsContainer'); if (itemsContainer) { focusedElement = focusManager.autoFocus(itemsContainer); diff --git a/src/components/backdrop/backdrop.js b/src/components/backdrop/backdrop.js index ec5b41185..c15e35524 100644 --- a/src/components/backdrop/backdrop.js +++ b/src/components/backdrop/backdrop.js @@ -1,4 +1,4 @@ -define(['browser', 'connectionManager', 'playbackManager', 'dom', "userSettings", 'css!./backdrop'], function (browser, connectionManager, playbackManager, dom, userSettings) { +define(['browser', 'connectionManager', 'playbackManager', 'dom', 'userSettings', 'css!./backdrop'], function (browser, connectionManager, playbackManager, dom, userSettings) { 'use strict'; function enableAnimation(elem) { @@ -180,7 +180,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', "userSettings" if (item.BackdropImageTags && item.BackdropImageTags.length > 0) { return item.BackdropImageTags.map(function (imgTag, index) { return apiClient.getScaledImageUrl(item.BackdropItemId || item.Id, Object.assign(imageOptions, { - type: "Backdrop", + type: 'Backdrop', tag: imgTag, maxWidth: dom.getScreenWidth(), index: index @@ -191,7 +191,7 @@ define(['browser', 'connectionManager', 'playbackManager', 'dom', "userSettings" if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { return item.ParentBackdropImageTags.map(function (imgTag, index) { return apiClient.getScaledImageUrl(item.ParentBackdropItemId, Object.assign(imageOptions, { - type: "Backdrop", + type: 'Backdrop', tag: imgTag, maxWidth: dom.getScreenWidth(), index: index diff --git a/src/components/backdropscreensaver/plugin.js b/src/components/backdropscreensaver/plugin.js index 55de27a13..dc0a906dd 100644 --- a/src/components/backdropscreensaver/plugin.js +++ b/src/components/backdropscreensaver/plugin.js @@ -1,12 +1,12 @@ -define(["connectionManager"], function (connectionManager) { +define(['connectionManager'], function (connectionManager) { return function () { var self = this; - self.name = "Backdrop ScreenSaver"; - self.type = "screensaver"; - self.id = "backdropscreensaver"; + self.name = 'Backdrop ScreenSaver'; + self.type = 'screensaver'; + self.id = 'backdropscreensaver'; self.supportsAnonymous = false; var currentSlideshow; @@ -14,12 +14,12 @@ define(["connectionManager"], function (connectionManager) { self.show = function () { var query = { - ImageTypes: "Backdrop", - EnableImageTypes: "Backdrop", - IncludeItemTypes: "Movie,Series,MusicArtist", - SortBy: "Random", + ImageTypes: 'Backdrop', + EnableImageTypes: 'Backdrop', + IncludeItemTypes: 'Movie,Series,MusicArtist', + SortBy: 'Random', Recursive: true, - Fields: "Taglines", + Fields: 'Taglines', ImageTypeLimit: 1, StartIndex: 0, Limit: 200 @@ -30,7 +30,7 @@ define(["connectionManager"], function (connectionManager) { if (result.Items.length) { - require(["slideshow"], function (slideshow) { + require(['slideshow'], function (slideshow) { var newSlideShow = new slideshow({ showTitle: true, diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index f875e8e80..43ca28f01 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -286,7 +286,7 @@ import 'programStyles'; * @param {Object} options - Options for handling the items. */ function setCardData(items, options) { - options.shape = options.shape || "auto"; + options.shape = options.shape || 'auto'; const primaryImageAspectRatio = imageLoader.getPrimaryImageAspectRatio(items); @@ -509,7 +509,7 @@ import 'programStyles'; if (options.preferThumb && item.ImageTags && item.ImageTags.Thumb) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Thumb", + type: 'Thumb', maxWidth: width, tag: item.ImageTags.Thumb }); @@ -517,7 +517,7 @@ import 'programStyles'; } else if ((options.preferBanner || shape === 'banner') && item.ImageTags && item.ImageTags.Banner) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Banner", + type: 'Banner', maxWidth: width, tag: item.ImageTags.Banner }); @@ -525,7 +525,7 @@ import 'programStyles'; } else if (options.preferDisc && item.ImageTags && item.ImageTags.Disc) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Disc", + type: 'Disc', maxWidth: width, tag: item.ImageTags.Disc }); @@ -533,7 +533,7 @@ import 'programStyles'; } else if (options.preferLogo && item.ImageTags && item.ImageTags.Logo) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Logo", + type: 'Logo', maxWidth: width, tag: item.ImageTags.Logo }); @@ -541,7 +541,7 @@ import 'programStyles'; } else if (options.preferLogo && item.ParentLogoImageTag && item.ParentLogoItemId) { imgUrl = apiClient.getScaledImageUrl(item.ParentLogoItemId, { - type: "Logo", + type: 'Logo', maxWidth: width, tag: item.ParentLogoImageTag }); @@ -549,7 +549,7 @@ import 'programStyles'; } else if (options.preferThumb && item.SeriesThumbImageTag && options.inheritThumb !== false) { imgUrl = apiClient.getScaledImageUrl(item.SeriesId, { - type: "Thumb", + type: 'Thumb', maxWidth: width, tag: item.SeriesThumbImageTag }); @@ -557,7 +557,7 @@ import 'programStyles'; } else if (options.preferThumb && item.ParentThumbItemId && options.inheritThumb !== false && item.MediaType !== 'Photo') { imgUrl = apiClient.getScaledImageUrl(item.ParentThumbItemId, { - type: "Thumb", + type: 'Thumb', maxWidth: width, tag: item.ParentThumbImageTag }); @@ -565,7 +565,7 @@ import 'programStyles'; } else if (options.preferThumb && item.BackdropImageTags && item.BackdropImageTags.length) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Backdrop", + type: 'Backdrop', maxWidth: width, tag: item.BackdropImageTags[0] }); @@ -575,7 +575,7 @@ import 'programStyles'; } else if (options.preferThumb && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length && options.inheritThumb !== false && item.Type === 'Episode') { imgUrl = apiClient.getScaledImageUrl(item.ParentBackdropItemId, { - type: "Backdrop", + type: 'Backdrop', maxWidth: width, tag: item.ParentBackdropImageTags[0] }); @@ -585,7 +585,7 @@ import 'programStyles'; height = width && primaryImageAspectRatio ? Math.round(width / primaryImageAspectRatio) : null; imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Primary", + type: 'Primary', maxHeight: height, maxWidth: width, tag: item.ImageTags.Primary @@ -607,7 +607,7 @@ import 'programStyles'; height = width && primaryImageAspectRatio ? Math.round(width / primaryImageAspectRatio) : null; imgUrl = apiClient.getScaledImageUrl(item.PrimaryImageItemId || item.Id || item.ItemId, { - type: "Primary", + type: 'Primary', maxHeight: height, maxWidth: width, tag: item.PrimaryImageTag @@ -626,14 +626,14 @@ import 'programStyles'; } else if (item.ParentPrimaryImageTag) { imgUrl = apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId, { - type: "Primary", + type: 'Primary', maxWidth: width, tag: item.ParentPrimaryImageTag }); } else if (item.SeriesPrimaryImageTag) { imgUrl = apiClient.getScaledImageUrl(item.SeriesId, { - type: "Primary", + type: 'Primary', maxWidth: width, tag: item.SeriesPrimaryImageTag }); @@ -642,7 +642,7 @@ import 'programStyles'; height = width && primaryImageAspectRatio ? Math.round(width / primaryImageAspectRatio) : null; imgUrl = apiClient.getScaledImageUrl(item.AlbumId, { - type: "Primary", + type: 'Primary', maxHeight: height, maxWidth: width, tag: item.AlbumPrimaryImageTag @@ -657,7 +657,7 @@ import 'programStyles'; } else if (item.Type === 'Season' && item.ImageTags && item.ImageTags.Thumb) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Thumb", + type: 'Thumb', maxWidth: width, tag: item.ImageTags.Thumb }); @@ -665,7 +665,7 @@ import 'programStyles'; } else if (item.BackdropImageTags && item.BackdropImageTags.length) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Backdrop", + type: 'Backdrop', maxWidth: width, tag: item.BackdropImageTags[0] }); @@ -673,7 +673,7 @@ import 'programStyles'; } else if (item.ImageTags && item.ImageTags.Thumb) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Thumb", + type: 'Thumb', maxWidth: width, tag: item.ImageTags.Thumb }); @@ -681,7 +681,7 @@ import 'programStyles'; } else if (item.SeriesThumbImageTag && options.inheritThumb !== false) { imgUrl = apiClient.getScaledImageUrl(item.SeriesId, { - type: "Thumb", + type: 'Thumb', maxWidth: width, tag: item.SeriesThumbImageTag }); @@ -689,7 +689,7 @@ import 'programStyles'; } else if (item.ParentThumbItemId && options.inheritThumb !== false) { imgUrl = apiClient.getScaledImageUrl(item.ParentThumbItemId, { - type: "Thumb", + type: 'Thumb', maxWidth: width, tag: item.ParentThumbImageTag }); @@ -697,7 +697,7 @@ import 'programStyles'; } else if (item.ParentBackdropImageTags && item.ParentBackdropImageTags.length && options.inheritThumb !== false) { imgUrl = apiClient.getScaledImageUrl(item.ParentBackdropItemId, { - type: "Backdrop", + type: 'Backdrop', maxWidth: width, tag: item.ParentBackdropImageTags[0] }); @@ -778,7 +778,7 @@ import 'programStyles'; if (text) { html += "
"; html += text; - html += "
"; + html += '

'; valid++; if (maxLines && valid >= maxLines) { @@ -835,7 +835,7 @@ import 'programStyles'; airTimeText += ' - ' + datetime.getDisplayTime(date); } } catch (e) { - console.error("error parsing date: " + item.StartDate); + console.error('error parsing date: ' + item.StartDate); } } @@ -869,11 +869,11 @@ import 'programStyles'; if (isOuterFooter && options.cardLayout && layoutManager.mobile) { if (options.cardFooterAside !== 'none') { - html += ''; + html += ''; } } - const cssClass = options.centerText ? "cardText cardTextCentered" : "cardText"; + const cssClass = options.centerText ? 'cardText cardTextCentered' : 'cardText'; const serverId = item.ServerId || options.serverId; let lines = []; @@ -907,7 +907,7 @@ import 'programStyles'; } } else { - const parentTitle = item.SeriesName || item.Series || item.Album || item.AlbumArtist || ""; + const parentTitle = item.SeriesName || item.Series || item.Album || item.AlbumArtist || ''; if (parentTitle || showTitle) { lines.push(parentTitle); @@ -946,7 +946,7 @@ import 'programStyles'; item.AlbumArtists[0].IsFolder = true; lines.push(getTextActionButton(item.AlbumArtists[0], null, serverId)); } else { - lines.push(isUsingLiveTvNaming(item) ? item.Name : (item.SeriesName || item.Series || item.Album || item.AlbumArtist || "")); + lines.push(isUsingLiveTvNaming(item) ? item.Name : (item.SeriesName || item.Series || item.Album || item.AlbumArtist || '')); } } @@ -993,7 +993,7 @@ import 'programStyles'; if (options.showYear || options.showSeriesYear) { if (item.Type === 'Series') { - if (item.Status === "Continuing") { + if (item.Status === 'Continuing') { lines.push(globalize.translate('SeriesYearToPresent', item.ProductionYear || '')); @@ -1105,7 +1105,7 @@ import 'programStyles'; html = '
' + html; //cardFooter - html += "
"; + html += ''; } } @@ -1191,7 +1191,7 @@ import 'programStyles'; counts.push(childText); } - } else if (item.Type === 'MusicGenre' || options.context === "MusicArtist") { + } else if (item.Type === 'MusicGenre' || options.context === 'MusicArtist') { if (item.AlbumCount) { @@ -1304,7 +1304,7 @@ import 'programStyles'; } if (options.cardClass) { - className += " " + options.cardClass; + className += ' ' + options.cardClass; } if (layoutManager.desktop) { @@ -1356,13 +1356,13 @@ import 'programStyles'; if (options.showChannelLogo && item.ChannelPrimaryImageTag) { logoUrl = apiClient.getScaledImageUrl(item.ChannelId, { - type: "Primary", + type: 'Primary', height: logoHeight, tag: item.ChannelPrimaryImageTag }); } else if (options.showLogo && item.ParentLogoImageTag) { logoUrl = apiClient.getScaledImageUrl(item.ParentLogoItemId, { - type: "Logo", + type: 'Logo', height: logoHeight, tag: item.ParentLogoImageTag }); @@ -1418,15 +1418,15 @@ import 'programStyles'; const btnCssClass = 'cardOverlayButton cardOverlayButton-br itemAction'; if (options.centerPlayButton) { - overlayButtons += ''; + overlayButtons += ''; } if (overlayPlayButton && !item.IsPlaceHolder && (item.LocationType !== 'Virtual' || !item.MediaType || item.Type === 'Program') && item.Type !== 'Person') { - overlayButtons += ''; + overlayButtons += ''; } if (options.overlayMoreButton) { - overlayButtons += ''; + overlayButtons += ''; } } @@ -1518,7 +1518,7 @@ import 'programStyles'; let actionAttribute; if (tagName === 'button') { - className += " itemAction"; + className += ' itemAction'; actionAttribute = ' data-action="' + action + '"'; } else { actionAttribute = ''; @@ -1560,7 +1560,7 @@ import 'programStyles'; const btnCssClass = 'cardOverlayButton cardOverlayButton-hover itemAction paper-icon-button-light'; if (playbackManager.canPlay(item)) { - html += ''; + html += ''; } html += '
'; @@ -1569,7 +1569,7 @@ import 'programStyles'; if (itemHelper.canMarkPlayed(item)) { require(['emby-playstatebutton']); - html += ''; + html += ''; } if (itemHelper.canRate(item)) { @@ -1577,10 +1577,10 @@ import 'programStyles'; const likes = userData.Likes == null ? '' : userData.Likes; require(['emby-ratingbutton']); - html += ''; + html += ''; } - html += ''; + html += ''; html += '
'; html += ''; @@ -1596,27 +1596,27 @@ import 'programStyles'; */ export function getDefaultText(item, options) { if (item.CollectionType) { - return ''; + return ''; } switch (item.Type) { case 'MusicAlbum': - return 'album'; + return ''; case 'MusicArtist': case 'Person': - return 'person'; + return ''; case 'Movie': - return 'movie'; + return ''; case 'Series': - return 'tv'; + return ''; case 'Book': - return 'book'; + return ''; case 'Folder': - return 'folder'; + return ''; } if (options && options.defaultCardImageIcon) { - return '' + options.defaultCardImageIcon + ''; + return ''; } const defaultName = isUsingLiveTvNaming(item) ? item.Name : itemHelper.getDisplayName(item); @@ -1718,7 +1718,7 @@ import 'programStyles'; indicatorsElem = ensureIndicators(card, indicatorsElem); indicatorsElem.appendChild(playedIndicator); } - playedIndicator.innerHTML = 'check'; + playedIndicator.innerHTML = ''; } else { playedIndicator = card.querySelector('.playedIndicator'); @@ -1808,7 +1808,7 @@ import 'programStyles'; const icon = cell.querySelector('.timerIndicator'); if (!icon) { const indicatorsElem = ensureIndicators(cell); - indicatorsElem.insertAdjacentHTML('beforeend', ''); + indicatorsElem.insertAdjacentHTML('beforeend', ''); } cell.setAttribute('data-timerid', newTimerId); } diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index 16326b6c5..eae60574b 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -70,7 +70,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse maxWidth: maxWidth * 2, tag: chapter.ImageTag, - type: "Chapter", + type: 'Chapter', index: index }); } @@ -90,7 +90,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse var cardImageContainer = imgUrl ? ('
') : ('
'); if (!imgUrl) { - cardImageContainer += ''; + cardImageContainer += ''; } var nameHtml = ''; diff --git a/src/components/castSenderApi.js b/src/components/castSenderApi.js index a1e7bd875..b541c1f87 100644 --- a/src/components/castSenderApi.js +++ b/src/components/castSenderApi.js @@ -1,7 +1,7 @@ define([], function() { 'use strict'; - if (window.appMode === "cordova" || window.appMode === "android") { + if (window.appMode === 'cordova' || window.appMode === 'android') { return { load: function () { window.chrome = window.chrome || {}; @@ -17,16 +17,16 @@ define([], function() { } return new Promise(function (resolve, reject) { - var fileref = document.createElement("script"); - fileref.setAttribute("type", "text/javascript"); + var fileref = document.createElement('script'); + fileref.setAttribute('type', 'text/javascript'); fileref.onload = function () { ccLoaded = true; resolve(); }; - fileref.setAttribute("src", "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js"); - document.querySelector("head").appendChild(fileref); + fileref.setAttribute('src', 'https://www.gstatic.com/cv/js/sender/v1/cast_sender.js'); + document.querySelector('head').appendChild(fileref); }); } }; diff --git a/src/components/channelmapper/channelmapper.js b/src/components/channelmapper/channelmapper.js index 2ea7a3a13..83ae4d09c 100644 --- a/src/components/channelmapper/channelmapper.js +++ b/src/components/channelmapper/channelmapper.js @@ -1,33 +1,33 @@ -define(["dom", "dialogHelper", "loading", "connectionManager", "globalize", "actionsheet", "emby-input", "paper-icon-button-light", "emby-button", "listViewStyle", "material-icons", "formDialogStyle"], function (dom, dialogHelper, loading, connectionManager, globalize, actionsheet) { - "use strict"; +define(['dom', 'dialogHelper', 'loading', 'connectionManager', 'globalize', 'actionsheet', 'emby-input', 'paper-icon-button-light', 'emby-button', 'listViewStyle', 'material-icons', 'formDialogStyle'], function (dom, dialogHelper, loading, connectionManager, globalize, actionsheet) { + 'use strict'; return function (options) { function mapChannel(button, channelId, providerChannelId) { loading.show(); var providerId = options.providerId; connectionManager.getApiClient(options.serverId).ajax({ - type: "POST", - url: ApiClient.getUrl("LiveTv/ChannelMappings"), + type: 'POST', + url: ApiClient.getUrl('LiveTv/ChannelMappings'), data: { providerId: providerId, tunerChannelId: channelId, providerChannelId: providerChannelId }, - dataType: "json" + dataType: 'json' }).then(function (mapping) { - var listItem = dom.parentWithClass(button, "listItem"); - button.setAttribute("data-providerid", mapping.ProviderChannelId); - listItem.querySelector(".secondary").innerHTML = getMappingSecondaryName(mapping, currentMappingOptions.ProviderName); + var listItem = dom.parentWithClass(button, 'listItem'); + button.setAttribute('data-providerid', mapping.ProviderChannelId); + listItem.querySelector('.secondary').innerHTML = getMappingSecondaryName(mapping, currentMappingOptions.ProviderName); loading.hide(); }); } function onChannelsElementClick(e) { - var btnMap = dom.parentWithClass(e.target, "btnMap"); + var btnMap = dom.parentWithClass(e.target, 'btnMap'); if (btnMap) { - var channelId = btnMap.getAttribute("data-id"); - var providerChannelId = btnMap.getAttribute("data-providerid"); + var channelId = btnMap.getAttribute('data-id'); + var providerChannelId = btnMap.getAttribute('data-providerid'); var menuItems = currentMappingOptions.ProviderChannels.map(function (m) { return { name: m.Name, @@ -48,56 +48,56 @@ define(["dom", "dialogHelper", "loading", "connectionManager", "globalize", "act function getChannelMappingOptions(serverId, providerId) { var apiClient = connectionManager.getApiClient(serverId); - return apiClient.getJSON(apiClient.getUrl("LiveTv/ChannelMappingOptions", { + return apiClient.getJSON(apiClient.getUrl('LiveTv/ChannelMappingOptions', { providerId: providerId })); } function getMappingSecondaryName(mapping, providerName) { - return (mapping.ProviderChannelName || "") + " - " + providerName; + return (mapping.ProviderChannelName || '') + ' - ' + providerName; } function getTunerChannelHtml(channel, providerName) { - var html = ""; + var html = ''; html += '
'; - html += 'dvr'; + html += ''; html += '
'; html += '

'; html += channel.Name; - html += "

"; + html += ''; html += '
'; if (channel.ProviderChannelName) { html += getMappingSecondaryName(channel, providerName); } - html += "
"; - html += "
"; - html += ''; - return html += "
"; + html += '
'; + html += '
'; + html += ''; + return html += ''; } function getEditorHtml() { - var html = ""; + var html = ''; html += '
'; html += '
'; html += ''; - html += "

" + globalize.translate("HeaderChannels") + "

"; + html += '

' + globalize.translate('HeaderChannels') + '

'; html += '
'; - html += "
"; - html += ""; - html += "
"; - return html += "
"; + html += ''; + html += ''; + html += ''; + return html += ''; } function initEditor(dlg, options) { getChannelMappingOptions(options.serverId, options.providerId).then(function (result) { currentMappingOptions = result; - var channelsElement = dlg.querySelector(".channels"); + var channelsElement = dlg.querySelector('.channels'); channelsElement.innerHTML = result.TunerChannels.map(function (channel) { return getTunerChannelHtml(channel, result.ProviderName); - }).join(""); - channelsElement.addEventListener("click", onChannelsElementClick); + }).join(''); + channelsElement.addEventListener('click', onChannelsElementClick); }); } @@ -108,27 +108,27 @@ define(["dom", "dialogHelper", "loading", "connectionManager", "globalize", "act var dialogOptions = { removeOnClose: true }; - dialogOptions.size = "small"; + dialogOptions.size = 'small'; var dlg = dialogHelper.createDialog(dialogOptions); - dlg.classList.add("formDialog"); - dlg.classList.add("ui-body-a"); - dlg.classList.add("background-theme-a"); - var html = ""; - var title = globalize.translate("MapChannels"); + dlg.classList.add('formDialog'); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + var html = ''; + var title = globalize.translate('MapChannels'); html += '
'; - html += ''; + html += ''; html += '

'; html += title; - html += "

"; - html += "
"; + html += ''; + html += ''; html += getEditorHtml(); dlg.innerHTML = html; initEditor(dlg, options); - dlg.querySelector(".btnCancel").addEventListener("click", function () { + dlg.querySelector('.btnCancel').addEventListener('click', function () { dialogHelper.close(dlg); }); return new Promise(function (resolve, reject) { - dlg.addEventListener("close", resolve); + dlg.addEventListener('close', resolve); dialogHelper.open(dlg); }); }; diff --git a/src/components/chromecast/chromecasthelpers.js b/src/components/chromecast/chromecasthelpers.js index 9967a4d96..ca2d27c97 100644 --- a/src/components/chromecast/chromecasthelpers.js +++ b/src/components/chromecast/chromecasthelpers.js @@ -37,69 +37,69 @@ define(['events'], function (events) { // 5) It wasn't as smart as it could have been about what should be part of a // URL and what should be part of human language. - var protocols = "(?:(?:http|https|rtsp|ftp):\\/\\/)"; + var protocols = '(?:(?:http|https|rtsp|ftp):\\/\\/)'; var credentials = "(?:(?:[a-z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-f0-9]{2})){1,64}" // username (1-64 normal or url escaped characters) + "(?:\\:(?:[a-z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-f0-9]{2})){1,25})?" // followed by optional password (: + 1-25 normal or url escaped characters) - + "\\@)"; + + '\\@)'; // IPv6 Regex http://forums.intermapper.com/viewtopic.php?t=452 // by Dartware, LLC is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License // http://intermapper.com/ - var ipv6 = "(" - + "(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))" - + "|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))" - + "|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))" - + "|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))" - + "|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))" - + "|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))" - + "|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))" - + "|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))" - + ")(%.+)?"; + var ipv6 = '(' + + '(([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))' + + '|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))' + + '|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))' + + '|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + '|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + '|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + '|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + '|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))' + + ')(%.+)?'; - var ipv4 = "(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\." - + "(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\." - + "(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\." - + "(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])"; + var ipv4 = '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.' + + '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.' + + '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.' + + '(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])'; // This would have been a lot cleaner if JS RegExp supported conditionals... var linkRegExpString = // begin match for protocol / username / password / host - "(?:" + '(?:' // ============================ // If we have a recognized protocol at the beginning of the URL, we're // more relaxed about what we accept, because we assume the user wants // this to be a URL, and we're not accidentally matching human language - + protocols + "?" + + protocols + '?' // optional username:password@ - + credentials + "?" + + credentials + '?' // IP address (both v4 and v6) - + "(?:" + + '(?:' // IPv6 + ipv6 // IPv4 - + "|" + ipv4 + + '|' + ipv4 - + ")" + + ')' // end match for protocol / username / password / host - + ")" + + ')' // optional port number - + "(?:\\:\\d{1,5})?" + + '(?:\\:\\d{1,5})?' // plus optional path and query params (no unicode allowed here?) - + "(?:" - + "\\/(?:" + + '(?:' + + '\\/(?:' // some characters we'll accept because it's unlikely human language // would use them after a URL unless they were part of the url - + "(?:[a-z0-9\\/\\@\\&\\#\\~\\*\\_\\-\\+])" - + "|(?:\\%[a-f0-9]{2})" + + '(?:[a-z0-9\\/\\@\\&\\#\\~\\*\\_\\-\\+])' + + '|(?:\\%[a-f0-9]{2})' // some characters are much more likely to be used AFTER a url and // were not intended to be included in the url itself. Mostly end // of sentence type things. It's also likely that the URL would @@ -108,9 +108,9 @@ define(['events'], function (events) { // they must be followed by another character that we're reasonably // sure is part of the url + "|(?:[\\;\\?\\:\\.\\!\\'\\(\\)\\,\\=]+(?=(?:[a-z0-9\\/\\@\\&\\#\\~\\*\\_\\-\\+])|(?:\\%[a-f0-9]{2})))" - + ")*" - + "|\\b|\$" - + ")"; + + ')*' + + '|\\b|\$' + + ')'; // regex = XRegExp(regex,'gi'); var linkRegExp = RegExp(linkRegExpString, 'gi'); @@ -120,7 +120,7 @@ define(['events'], function (events) { // if url doesn't begin with a known protocol, add http by default function ensureProtocol(url) { if (!url.match(protocolRegExp)) { - url = "http://" + url; + url = 'http://' + url; } return url; } @@ -190,7 +190,7 @@ define(['events'], function (events) { return apiClient.getPublicSystemInfo().then(function (info) { var localAddress = info.LocalAddress; if (!localAddress) { - console.debug("No valid local address returned, defaulting to external one"); + console.debug('No valid local address returned, defaulting to external one'); localAddress = serverAddress; } addToCache(serverAddress, localAddress); diff --git a/src/components/chromecast/chromecastplayer.js b/src/components/chromecast/chromecastplayer.js index 71058cf01..52fa4f6bc 100644 --- a/src/components/chromecast/chromecastplayer.js +++ b/src/components/chromecast/chromecastplayer.js @@ -54,7 +54,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' // production version registered with google // replace this value if you want to test changes on another instance - var applicationID = "F007D354"; + var applicationID = 'F007D354'; var messageNamespace = 'urn:x-cast:com.connectsdk'; @@ -114,14 +114,14 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.onInitSuccess = function () { this.isInitialized = true; - console.debug("chromecast init success"); + console.debug('chromecast init success'); }; /** * Generic error callback function */ CastPlayer.prototype.onError = function () { - console.debug("chromecast error"); + console.debug('chromecast error'); }; /** @@ -177,10 +177,10 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.receiverListener = function (e) { if (e === 'available') { - console.debug("chromecast receiver found"); + console.debug('chromecast receiver found'); this.hasReceivers = true; } else { - console.debug("chromecast receiver list empty"); + console.debug('chromecast receiver list empty'); this.hasReceivers = false; } }; @@ -195,8 +195,8 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.session = null; this.deviceState = DEVICE_STATE.IDLE; this.castPlayerState = PLAYER_STATE.IDLE; - document.removeEventListener("volumeupbutton", onVolumeUpKeyDown, false); - document.removeEventListener("volumedownbutton", onVolumeDownKeyDown, false); + document.removeEventListener('volumeupbutton', onVolumeUpKeyDown, false); + document.removeEventListener('volumedownbutton', onVolumeDownKeyDown, false); console.debug('sessionUpdateListener: setting currentMediaSession to null'); this.currentMediaSession = null; @@ -211,7 +211,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * session request in opt_sessionRequest. */ CastPlayer.prototype.launchApp = function () { - console.debug("chromecast launching app..."); + console.debug('chromecast launching app...'); chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this), this.onLaunchError.bind(this)); }; @@ -220,7 +220,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * @param {Object} e A chrome.cast.Session object */ CastPlayer.prototype.onRequestSessionSuccess = function (e) { - console.debug("chromecast session success: " + e.sessionId); + console.debug('chromecast session success: ' + e.sessionId); this.onSessionConnected(e); }; @@ -232,8 +232,8 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.session.addMediaListener(this.sessionMediaListener.bind(this)); this.session.addUpdateListener(this.sessionUpdateListener.bind(this)); - document.addEventListener("volumeupbutton", onVolumeUpKeyDown, false); - document.addEventListener("volumedownbutton", onVolumeDownKeyDown, false); + document.addEventListener('volumeupbutton', onVolumeUpKeyDown, false); + document.addEventListener('volumedownbutton', onVolumeDownKeyDown, false); events.trigger(this, 'connect'); this.sendMessage({ @@ -262,7 +262,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * Callback function for launch error */ CastPlayer.prototype.onLaunchError = function () { - console.debug("chromecast launch error"); + console.debug('chromecast launch error'); this.deviceState = DEVICE_STATE.ERROR; sendConnectionResult(false); }; @@ -284,8 +284,8 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.deviceState = DEVICE_STATE.IDLE; this.castPlayerState = PLAYER_STATE.IDLE; - document.removeEventListener("volumeupbutton", onVolumeUpKeyDown, false); - document.removeEventListener("volumedownbutton", onVolumeDownKeyDown, false); + document.removeEventListener('volumeupbutton', onVolumeUpKeyDown, false); + document.removeEventListener('volumedownbutton', onVolumeDownKeyDown, false); this.currentMediaSession = null; }; @@ -296,7 +296,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.loadMedia = function (options, command) { if (!this.session) { - console.debug("no session"); + console.debug('no session'); return Promise.reject(); } @@ -386,7 +386,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.onMediaDiscovered = function (how, mediaSession) { - console.debug("chromecast new media session ID:" + mediaSession.mediaSessionId + ' (' + how + ')'); + console.debug('chromecast new media session ID:' + mediaSession.mediaSessionId + ' (' + how + ')'); this.currentMediaSession = mediaSession; if (how === 'loadMedia') { @@ -405,7 +405,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * @param {!Boolean} e true/false */ CastPlayer.prototype.onMediaStatusUpdate = function (e) { - console.debug("chromecast updating media: " + e); + console.debug('chromecast updating media: ' + e); if (e === false) { this.castPlayerState = PLAYER_STATE.IDLE; } @@ -482,7 +482,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' } else { query.Limit = query.Limit || 100; - query.ExcludeLocationTypes = "Virtual"; + query.ExcludeLocationTypes = 'Virtual'; query.EnableTotalRecordCount = false; return apiClient.getItems(userId, query); @@ -506,13 +506,13 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' instance._castPlayer = new CastPlayer(); // To allow the native android app to override - document.dispatchEvent(new CustomEvent("chromecastloaded", { + document.dispatchEvent(new CustomEvent('chromecastloaded', { detail: { player: instance } })); - events.on(instance._castPlayer, "connect", function (e) { + events.on(instance._castPlayer, 'connect', function (e) { if (currentResolve) { sendConnectionResult(true); @@ -525,22 +525,22 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' instance.lastPlayerData = null; }); - events.on(instance._castPlayer, "playbackstart", function (e, data) { + events.on(instance._castPlayer, 'playbackstart', function (e, data) { console.debug('cc: playbackstart'); instance._castPlayer.initializeCastPlayer(); var state = instance.getPlayerStateInternal(data); - events.trigger(instance, "playbackstart", [state]); + events.trigger(instance, 'playbackstart', [state]); }); - events.on(instance._castPlayer, "playbackstop", function (e, data) { + events.on(instance._castPlayer, 'playbackstop', function (e, data) { console.debug('cc: playbackstop'); var state = instance.getPlayerStateInternal(data); - events.trigger(instance, "playbackstop", [state]); + events.trigger(instance, 'playbackstop', [state]); var state = instance.lastPlayerData.PlayState || {}; var volume = state.VolumeLevel || 0.5; @@ -553,12 +553,12 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' instance.lastPlayerData.PlayState.IsMuted = mute; }); - events.on(instance._castPlayer, "playbackprogress", function (e, data) { + events.on(instance._castPlayer, 'playbackprogress', function (e, data) { console.debug('cc: positionchange'); var state = instance.getPlayerStateInternal(data); - events.trigger(instance, "timeupdate", [state]); + events.trigger(instance, 'timeupdate', [state]); }); bindEventForRelay(instance, 'timeupdate'); @@ -567,12 +567,12 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' bindEventForRelay(instance, 'volumechange'); bindEventForRelay(instance, 'repeatmodechange'); - events.on(instance._castPlayer, "playstatechange", function (e, data) { + events.on(instance._castPlayer, 'playstatechange', function (e, data) { console.debug('cc: playstatechange'); var state = instance.getPlayerStateInternal(data); - events.trigger(instance, "pause", [state]); + events.trigger(instance, 'pause', [state]); }); } @@ -630,24 +630,24 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' name: PlayerName, id: PlayerName, playerName: PlayerName, - playableMediaTypes: ["Audio", "Video"], + playableMediaTypes: ['Audio', 'Video'], isLocalPlayer: false, appName: PlayerName, deviceName: appName, supportedCommands: [ - "VolumeUp", - "VolumeDown", - "Mute", - "Unmute", - "ToggleMute", - "SetVolume", - "SetAudioStreamIndex", - "SetSubtitleStreamIndex", - "DisplayContent", - "SetRepeatMode", - "EndSession", - "PlayMediaSource", - "PlayTrailers" + 'VolumeUp', + 'VolumeDown', + 'Mute', + 'Unmute', + 'ToggleMute', + 'SetVolume', + 'SetAudioStreamIndex', + 'SetSubtitleStreamIndex', + 'DisplayContent', + 'SetRepeatMode', + 'EndSession', + 'PlayMediaSource', + 'PlayTrailers' ] }; }; @@ -667,7 +667,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' console.debug(JSON.stringify(data)); if (triggerStateChange) { - events.trigger(this, "statechange", [data]); + events.trigger(this, 'statechange', [data]); } return data; diff --git a/src/components/collectioneditor/collectioneditor.js b/src/components/collectioneditor/collectioneditor.js index 49784df49..46b064030 100644 --- a/src/components/collectioneditor/collectioneditor.js +++ b/src/components/collectioneditor/collectioneditor.js @@ -24,7 +24,7 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio function createCollection(apiClient, dlg) { - var url = apiClient.getUrl("Collections", { + var url = apiClient.getUrl('Collections', { Name: dlg.querySelector('#txtNewCollectionName').value, IsLocked: !dlg.querySelector('#chkEnableInternetMetadata').checked, @@ -32,9 +32,9 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio }); apiClient.ajax({ - type: "POST", + type: 'POST', url: url, - dataType: "json" + dataType: 'json' }).then(function (result) { @@ -56,13 +56,13 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio function addToCollection(apiClient, dlg, id) { - var url = apiClient.getUrl("Collections/" + id + "/Items", { + var url = apiClient.getUrl('Collections/' + id + '/Items', { Ids: dlg.querySelector('.fldSelectedItemIds').value || '' }); apiClient.ajax({ - type: "POST", + type: 'POST', url: url }).then(function () { @@ -93,8 +93,8 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio var options = { Recursive: true, - IncludeItemTypes: "BoxSet", - SortBy: "SortName", + IncludeItemTypes: 'BoxSet', + SortBy: 'SortName', EnableTotalRecordCount: false }; @@ -230,13 +230,13 @@ define(['dom', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectio var title = items.length ? globalize.translate('HeaderAddToCollection') : globalize.translate('NewCollection'); html += '
'; - html += ''; + html += ''; html += '

'; html += title; html += '

'; if (appHost.supports('externallinks')) { - html += 'info' + globalize.translate('Help') + ''; + html += '' + globalize.translate('Help') + ''; } html += '
'; diff --git a/src/components/confirm/confirm.js b/src/components/confirm/confirm.js index fa9a15667..517d6fa9b 100644 --- a/src/components/confirm/confirm.js +++ b/src/components/confirm/confirm.js @@ -1,4 +1,4 @@ -define(["browser", "dialog", "globalize"], function(browser, dialog, globalize) { +define(['browser', 'dialog', 'globalize'], function(browser, dialog, globalize) { 'use strict'; function replaceAll(str, find, replace) { diff --git a/src/components/deletehelper.js b/src/components/deletehelper.js index 2212fd443..e13eb9c4a 100644 --- a/src/components/deletehelper.js +++ b/src/components/deletehelper.js @@ -1,57 +1,54 @@ -define(['connectionManager', 'confirm', 'appRouter', 'globalize'], function (connectionManager, confirm, appRouter, globalize) { - 'use strict'; +import connectionManager from 'connectionManager'; +import confirm from 'confirm'; +import appRouter from 'appRouter'; +import globalize from 'globalize'; - function alertText(options) { +function alertText(options) { - return new Promise(function (resolve, reject) { + return new Promise(function (resolve, reject) { - require(['alert'], function (alert) { - alert(options).then(resolve, resolve); - }); + require(['alert'], function (alert) { + alert(options).then(resolve, resolve); }); - } + }); +} - function deleteItem(options) { +export function deleteItem(options) { - var item = options.item; - var itemId = item.Id; - var parentId = item.SeasonId || item.SeriesId || item.ParentId; - var serverId = item.ServerId; + const item = options.item; + const parentId = item.SeasonId || item.SeriesId || item.ParentId; - var msg = globalize.translate('ConfirmDeleteItem'); - var title = globalize.translate('HeaderDeleteItem'); - var apiClient = connectionManager.getApiClient(item.ServerId); + let apiClient = connectionManager.getApiClient(item.ServerId); - return confirm({ + return confirm({ - title: title, - text: msg, - confirmText: globalize.translate('Delete'), - primary: 'delete' + title: globalize.translate('HeaderDeleteItem'), + text: globalize.translate('ConfirmDeleteItem'), + confirmText: globalize.translate('Delete'), + primary: 'delete' - }).then(function () { + }).then(function () { - return apiClient.deleteItem(itemId).then(function () { + return apiClient.deleteItem(item.Id).then(function () { - if (options.navigate) { - if (parentId) { - appRouter.showItem(parentId, serverId); - } else { - appRouter.goHome(); - } + if (options.navigate) { + if (parentId) { + appRouter.showItem(parentId, item.ServerId); + } else { + appRouter.goHome(); } - }, function (err) { + } + }, function (err) { - var result = function () { - return Promise.reject(err); - }; + let result = function () { + return Promise.reject(err); + }; - return alertText(globalize.translate('ErrorDeletingItem')).then(result, result); - }); + return alertText(globalize.translate('ErrorDeletingItem')).then(result, result); }); - } + }); +} - return { - deleteItem: deleteItem - }; -}); +export default { + deleteItem: deleteItem +}; diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index e3410776a..8b08cde67 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -141,7 +141,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', animateDialogOpen(dlg); if (isHistoryEnabled(dlg)) { - appRouter.pushState({ dialogId: hash }, "Dialog", '#' + hash); + appRouter.pushState({ dialogId: hash }, 'Dialog', '#' + hash); window.addEventListener('popstate', onHashChange); } else { diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index 65fe34df1..7f13f89ef 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -16,14 +16,14 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in function refreshDirectoryBrowser(page, path, fileOptions, updatePathOnError) { if (path && typeof path !== 'string') { - throw new Error("invalid path"); + throw new Error('invalid path'); } loading.show(); var promises = []; - if ("Network" === path) { + if ('Network' === path) { promises.push(ApiClient.getNetworkDevices()); } else { if (path) { @@ -37,31 +37,31 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in Promise.all(promises).then( function(responses) { var folders = responses[0]; - var parentPath = responses[1] || ""; - var html = ""; + var parentPath = responses[1] || ''; + var html = ''; - page.querySelector(".results").scrollTop = 0; - page.querySelector("#txtDirectoryPickerPath").value = path || ""; + page.querySelector('.results').scrollTop = 0; + page.querySelector('#txtDirectoryPickerPath').value = path || ''; if (path) { - html += getItem("lnkPath lnkDirectory", "", parentPath, "..."); + html += getItem('lnkPath lnkDirectory', '', parentPath, '...'); } for (var i = 0, length = folders.length; i < length; i++) { var folder = folders[i]; - var cssClass = "File" === folder.Type ? "lnkPath lnkFile" : "lnkPath lnkDirectory"; + var cssClass = 'File' === folder.Type ? 'lnkPath lnkFile' : 'lnkPath lnkDirectory'; html += getItem(cssClass, folder.Type, folder.Path, folder.Name); } if (!path) { - html += getItem("lnkPath lnkDirectory", "", "Network", globalize.translate("ButtonNetwork")); + html += getItem('lnkPath lnkDirectory', '', 'Network', globalize.translate('ButtonNetwork')); } - page.querySelector(".results").innerHTML = html; + page.querySelector('.results').innerHTML = html; loading.hide(); }, function() { if (updatePathOnError) { - page.querySelector("#txtDirectoryPickerPath").value = ""; - page.querySelector(".results").innerHTML = ""; + page.querySelector('#txtDirectoryPickerPath').value = ''; + page.querySelector('.results').innerHTML = ''; loading.hide(); } } @@ -69,74 +69,74 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } function getItem(cssClass, type, path, name) { - var html = ""; + var html = ''; html += '
'; html += '
'; html += '
'; html += name; - html += "
"; - html += "
"; - html += ''; - html += "
"; + html += ''; + html += ''; + html += ''; + html += ''; return html; } function getEditorHtml(options, systemInfo) { - var html = ""; + var html = ''; html += '
'; html += '
'; if (!options.pathReadOnly) { - var instruction = options.instruction ? options.instruction + "

" : ""; + var instruction = options.instruction ? options.instruction + '

' : ''; html += '
'; html += instruction; - html += globalize.translate("MessageDirectoryPickerInstruction", "\\\\server", "\\\\192.168.1.101"); - if ("bsd" === systemInfo.OperatingSystem.toLowerCase()) { - html += "
"; - html += "
"; - html += globalize.translate("MessageDirectoryPickerBSDInstruction"); - html += "
"; - } else if ("linux" === systemInfo.OperatingSystem.toLowerCase()) { - html += "
"; - html += "
"; - html += globalize.translate("MessageDirectoryPickerLinuxInstruction"); - html += "
"; + html += globalize.translate('MessageDirectoryPickerInstruction', '\\\\server', '\\\\192.168.1.101'); + if ('bsd' === systemInfo.OperatingSystem.toLowerCase()) { + html += '
'; + html += '
'; + html += globalize.translate('MessageDirectoryPickerBSDInstruction'); + html += '
'; + } else if ('linux' === systemInfo.OperatingSystem.toLowerCase()) { + html += '
'; + html += '
'; + html += globalize.translate('MessageDirectoryPickerLinuxInstruction'); + html += '
'; } - html += "
"; + html += '
'; } html += '
'; html += '
'; html += '
'; var labelKey; if (options.includeFiles !== true) { - labelKey = "LabelFolder"; + labelKey = 'LabelFolder'; } else { - labelKey = "LabelPath"; + labelKey = 'LabelPath'; } - var readOnlyAttribute = options.pathReadOnly ? " readonly" : ""; + var readOnlyAttribute = options.pathReadOnly ? ' readonly' : ''; html += ''; - html += "
"; + html += '
'; if (!readOnlyAttribute) { - html += ''; + html += ''; } - html += "
"; + html += ''; if (!readOnlyAttribute) { html += '
'; } if (options.enableNetworkSharePath) { html += '
'; - html += ''; + html += ''; html += '
'; - html += globalize.translate("LabelOptionalNetworkPathHelp"); - html += "
"; - html += "
"; + html += globalize.translate('LabelOptionalNetworkPathHelp'); + html += ''; + html += ''; } html += '
'; - html += '"; - html += "
"; - html += ""; - html += ""; - html += ""; - html += ""; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; return html; } @@ -148,15 +148,15 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } function alertTextWithOptions(options) { - require(["alert"], function(alert) { + require(['alert'], function(alert) { alert(options); }); } function validatePath(path, validateWriteable, apiClient) { return apiClient.ajax({ - type: "POST", - url: apiClient.getUrl("Environment/ValidatePath"), + type: 'POST', + url: apiClient.getUrl('Environment/ValidatePath'), data: { ValidateWriteable: validateWriteable, Path: path @@ -164,14 +164,14 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in }).catch(function(response) { if (response) { if (response.status === 404) { - alertText(globalize.translate("PathNotFound")); + alertText(globalize.translate('PathNotFound')); return Promise.reject(); } if (response.status === 500) { if (validateWriteable) { - alertText(globalize.translate("WriteAccessRequired")); + alertText(globalize.translate('WriteAccessRequired')); } else { - alertText(globalize.translate("PathNotFound")); + alertText(globalize.translate('PathNotFound')); } return Promise.reject(); } @@ -181,37 +181,37 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in } function initEditor(content, options, fileOptions) { - content.addEventListener("click", function(e) { - var lnkPath = dom.parentWithClass(e.target, "lnkPath"); + content.addEventListener('click', function(e) { + var lnkPath = dom.parentWithClass(e.target, 'lnkPath'); if (lnkPath) { - var path = lnkPath.getAttribute("data-path"); - if (lnkPath.classList.contains("lnkFile")) { - content.querySelector("#txtDirectoryPickerPath").value = path; + var path = lnkPath.getAttribute('data-path'); + if (lnkPath.classList.contains('lnkFile')) { + content.querySelector('#txtDirectoryPickerPath').value = path; } else { refreshDirectoryBrowser(content, path, fileOptions, true); } } }); - content.addEventListener("click", function(e) { - if (dom.parentWithClass(e.target, "btnRefreshDirectories")) { - var path = content.querySelector("#txtDirectoryPickerPath").value; + content.addEventListener('click', function(e) { + if (dom.parentWithClass(e.target, '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" === txtDirectoryPickerPath.id) { + content.addEventListener('change', function(e) { + var txtDirectoryPickerPath = dom.parentWithTag(e.target, 'INPUT'); + if (txtDirectoryPickerPath && 'txtDirectoryPickerPath' === txtDirectoryPickerPath.id) { refreshDirectoryBrowser(content, txtDirectoryPickerPath.value, fileOptions); } }); - content.querySelector("form").addEventListener("submit", function(e) { + content.querySelector('form').addEventListener('submit', function(e) { if (options.callback) { - var networkSharePath = this.querySelector("#txtNetworkPath"); + var networkSharePath = this.querySelector('#txtNetworkPath'); networkSharePath = networkSharePath ? networkSharePath.value : null; - var path = this.querySelector("#txtDirectoryPickerPath").value; + var path = this.querySelector('#txtDirectoryPickerPath').value; validatePath(path, options.validateWriteable, ApiClient).then(options.callback(path, networkSharePath)); } e.preventDefault(); @@ -224,11 +224,11 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in if (options.path) { return Promise.resolve(options.path); } else { - return ApiClient.getJSON(ApiClient.getUrl("Environment/DefaultDirectoryBrowser")).then( + return ApiClient.getJSON(ApiClient.getUrl('Environment/DefaultDirectoryBrowser')).then( function(result) { - return result.Path || ""; + return result.Path || ''; }, function() { - return ""; + return ''; } ); } @@ -253,35 +253,35 @@ define(['loading', 'dialogHelper', 'dom', 'globalize', 'listViewStyle', 'emby-in var systemInfo = responses[0]; var initialPath = responses[1]; var dlg = dialogHelper.createDialog({ - size: "medium-tall", + size: 'medium-tall', removeOnClose: true, scrollY: false }); - dlg.classList.add("ui-body-a"); - dlg.classList.add("background-theme-a"); - dlg.classList.add("directoryPicker"); - dlg.classList.add("formDialog"); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('directoryPicker'); + dlg.classList.add('formDialog'); - var html = ""; + var html = ''; html += '
'; - html += ''; + html += ''; html += '

'; - html += options.header || globalize.translate("HeaderSelectPath"); - html += "

"; - html += "
"; + html += options.header || globalize.translate('HeaderSelectPath'); + html += ''; + html += ''; html += getEditorHtml(options, systemInfo); dlg.innerHTML = html; initEditor(dlg, options, fileOptions); - dlg.addEventListener("close", onDialogClosed); + dlg.addEventListener('close', onDialogClosed); dialogHelper.open(dlg); - dlg.querySelector(".btnCloseDialog").addEventListener("click", function() { + dlg.querySelector('.btnCloseDialog').addEventListener('click', function() { dialogHelper.close(dlg); }); currentDialog = dlg; - dlg.querySelector("#txtDirectoryPickerPath").value = initialPath; - var txtNetworkPath = dlg.querySelector("#txtNetworkPath"); + dlg.querySelector('#txtDirectoryPickerPath').value = initialPath; + var txtNetworkPath = dlg.querySelector('#txtNetworkPath'); if (txtNetworkPath) { - txtNetworkPath.value = options.networkSharePath || ""; + txtNetworkPath.value = options.networkSharePath || ''; } if (!options.pathReadOnly) { refreshDirectoryBrowser(dlg, initialPath, fileOptions, true); diff --git a/src/components/displaysettings/displaysettings.js b/src/components/displaysettings/displaysettings.js index 682e60f60..2b7b4bb60 100644 --- a/src/components/displaysettings/displaysettings.js +++ b/src/components/displaysettings/displaysettings.js @@ -1,5 +1,5 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', 'apphost', 'focusManager', 'datetime', 'globalize', 'loading', 'connectionManager', 'skinManager', 'dom', 'events', 'emby-select', 'emby-checkbox', 'emby-button'], function (require, browser, layoutManager, appSettings, pluginManager, appHost, focusManager, datetime, globalize, loading, connectionManager, skinManager, dom, events) { - "use strict"; + 'use strict'; function fillThemes(select, isDashboard) { select.innerHTML = skinManager.getThemes().map(function (t) { diff --git a/src/components/displaysettings/displaysettings.template.html b/src/components/displaysettings/displaysettings.template.html index 62cb493e8..b8ab1a9ba 100644 --- a/src/components/displaysettings/displaysettings.template.html +++ b/src/components/displaysettings/displaysettings.template.html @@ -56,7 +56,7 @@ diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index 08c9d9acc..38715043e 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -1,41 +1,41 @@ -define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoader", "globalize", "layoutManager", "scrollStyles", "emby-itemscontainer"], function (loading, libraryBrowser, cardBuilder, dom, appHost, imageLoader, globalize, layoutManager) { - "use strict"; +define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoader', 'globalize', 'layoutManager', 'scrollStyles', 'emby-itemscontainer'], function (loading, libraryBrowser, cardBuilder, dom, appHost, imageLoader, globalize, layoutManager) { + 'use strict'; function enableScrollX() { return !layoutManager.desktop; } function getThumbShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop"; + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function getPosterShape() { - return enableScrollX() ? "overflowPortrait" : "portrait"; + return enableScrollX() ? 'overflowPortrait' : 'portrait'; } function getSquareShape() { - return enableScrollX() ? "overflowSquare" : "square"; + return enableScrollX() ? 'overflowSquare' : 'square'; } function getSections() { return [{ - name: "HeaderFavoriteMovies", - types: "Movie", - id: "favoriteMovies", + name: 'HeaderFavoriteMovies', + types: 'Movie', + id: 'favoriteMovies', shape: getPosterShape(), showTitle: false, overlayPlayButton: true }, { - name: "HeaderFavoriteShows", - types: "Series", - id: "favoriteShows", + name: 'HeaderFavoriteShows', + types: 'Series', + id: 'favoriteShows', shape: getPosterShape(), showTitle: false, overlayPlayButton: true }, { - name: "HeaderFavoriteEpisodes", - types: "Episode", - id: "favoriteEpisode", + name: 'HeaderFavoriteEpisodes', + types: 'Episode', + id: 'favoriteEpisode', shape: getThumbShape(), preferThumb: false, showTitle: true, @@ -44,9 +44,9 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad overlayText: false, centerText: true }, { - name: "HeaderFavoriteVideos", - types: "Video,MusicVideo", - id: "favoriteVideos", + name: 'HeaderFavoriteVideos', + types: 'Video,MusicVideo', + id: 'favoriteVideos', shape: getThumbShape(), preferThumb: true, showTitle: true, @@ -54,9 +54,9 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad overlayText: false, centerText: true }, { - name: "HeaderFavoriteArtists", - types: "MusicArtist", - id: "favoriteArtists", + name: 'HeaderFavoriteArtists', + types: 'MusicArtist', + id: 'favoriteArtists', shape: getSquareShape(), preferThumb: false, showTitle: true, @@ -66,9 +66,9 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad overlayPlayButton: true, coverImage: true }, { - name: "HeaderFavoriteAlbums", - types: "MusicAlbum", - id: "favoriteAlbums", + name: 'HeaderFavoriteAlbums', + types: 'MusicAlbum', + id: 'favoriteAlbums', shape: getSquareShape(), preferThumb: false, showTitle: true, @@ -78,9 +78,9 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad overlayPlayButton: true, coverImage: true }, { - name: "HeaderFavoriteSongs", - types: "Audio", - id: "favoriteSongs", + name: 'HeaderFavoriteSongs', + types: 'Audio', + id: 'favoriteSongs', shape: getSquareShape(), preferThumb: false, showTitle: true, @@ -88,7 +88,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad showParentTitle: true, centerText: true, overlayMoreButton: true, - action: "instantmix", + action: 'instantmix', coverImage: true }]; } @@ -96,13 +96,13 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad function loadSection(elem, userId, topParentId, section, isSingleSection) { var screenWidth = dom.getWindowSize().innerWidth; var options = { - SortBy: "SortName", - SortOrder: "Ascending", - Filters: "IsFavorite", + SortBy: 'SortName', + SortOrder: 'Ascending', + Filters: 'IsFavorite', Recursive: true, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', CollapseBoxSetItems: false, - ExcludeLocationTypes: "Virtual", + ExcludeLocationTypes: 'Virtual', EnableTotalRecordCount: false }; @@ -120,7 +120,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad var promise; - if ("MusicArtist" === section.types) { + if ('MusicArtist' === section.types) { promise = ApiClient.getArtists(userId, options); } else { options.IncludeItemTypes = section.types; @@ -128,25 +128,25 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad } return promise.then(function (result) { - var html = ""; + var html = ''; if (result.Items.length) { if (html += '
', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) { - html += ''; + html += ''; html += '

'; html += globalize.translate(section.name); - html += "

"; - html += ''; - html += "
"; + html += ''; + html += ''; + html += ''; } else { - html += '

' + globalize.translate(section.name) + "

"; + html += '

' + globalize.translate(section.name) + '

'; } - html += "
"; + html += ''; if (enableScrollX()) { - var scrollXClass = "scrollX hiddenScrollX"; + var scrollXClass = 'scrollX hiddenScrollX'; if (layoutManager.tv) { - scrollXClass += " smoothScrollX"; + scrollXClass += ' smoothScrollX'; } html += '
'; @@ -154,7 +154,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad html += '
'; } - var supportsImageAnalysis = appHost.supports("imageanalysis"); + var supportsImageAnalysis = appHost.supports('imageanalysis'); var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle; cardLayout = false; html += cardBuilder.getCardsHtml(result.Items, { @@ -172,7 +172,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad allowBottomPadding: !enableScrollX(), cardLayout: cardLayout }); - html += "
"; + html += '
'; } elem.innerHTML = html; @@ -183,7 +183,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad function loadSections(page, userId, topParentId, types) { loading.show(); var sections = getSections(); - var sectionid = getParameterByName("sectionid"); + var sectionid = getParameterByName('sectionid'); if (sectionid) { sections = sections.filter(function (s) { @@ -199,10 +199,10 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad var i; var length; - var elem = page.querySelector(".favoriteSections"); + var elem = page.querySelector('.favoriteSections'); if (!elem.innerHTML) { - var html = ""; + var html = ''; for (i = 0, length = sections.length; i < length; i++) { html += '
'; @@ -215,7 +215,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "dom", "apphost", "imageLoad for (i = 0, length = sections.length; i < length; i++) { var section = sections[i]; - elem = page.querySelector(".section" + section.id); + elem = page.querySelector('.section' + section.id); promises.push(loadSection(elem, userId, topParentId, section, 1 === sections.length)); } diff --git a/src/components/fetchhelper.js b/src/components/fetchhelper.js index 0b8d45173..08fe803ec 100644 --- a/src/components/fetchhelper.js +++ b/src/components/fetchhelper.js @@ -86,7 +86,7 @@ define([], function () { var value = params[key]; if (value !== null && value !== undefined && value !== '') { - values.push(encodeURIComponent(key) + "=" + encodeURIComponent(value)); + values.push(encodeURIComponent(key) + '=' + encodeURIComponent(value)); } } return values.join('&'); @@ -94,7 +94,7 @@ define([], function () { function ajax(request) { if (!request) { - throw new Error("Request cannot be null"); + throw new Error('Request cannot be null'); } request.headers = request.headers || {}; diff --git a/src/components/filedownloader.js b/src/components/filedownloader.js index 6f1bd3ff2..f2ca42211 100644 --- a/src/components/filedownloader.js +++ b/src/components/filedownloader.js @@ -1,4 +1,4 @@ -import multiDownload from "multi-download"; +import multiDownload from 'multi-download'; export function download(items) { diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index cbbb1919b..1dfd04c67 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -1,52 +1,49 @@ -define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "browser", "require", "emby-checkbox", "emby-collapse", "css!./style"], function (dom, dialogHelper, globalize, connectionManager, events, browser, require) { - "use strict"; +define(['dom', 'dialogHelper', 'globalize', 'connectionManager', 'events', 'browser', 'require', 'emby-checkbox', 'emby-collapse', 'css!./style'], function (dom, dialogHelper, globalize, connectionManager, events, browser, require) { + 'use strict'; function renderOptions(context, selector, cssClass, items, isCheckedFn) { var elem = context.querySelector(selector); if (items.length) { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } else { - elem.classList.add("hide"); + elem.classList.add('hide'); } - var html = ""; + var html = ''; html += '
'; html += items.map(function (filter) { - var itemHtml = ""; - var checkedHtml = isCheckedFn(filter) ? " checked" : ""; - itemHtml += "'; return itemHtml; - }).join(""); - html += "
"; - elem.querySelector(".filterOptions").innerHTML = html; + }).join(''); + html += ''; + elem.querySelector('.filterOptions').innerHTML = html; } function renderFilters(context, result, query) { - if (result.Tags) { - result.Tags.length = Math.min(result.Tags.length, 50); - } - renderOptions(context, ".genreFilters", "chkGenreFilter", result.Genres, function (i) { - var delimeter = "|"; - return (delimeter + (query.Genres || "") + delimeter).indexOf(delimeter + i + delimeter) != -1; + renderOptions(context, '.genreFilters', 'chkGenreFilter', result.Genres, function (i) { + var delimeter = '|'; + return (delimeter + (query.Genres || '') + delimeter).indexOf(delimeter + i + delimeter) != -1; }); - renderOptions(context, ".officialRatingFilters", "chkOfficialRatingFilter", result.OfficialRatings, function (i) { - var delimeter = "|"; - return (delimeter + (query.OfficialRatings || "") + delimeter).indexOf(delimeter + i + delimeter) != -1; + renderOptions(context, '.officialRatingFilters', 'chkOfficialRatingFilter', result.OfficialRatings, function (i) { + var delimeter = '|'; + return (delimeter + (query.OfficialRatings || '') + delimeter).indexOf(delimeter + i + delimeter) != -1; }); - renderOptions(context, ".tagFilters", "chkTagFilter", result.Tags, function (i) { - var delimeter = "|"; - return (delimeter + (query.Tags || "") + delimeter).indexOf(delimeter + i + delimeter) != -1; + renderOptions(context, '.tagFilters', 'chkTagFilter', result.Tags, function (i) { + var delimeter = '|'; + return (delimeter + (query.Tags || '') + delimeter).indexOf(delimeter + i + delimeter) != -1; }); - renderOptions(context, ".yearFilters", "chkYearFilter", result.Years, function (i) { - var delimeter = ","; - return (delimeter + (query.Years || "") + delimeter).indexOf(delimeter + i + delimeter) != -1; + renderOptions(context, '.yearFilters', 'chkYearFilter', result.Years, function (i) { + var delimeter = ','; + return (delimeter + (query.Years || '') + delimeter).indexOf(delimeter + i + delimeter) != -1; }); } function loadDynamicFilters(context, apiClient, userId, itemQuery) { - return apiClient.getJSON(apiClient.getUrl("Items/Filters", { + return apiClient.getJSON(apiClient.getUrl('Items/Filters', { UserId: userId, ParentId: itemQuery.ParentId, IncludeItemTypes: itemQuery.IncludeItemTypes @@ -61,98 +58,98 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow var length; var query = options.query; - if (options.mode == "livetvchannels") { - context.querySelector(".chkFavorite").checked = query.IsFavorite == true; - context.querySelector(".chkLikes").checked = query.IsLiked == true; - context.querySelector(".chkDislikes").checked = query.IsDisliked == true; + if (options.mode == 'livetvchannels') { + context.querySelector('.chkFavorite').checked = query.IsFavorite == true; + context.querySelector('.chkLikes').checked = query.IsLiked == true; + context.querySelector('.chkDislikes').checked = query.IsDisliked == true; } else { - elems = context.querySelectorAll(".chkStandardFilter"); + elems = context.querySelectorAll('.chkStandardFilter'); for (i = 0, length = elems.length; i < length; i++) { var chkStandardFilter = elems[i]; - var filters = "," + (query.Filters || ""); - var filterName = chkStandardFilter.getAttribute("data-filter"); - chkStandardFilter.checked = filters.indexOf("," + filterName) != -1; + var filters = ',' + (query.Filters || ''); + var filterName = chkStandardFilter.getAttribute('data-filter'); + chkStandardFilter.checked = filters.indexOf(',' + filterName) != -1; } } - elems = context.querySelectorAll(".chkVideoTypeFilter"); + elems = context.querySelectorAll('.chkVideoTypeFilter'); for (i = 0, length = elems.length; i < length; i++) { var chkVideoTypeFilter = elems[i]; - var filters = "," + (query.VideoTypes || ""); - var filterName = chkVideoTypeFilter.getAttribute("data-filter"); - chkVideoTypeFilter.checked = filters.indexOf("," + filterName) != -1; + var filters = ',' + (query.VideoTypes || ''); + var filterName = chkVideoTypeFilter.getAttribute('data-filter'); + chkVideoTypeFilter.checked = filters.indexOf(',' + filterName) != -1; } - context.querySelector(".chk3DFilter").checked = query.Is3D == true; - context.querySelector(".chkHDFilter").checked = query.IsHD == true; - context.querySelector(".chk4KFilter").checked = query.Is4K == true; - context.querySelector(".chkSDFilter").checked = query.IsHD == true; - context.querySelector("#chkSubtitle").checked = query.HasSubtitles == true; - context.querySelector("#chkTrailer").checked = query.HasTrailer == true; - context.querySelector("#chkThemeSong").checked = query.HasThemeSong == true; - context.querySelector("#chkThemeVideo").checked = query.HasThemeVideo == true; - context.querySelector("#chkSpecialFeature").checked = query.HasSpecialFeature == true; - context.querySelector("#chkSpecialEpisode").checked = query.ParentIndexNumber == 0; - context.querySelector("#chkMissingEpisode").checked = query.IsMissing == true; - context.querySelector("#chkFutureEpisode").checked = query.IsUnaired == true; + context.querySelector('.chk3DFilter').checked = query.Is3D == true; + context.querySelector('.chkHDFilter').checked = query.IsHD == true; + context.querySelector('.chk4KFilter').checked = query.Is4K == true; + context.querySelector('.chkSDFilter').checked = query.IsHD == true; + context.querySelector('#chkSubtitle').checked = query.HasSubtitles == true; + context.querySelector('#chkTrailer').checked = query.HasTrailer == true; + context.querySelector('#chkThemeSong').checked = query.HasThemeSong == true; + context.querySelector('#chkThemeVideo').checked = query.HasThemeVideo == true; + context.querySelector('#chkSpecialFeature').checked = query.HasSpecialFeature == true; + context.querySelector('#chkSpecialEpisode').checked = query.ParentIndexNumber == 0; + context.querySelector('#chkMissingEpisode').checked = query.IsMissing == true; + context.querySelector('#chkFutureEpisode').checked = query.IsUnaired == true; for (i = 0, length = elems.length; i < length; i++) { var chkStatus = elems[i]; - var filters = "," + (query.SeriesStatus || ""); - var filterName = chkStatus.getAttribute("data-filter"); - chkStatus.checked = filters.indexOf("," + filterName) != -1; + var filters = ',' + (query.SeriesStatus || ''); + var filterName = chkStatus.getAttribute('data-filter'); + chkStatus.checked = filters.indexOf(',' + filterName) != -1; } } function triggerChange(instance) { - events.trigger(instance, "filterchange"); + events.trigger(instance, 'filterchange'); } function setVisibility(context, options) { - if (options.mode == "livetvchannels" || options.mode == "albums" || options.mode == "artists" || options.mode == "albumartists" || options.mode == "songs") { - hideByClass(context, "videoStandard"); + if (options.mode == 'livetvchannels' || options.mode == 'albums' || options.mode == 'artists' || options.mode == 'albumartists' || options.mode == 'songs') { + hideByClass(context, 'videoStandard'); } if (enableDynamicFilters(options.mode)) { - context.querySelector(".genreFilters").classList.remove("hide"); - context.querySelector(".officialRatingFilters").classList.remove("hide"); - context.querySelector(".tagFilters").classList.remove("hide"); - context.querySelector(".yearFilters").classList.remove("hide"); + context.querySelector('.genreFilters').classList.remove('hide'); + context.querySelector('.officialRatingFilters').classList.remove('hide'); + context.querySelector('.tagFilters').classList.remove('hide'); + context.querySelector('.yearFilters').classList.remove('hide'); } - if (options.mode == "movies" || options.mode == "episodes") { - context.querySelector(".videoTypeFilters").classList.remove("hide"); + if (options.mode == 'movies' || options.mode == 'episodes') { + context.querySelector('.videoTypeFilters').classList.remove('hide'); } - if (options.mode == "movies" || options.mode == "series" || options.mode == "episodes") { - context.querySelector(".features").classList.remove("hide"); + if (options.mode == 'movies' || options.mode == 'series' || options.mode == 'episodes') { + context.querySelector('.features').classList.remove('hide'); } - if (options.mode == "series") { - context.querySelector(".seriesStatus").classList.remove("hide"); + if (options.mode == 'series') { + context.querySelector('.seriesStatus').classList.remove('hide'); } - if (options.mode == "episodes") { - showByClass(context, "episodeFilter"); + if (options.mode == 'episodes') { + showByClass(context, 'episodeFilter'); } } function showByClass(context, className) { - var elems = context.querySelectorAll("." + className); + var elems = context.querySelectorAll('.' + className); for (var i = 0, length = elems.length; i < length; i++) { - elems[i].classList.remove("hide"); + elems[i].classList.remove('hide'); } } function hideByClass(context, className) { - var elems = context.querySelectorAll("." + className); + var elems = context.querySelectorAll('.' + className); for (var i = 0, length = elems.length; i < length; i++) { - elems[i].classList.add("hide"); + elems[i].classList.add('hide'); } } function enableDynamicFilters(mode) { - return mode == "movies" || mode == "series" || mode == "albums" || mode == "albumartists" || mode == "artists" || mode == "songs" || mode == "episodes"; + return mode == 'movies' || mode == 'series' || mode == 'albums' || mode == 'albumartists' || mode == 'artists' || mode == 'songs' || mode == 'episodes'; } return function (options) { @@ -165,12 +162,12 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow function onStandardFilterChange() { var query = options.query; - var filterName = this.getAttribute("data-filter"); - var filters = query.Filters || ""; - filters = ("," + filters).replace("," + filterName, "").substring(1); + var filterName = this.getAttribute('data-filter'); + var filters = query.Filters || ''; + filters = (',' + filters).replace(',' + filterName, '').substring(1); if (this.checked) { - filters = filters ? filters + "," + filterName : filterName; + filters = filters ? filters + ',' + filterName : filterName; } query.StartIndex = 0; @@ -180,12 +177,12 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow function onVideoTypeFilterChange() { var query = options.query; - var filterName = this.getAttribute("data-filter"); - var filters = query.VideoTypes || ""; - filters = ("," + filters).replace("," + filterName, "").substring(1); + var filterName = this.getAttribute('data-filter'); + var filters = query.VideoTypes || ''; + filters = (',' + filters).replace(',' + filterName, '').substring(1); if (this.checked) { - filters = filters ? filters + "," + filterName : filterName; + filters = filters ? filters + ',' + filterName : filterName; } query.StartIndex = 0; @@ -195,12 +192,12 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow function onStatusChange() { var query = options.query; - var filterName = this.getAttribute("data-filter"); - var filters = query.SeriesStatus || ""; - filters = ("," + filters).replace("," + filterName, "").substring(1); + var filterName = this.getAttribute('data-filter'); + var filters = query.SeriesStatus || ''; + filters = (',' + filters).replace(',' + filterName, '').substring(1); if (this.checked) { - filters = filters ? filters + "," + filterName : filterName; + filters = filters ? filters + ',' + filterName : filterName; } query.SeriesStatus = filters; @@ -214,86 +211,86 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow var length; var query = options.query; - if (options.mode == "livetvchannels") { - elems = context.querySelectorAll(".chkFavorite"); + if (options.mode == 'livetvchannels') { + elems = context.querySelectorAll('.chkFavorite'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("change", onFavoriteChange); + elems[i].addEventListener('change', onFavoriteChange); } - context.querySelector(".chkLikes").addEventListener("change", function () { + context.querySelector('.chkLikes').addEventListener('change', function () { query.StartIndex = 0; query.IsLiked = this.checked ? true : null; triggerChange(self); }); - context.querySelector(".chkDislikes").addEventListener("change", function () { + context.querySelector('.chkDislikes').addEventListener('change', function () { query.StartIndex = 0; query.IsDisliked = this.checked ? true : null; triggerChange(self); }); } else { - elems = context.querySelectorAll(".chkStandardFilter"); + elems = context.querySelectorAll('.chkStandardFilter'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("change", onStandardFilterChange); + elems[i].addEventListener('change', onStandardFilterChange); } } - elems = context.querySelectorAll(".chkVideoTypeFilter"); + elems = context.querySelectorAll('.chkVideoTypeFilter'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("change", onVideoTypeFilterChange); + elems[i].addEventListener('change', onVideoTypeFilterChange); } - context.querySelector(".chk3DFilter").addEventListener("change", function () { + context.querySelector('.chk3DFilter').addEventListener('change', function () { query.StartIndex = 0; query.Is3D = this.checked ? true : null; triggerChange(self); }); - context.querySelector(".chk4KFilter").addEventListener("change", function () { + context.querySelector('.chk4KFilter').addEventListener('change', function () { query.StartIndex = 0; query.Is4K = this.checked ? true : null; triggerChange(self); }); - context.querySelector(".chkHDFilter").addEventListener("change", function () { + context.querySelector('.chkHDFilter').addEventListener('change', function () { query.StartIndex = 0; query.IsHD = this.checked ? true : null; triggerChange(self); }); - context.querySelector(".chkSDFilter").addEventListener("change", function () { + context.querySelector('.chkSDFilter').addEventListener('change', function () { query.StartIndex = 0; query.IsHD = this.checked ? false : null; triggerChange(self); }); - elems = context.querySelectorAll(".chkStatus"); + elems = context.querySelectorAll('.chkStatus'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("change", onStatusChange); + elems[i].addEventListener('change', onStatusChange); } - context.querySelector("#chkTrailer").addEventListener("change", function () { + context.querySelector('#chkTrailer').addEventListener('change', function () { query.StartIndex = 0; query.HasTrailer = this.checked ? true : null; triggerChange(self); }); - context.querySelector("#chkThemeSong").addEventListener("change", function () { + context.querySelector('#chkThemeSong').addEventListener('change', function () { query.StartIndex = 0; query.HasThemeSong = this.checked ? true : null; triggerChange(self); }); - context.querySelector("#chkSpecialFeature").addEventListener("change", function () { + context.querySelector('#chkSpecialFeature').addEventListener('change', function () { query.StartIndex = 0; query.HasSpecialFeature = this.checked ? true : null; triggerChange(self); }); - context.querySelector("#chkThemeVideo").addEventListener("change", function () { + context.querySelector('#chkThemeVideo').addEventListener('change', function () { query.StartIndex = 0; query.HasThemeVideo = this.checked ? true : null; triggerChange(self); }); - context.querySelector("#chkMissingEpisode").addEventListener("change", function () { + context.querySelector('#chkMissingEpisode').addEventListener('change', function () { query.StartIndex = 0; query.IsMissing = this.checked ? true : false; triggerChange(self); }); - context.querySelector("#chkSpecialEpisode").addEventListener("change", function () { + context.querySelector('#chkSpecialEpisode').addEventListener('change', function () { query.StartIndex = 0; query.ParentIndexNumber = this.checked ? 0 : null; triggerChange(self); }); - context.querySelector("#chkFutureEpisode").addEventListener("change", function () { + context.querySelector('#chkFutureEpisode').addEventListener('change', function () { query.StartIndex = 0; if (this.checked) { query.IsUnaired = true; @@ -304,18 +301,18 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow } triggerChange(self); }); - context.querySelector("#chkSubtitle").addEventListener("change", function () { + context.querySelector('#chkSubtitle').addEventListener('change', function () { query.StartIndex = 0; query.HasSubtitles = this.checked ? true : null; triggerChange(self); }); - context.addEventListener("change", function (e) { - var chkGenreFilter = dom.parentWithClass(e.target, "chkGenreFilter"); + context.addEventListener('change', function (e) { + var chkGenreFilter = dom.parentWithClass(e.target, 'chkGenreFilter'); if (chkGenreFilter) { - var filterName = chkGenreFilter.getAttribute("data-filter"); - var filters = query.Genres || ""; - var delimiter = "|"; - filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); + var filterName = chkGenreFilter.getAttribute('data-filter'); + var filters = query.Genres || ''; + var delimiter = '|'; + filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); if (chkGenreFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } @@ -324,12 +321,12 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow triggerChange(self); return; } - var chkTagFilter = dom.parentWithClass(e.target, "chkTagFilter"); + var chkTagFilter = dom.parentWithClass(e.target, 'chkTagFilter'); if (chkTagFilter) { - var filterName = chkTagFilter.getAttribute("data-filter"); - var filters = query.Tags || ""; - var delimiter = "|"; - filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); + var filterName = chkTagFilter.getAttribute('data-filter'); + var filters = query.Tags || ''; + var delimiter = '|'; + filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); if (chkTagFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } @@ -338,12 +335,12 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow triggerChange(self); return; } - var chkYearFilter = dom.parentWithClass(e.target, "chkYearFilter"); + var chkYearFilter = dom.parentWithClass(e.target, 'chkYearFilter'); if (chkYearFilter) { - var filterName = chkYearFilter.getAttribute("data-filter"); - var filters = query.Years || ""; - var delimiter = ","; - filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); + var filterName = chkYearFilter.getAttribute('data-filter'); + var filters = query.Years || ''; + var delimiter = ','; + filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); if (chkYearFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } @@ -352,12 +349,12 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow triggerChange(self); return; } - var chkOfficialRatingFilter = dom.parentWithClass(e.target, "chkOfficialRatingFilter"); + var chkOfficialRatingFilter = dom.parentWithClass(e.target, 'chkOfficialRatingFilter'); if (chkOfficialRatingFilter) { - var filterName = chkOfficialRatingFilter.getAttribute("data-filter"); - var filters = query.OfficialRatings || ""; - var delimiter = "|"; - filters = (delimiter + filters).replace(delimiter + filterName, "").substring(1); + var filterName = chkOfficialRatingFilter.getAttribute('data-filter'); + var filters = query.OfficialRatings || ''; + var delimiter = '|'; + filters = (delimiter + filters).replace(delimiter + filterName, '').substring(1); if (chkOfficialRatingFilter.checked) { filters = filters ? (filters + delimiter + filterName) : filterName; } @@ -373,23 +370,23 @@ define(["dom", "dialogHelper", "globalize", "connectionManager", "events", "brow self.show = function () { return new Promise(function (resolve, reject) { - require(["text!./filterdialog.template.html"], function (template) { + require(['text!./filterdialog.template.html'], function (template) { var dlg = dialogHelper.createDialog({ removeOnClose: true, modal: false }); - dlg.classList.add("ui-body-a"); - dlg.classList.add("background-theme-a"); - dlg.classList.add("formDialog"); - dlg.classList.add("filterDialog"); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('formDialog'); + dlg.classList.add('filterDialog'); dlg.innerHTML = globalize.translateDocument(template); setVisibility(dlg, options); dialogHelper.open(dlg); - dlg.addEventListener("close", resolve); + dlg.addEventListener('close', resolve); updateFilterControls(dlg, options); bindEvents(dlg); if (enableDynamicFilters(options.mode)) { - dlg.classList.add("dynamicFilterDialog"); + dlg.classList.add('dynamicFilterDialog'); var apiClient = connectionManager.getApiClient(options.serverId); loadDynamicFilters(dlg, apiClient, apiClient.getCurrentUserId(), options.query); } diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index 6b08ddab1..c189856e7 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -279,7 +279,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost', var html = ''; html += '
'; - html += ''; + html += ''; html += '

${Filters}

'; html += '
'; diff --git a/src/components/focusManager.js b/src/components/focusManager.js index 1da58d75c..f2022cc44 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -117,7 +117,7 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) { return false; } - if (elem.getAttribute('tabindex') === "-1") { + if (elem.getAttribute('tabindex') === '-1') { return false; } diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index ad638ecdd..602c4310f 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -1,28 +1,28 @@ -define(["dom", "appRouter", "connectionManager"], function (dom, appRouter, connectionManager) { - "use strict"; +define(['dom', 'appRouter', 'connectionManager'], function (dom, appRouter, connectionManager) { + 'use strict'; function onGroupedCardClick(e, card) { - var itemId = card.getAttribute("data-id"); - var serverId = card.getAttribute("data-serverid"); + var itemId = card.getAttribute('data-id'); + var serverId = card.getAttribute('data-serverid'); var apiClient = connectionManager.getApiClient(serverId); var userId = apiClient.getCurrentUserId(); - var playedIndicator = card.querySelector(".playedIndicator"); + var playedIndicator = card.querySelector('.playedIndicator'); var playedIndicatorHtml = playedIndicator ? playedIndicator.innerHTML : null; var options = { - Limit: parseInt(playedIndicatorHtml || "10"), - Fields: "PrimaryImageAspectRatio,DateCreated", + Limit: parseInt(playedIndicatorHtml || '10'), + Fields: 'PrimaryImageAspectRatio,DateCreated', ParentId: itemId, GroupItems: false }; - var actionableParent = dom.parentWithTag(e.target, ["A", "BUTTON", "INPUT"]); + var actionableParent = dom.parentWithTag(e.target, ['A', 'BUTTON', 'INPUT']); - if (!actionableParent || actionableParent.classList.contains("cardContent")) { - apiClient.getJSON(apiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) { + if (!actionableParent || actionableParent.classList.contains('cardContent')) { + apiClient.getJSON(apiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { if (1 === items.length) { return void appRouter.showItem(items[0]); } - var url = "itemdetails.html?id=" + itemId + "&serverId=" + serverId; + var url = 'itemdetails.html?id=' + itemId + '&serverId=' + serverId; Dashboard.navigate(url); }); e.stopPropagation(); @@ -32,7 +32,7 @@ define(["dom", "appRouter", "connectionManager"], function (dom, appRouter, conn } function onItemsContainerClick(e) { - var groupedCard = dom.parentWithClass(e.target, "groupedCard"); + var groupedCard = dom.parentWithClass(e.target, 'groupedCard'); if (groupedCard) { onGroupedCardClick(e, groupedCard); diff --git a/src/components/guide/guide-settings.template.html b/src/components/guide/guide-settings.template.html index 02701db3d..edb2ffa8d 100644 --- a/src/components/guide/guide-settings.template.html +++ b/src/components/guide/guide-settings.template.html @@ -1,5 +1,7 @@
- +

${Settings}

diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index d6497e5f0..223d3a206 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -227,7 +227,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', channelQuery.Limit = channelLimit; channelQuery.AddCurrentProgram = false; channelQuery.EnableUserData = false; - channelQuery.EnableImageTypes = "Primary"; + channelQuery.EnableImageTypes = 'Primary'; var categories = self.categoryOptions.categories || []; var displayMovieContent = !categories.length || categories.indexOf('movies') !== -1; @@ -261,8 +261,8 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', } if (userSettings.get('livetv-channelorder') === 'DatePlayed') { - channelQuery.SortBy = "DatePlayed"; - channelQuery.SortOrder = "Descending"; + channelQuery.SortBy = 'DatePlayed'; + channelQuery.SortOrder = 'Descending'; } else { channelQuery.SortBy = null; channelQuery.SortOrder = null; @@ -329,7 +329,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', ImageTypeLimit: 1, EnableImages: false, //EnableImageTypes: layoutManager.tv ? "Primary,Backdrop" : "Primary", - SortBy: "StartDate", + SortBy: 'StartDate', EnableTotalRecordCount: false, EnableUserData: false }; @@ -415,7 +415,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var status; if (item.Type === 'SeriesTimer') { - return ''; + return ''; } else if (item.TimerId || item.SeriesTimerId) { status = item.Status || 'Cancelled'; @@ -429,13 +429,13 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', if (item.SeriesTimerId) { if (status !== 'Cancelled') { - return ''; + return ''; } - return ''; + return ''; } - return ''; + return ''; } function getChannelProgramsHtml(context, date, channel, programs, options, listInfo) { @@ -502,7 +502,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var endPercent = (renderEndMs - renderStartMs) / msPerDay; endPercent *= 100; - var cssClass = "programCell itemAction"; + var cssClass = 'programCell itemAction'; var accentCssClass = null; var displayInnerContent = true; @@ -525,11 +525,11 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', } if (displayInnerContent && enableColorCodedBackgrounds && accentCssClass) { - cssClass += " programCell-" + accentCssClass; + cssClass += ' programCell-' + accentCssClass; } if (now >= startDateLocalMs && now < endDateLocalMs) { - cssClass += " programCell-active"; + cssClass += ' programCell-active'; } var timerAttributes = ''; @@ -545,11 +545,11 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', html += ''; if (displayInnerContent) { - var guideProgramNameClass = "guideProgramName"; + var guideProgramNameClass = 'guideProgramName'; html += '
'; - html += '
'; + html += '
'; html += '
' + program.Name; @@ -577,7 +577,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', html += '
'; if (program.IsHD && options.showHdIcon) { - //html += 'hd'; + //html += ''; if (layoutManager.tv) { html += '
HD
'; } else { @@ -630,7 +630,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var url = apiClient.getScaledImageUrl(channel.Id, { maxHeight: 220, tag: channel.ImageTags.Primary, - type: "Primary" + type: 'Primary' }); html += '
'; @@ -1105,7 +1105,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var icon = cell.querySelector('.timerIcon'); if (!icon) { - cell.querySelector('.guideProgramName').insertAdjacentHTML('beforeend', ''); + cell.querySelector('.guideProgramName').insertAdjacentHTML('beforeend', ''); } if (newTimerId) { diff --git a/src/components/guide/tvguide.template.html b/src/components/guide/tvguide.template.html index 1babf5aac..367aac6c1 100644 --- a/src/components/guide/tvguide.template.html +++ b/src/components/guide/tvguide.template.html @@ -9,8 +9,8 @@
-
@@ -29,10 +29,10 @@
- -
diff --git a/src/components/homescreensettings/homescreensettings.js b/src/components/homescreensettings/homescreensettings.js index ccc6fa75f..15812647c 100644 --- a/src/components/homescreensettings/homescreensettings.js +++ b/src/components/homescreensettings/homescreensettings.js @@ -1,5 +1,5 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loading', 'connectionManager', 'homeSections', 'dom', 'events', 'listViewStyle', 'emby-select', 'emby-checkbox'], function (require, appHost, layoutManager, focusManager, globalize, loading, connectionManager, homeSections, dom, events) { - "use strict"; + 'use strict'; var numConfigurableSections = 7; @@ -149,7 +149,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa currentHtml += '
'; - currentHtml += ''; + currentHtml += ''; currentHtml += '
'; @@ -159,8 +159,8 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa currentHtml += '
'; - currentHtml += ''; - currentHtml += ''; + currentHtml += ''; + currentHtml += ''; currentHtml += '
'; @@ -276,7 +276,7 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa updateHomeSectionValues(context, userSettings); var promise1 = apiClient.getUserViews({ IncludeHidden: true }, user.Id); - var promise2 = apiClient.getJSON(apiClient.getUrl("Users/" + user.Id + "/GroupingOptions")); + var promise2 = apiClient.getJSON(apiClient.getUrl('Users/' + user.Id + '/GroupingOptions')); Promise.all([promise1, promise2]).then(function (responses) { @@ -363,17 +363,17 @@ define(['require', 'apphost', 'layoutManager', 'focusManager', 'globalize', 'loa user.Configuration.HidePlayedInLatest = context.querySelector('.chkHidePlayedFromLatest').checked; - user.Configuration.LatestItemsExcludes = getCheckboxItems(".chkIncludeInLatest", context, false).map(function (i) { + user.Configuration.LatestItemsExcludes = getCheckboxItems('.chkIncludeInLatest', context, false).map(function (i) { return i.getAttribute('data-folderid'); }); - user.Configuration.MyMediaExcludes = getCheckboxItems(".chkIncludeInMyMedia", context, false).map(function (i) { + user.Configuration.MyMediaExcludes = getCheckboxItems('.chkIncludeInMyMedia', context, false).map(function (i) { return i.getAttribute('data-folderid'); }); - user.Configuration.GroupedFolders = getCheckboxItems(".chkGroupFolder", context, true).map(function (i) { + user.Configuration.GroupedFolders = getCheckboxItems('.chkGroupFolder', context, true).map(function (i) { return i.getAttribute('data-folderid'); }); diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 894cf0bdb..3cd30893b 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -64,21 +64,21 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la } else { var noLibDescription; if (user['Policy'] && user['Policy']['IsAdministrator']) { - noLibDescription = globalize.translate("NoCreatedLibraries", '
', ''); + noLibDescription = globalize.translate('NoCreatedLibraries', '
', ''); } else { - noLibDescription = globalize.translate("AskAdminToCreateLibrary"); + noLibDescription = globalize.translate('AskAdminToCreateLibrary'); } html += '
'; - html += '

' + globalize.translate("MessageNothingHere") + '

'; + html += '

' + globalize.translate('MessageNothingHere') + '

'; html += '

' + noLibDescription + '

'; html += '
'; elem.innerHTML = html; - var createNowLink = elem.querySelector("#button-createLibrary"); + var createNowLink = elem.querySelector('#button-createLibrary'); if (createNowLink) { - createNowLink.addEventListener("click", function () { - Dashboard.navigate("library.html"); + createNowLink.addEventListener('click', function () { + Dashboard.navigate('library.html'); }); } } @@ -172,7 +172,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la } function getLibraryButtonsHtml(items) { - var html = ""; + var html = ''; html += '
'; html += '

' + globalize.translate('HeaderMyMedia') + '

'; @@ -183,7 +183,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la for (var i = 0, length = items.length; i < length; i++) { var item = items[i]; var icon = imageHelper.getLibraryIcon(item.CollectionType); - html += '' + item.Name + ''; + html += '' + item.Name + ''; } html += '
'; @@ -229,9 +229,9 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la var options = { Limit: limit, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", + EnableImageTypes: 'Primary,Backdrop,Thumb', ParentId: parentId }; @@ -282,7 +282,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

'; html += globalize.translate('LatestFromLibrary', parent.Name); html += '

'; - html += ''; + html += ''; html += ''; } else { html += '

' + globalize.translate('LatestFromLibrary', parent.Name) + '

'; @@ -386,9 +386,9 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la var options = { Limit: limit, Recursive: true, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", + EnableImageTypes: 'Primary,Backdrop,Thumb', EnableTotalRecordCount: false, MediaTypes: 'Video' }; @@ -459,9 +459,9 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la var options = { Limit: limit, Recursive: true, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", + EnableImageTypes: 'Primary,Backdrop,Thumb', EnableTotalRecordCount: false, MediaTypes: 'Audio' }; @@ -524,9 +524,9 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la IsAiring: true, limit: 24, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Thumb,Backdrop", + EnableImageTypes: 'Primary,Thumb,Backdrop', EnableTotalRecordCount: false, - Fields: "ChannelInfo,PrimaryImageAspectRatio" + Fields: 'ChannelInfo,PrimaryImageAspectRatio' }); }; } @@ -565,9 +565,9 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la IsAiring: true, limit: 1, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Thumb,Backdrop", + EnableImageTypes: 'Primary,Thumb,Backdrop', EnableTotalRecordCount: false, - Fields: "ChannelInfo,PrimaryImageAspectRatio" + Fields: 'ChannelInfo,PrimaryImageAspectRatio' }).then(function (result) { var html = ''; if (result.Items.length) { @@ -630,7 +630,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

'; html += globalize.translate('HeaderOnNow'); html += '

'; - html += ''; + html += ''; html += ''; } else { @@ -667,10 +667,10 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la var apiClient = connectionManager.getApiClient(serverId); return apiClient.getNextUpEpisodes({ Limit: enableScrollX() ? 24 : 15, - Fields: "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo', UserId: apiClient.getCurrentUserId(), ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', EnableTotalRecordCount: false }); }; @@ -705,7 +705,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

'; html += globalize.translate('HeaderNextUp'); html += '

'; - html += ''; + html += ''; html += ''; } else { html += '

' + globalize.translate('HeaderNextUp') + '

'; @@ -739,7 +739,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la return apiClient.getLiveTvRecordings({ userId: apiClient.getCurrentUserId(), Limit: enableScrollX() ? 12 : 5, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', EnableTotalRecordCount: false, IsLibraryItem: activeRecordingsOnly ? null : false, IsInProgress: activeRecordingsOnly ? true : null diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 8026110e2..3f17eeb33 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -2,12 +2,12 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve 'use strict'; function getSavedVolume() { - return appSettings.get("volume") || 1; + return appSettings.get('volume') || 1; } function saveVolume(value) { if (value) { - appSettings.set("volume", value); + appSettings.set('volume', value); } } @@ -109,7 +109,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve var now = Date.now(); if (window.performance && window.performance.now) { - now = performance.now(); + now = performance.now(); // eslint-disable-line compat/compat } if (!recoverDecodingErrorDate || (now - recoverDecodingErrorDate) > 3000) { @@ -178,7 +178,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve if (onMediaReady) onMediaReady(); } else { // update video player position when media is ready to be sought - var events = ["durationchange", "loadeddata", "play", "loadedmetadata"]; + var events = ['durationchange', 'loadeddata', 'play', 'loadedmetadata']; var onMediaChange = function(e) { if (element.currentTime === 0 && element.duration >= seconds) { // seek only when video position is exactly zero, @@ -194,7 +194,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve } }; events.map(function (name) { - element.addEventListener(name, onMediaChange); + return element.addEventListener(name, onMediaChange); }); } } @@ -373,13 +373,13 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve onErrorInternal(instance, 'network'); } } else { - console.debug("fatal network error encountered, try to recover"); + console.debug('fatal network error encountered, try to recover'); hls.startLoad(); } break; case Hls.ErrorTypes.MEDIA_ERROR: - console.debug("fatal media error encountered, try to recover"); + console.debug('fatal media error encountered, try to recover'); var currentReject = reject; reject = null; handleHlsJsMediaError(instance, currentReject); @@ -409,7 +409,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve elem.src = ''; elem.innerHTML = ''; - elem.removeAttribute("src"); + elem.removeAttribute('src'); destroyHlsPlayer(instance); destroyFlvPlayer(instance); diff --git a/src/components/htmlaudioplayer/plugin.js b/src/components/htmlaudioplayer/plugin.js index 90f954d50..000af6f22 100644 --- a/src/components/htmlaudioplayer/plugin.js +++ b/src/components/htmlaudioplayer/plugin.js @@ -1,5 +1,5 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelper'], function (events, browser, require, appHost, appSettings, htmlMediaHelper) { - "use strict"; + 'use strict'; function getDefaultProfile() { return new Promise(function (resolve, reject) { @@ -136,7 +136,10 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp requireHlsPlayer(function () { var hls = new Hls({ - manifestLoadingTimeOut: 20000 + manifestLoadingTimeOut: 20000, + xhrSetup: function(xhr, url) { + xhr.withCredentials = true; + } //appendErrorMaxRetry: 6, //debug: true }); @@ -155,6 +158,9 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp elem.autoplay = true; + // Safari will not send cookies without this + elem.crossOrigin = 'use-credentials'; + return htmlMediaHelper.applySrc(elem, val, options).then(function () { self._currentSrc = val; diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index d3e3b3640..65b1c3c29 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -1,5 +1,5 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackManager', 'appRouter', 'appSettings', 'connectionManager', 'htmlMediaHelper', 'itemHelper', 'screenfull', 'globalize'], function (browser, require, events, appHost, loading, dom, playbackManager, appRouter, appSettings, connectionManager, htmlMediaHelper, itemHelper, screenfull, globalize) { - "use strict"; + 'use strict'; /* globals cast */ var mediaManager; @@ -106,10 +106,16 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }); } + function hidePrePlaybackPage() { + let animatedPage = document.querySelector('.page:not(.hide)'); + animatedPage.classList.add('hide'); + } + function zoomIn(elem) { return new Promise(function (resolve, reject) { var duration = 240; elem.style.animation = 'htmlvideoplayer-zoomin ' + duration + 'ms ease-in normal'; + hidePrePlaybackPage(); dom.addEventListener(elem, dom.whichAnimationEvent(), resolve, { once: true }); @@ -212,7 +218,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function incrementFetchQueue() { if (self._fetchQueue <= 0) { self.isFetching = true; - events.trigger(self, "beginFetch"); + events.trigger(self, 'beginFetch'); } self._fetchQueue++; @@ -223,7 +229,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (self._fetchQueue <= 0) { self.isFetching = false; - events.trigger(self, "endFetch"); + events.trigger(self, 'endFetch'); } } @@ -290,7 +296,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return createMediaElement(options).then(function (elem) { - return updateVideoUrl(options, options.mediaSource).then(function () { + return updateVideoUrl(options).then(function () { return setCurrentSrc(elem, options); }); }); @@ -330,7 +336,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa requireHlsPlayer(function () { var hls = new Hls({ - manifestLoadingTimeOut: 20000 + manifestLoadingTimeOut: 20000, + xhrSetup: function(xhr, xhr_url) { + xhr.withCredentials = true; + } //appendErrorMaxRetry: 6, //debug: true }); @@ -466,7 +475,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa console.debug('content type: ' + contentType); host.onError = function (errorCode) { - console.error("fatal Error - " + errorCode); + console.error('fatal Error - ' + errorCode); }; mediaElement.autoplay = false; @@ -551,6 +560,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa elem.autoplay = true; + // Safari will not send cookies without this + elem.crossOrigin = 'use-credentials'; + return htmlMediaHelper.applySrc(elem, val, options).then(function () { self._currentSrc = val; @@ -602,7 +614,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa // if .ass currently rendering if (currentSubtitlesOctopus) { updateCurrentTrackOffset(offsetValue); - currentSubtitlesOctopus.timeOffset = offsetValue; + currentSubtitlesOctopus.timeOffset = (self._currentPlayOptions.transcodingOffsetTicks || 0) / 10000000 + offsetValue; } else { var trackElement = getTextTrack(); // if .vtt currently rendering @@ -611,7 +623,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } else if (currentTrackEvents) { setTrackEventsSubtitleOffset(currentTrackEvents, offsetValue); } else { - console.debug("No available track, cannot apply offset: ", offsetValue); + console.debug('No available track, cannot apply offset: ', offsetValue); } } }; @@ -836,7 +848,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function onNavigatedToOsd() { var dlg = videoDialog; if (dlg) { - dlg.classList.remove('videoPlayerContainer-withBackdrop'); dlg.classList.remove('videoPlayerContainer-onTop'); onStartedAndNavigatedToOsd(); @@ -860,7 +871,11 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa loading.hide(); htmlMediaHelper.seekOnPlaybackStart(self, e.target, self._currentPlayOptions.playerStartPositionTicks, function () { - if (currentSubtitlesOctopus) currentSubtitlesOctopus.resize(); + if (currentSubtitlesOctopus) { + currentSubtitlesOctopus.timeOffset = (self._currentPlayOptions.transcodingOffsetTicks || 0) / 10000000 + currentTrackOffset; + currentSubtitlesOctopus.resize(); + currentSubtitlesOctopus.resetRenderAheadCache(false); + } }); if (self._currentPlayOptions.fullscreen) { @@ -869,7 +884,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } else { appRouter.setTransparency('backdrop'); - videoDialog.classList.remove('videoPlayerContainer-withBackdrop'); videoDialog.classList.remove('videoPlayerContainer-onTop'); onStartedAndNavigatedToOsd(); @@ -1061,11 +1075,12 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa fonts: attachments.map(function (i) { return apiClient.getUrl(i.DeliveryUrl); }), - workerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker.js", - legacyWorkerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker-legacy.js", + workerUrl: appRouter.baseUrl() + '/libraries/subtitles-octopus-worker.js', + legacyWorkerUrl: appRouter.baseUrl() + '/libraries/subtitles-octopus-worker-legacy.js', onError: function() { htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror'); }, + timeOffset: (self._currentPlayOptions.transcodingOffsetTicks || 0) / 10000000, // new octopus options; override all, even defaults renderMode: 'blend', @@ -1285,12 +1300,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function createMediaElement(options) { - if (browser.tv || browser.iOS || browser.mobile) { - // too slow - // also on iOS, the backdrop image doesn't look right - // on android mobile, it works, but can be slow to have the video surface fully cover the backdrop - options.backdropUrl = null; - } return new Promise(function (resolve, reject) { var dlg = document.querySelector('.videoPlayerContainer'); @@ -1305,11 +1314,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa dlg.classList.add('videoPlayerContainer'); - if (options.backdropUrl) { - dlg.classList.add('videoPlayerContainer-withBackdrop'); - dlg.style.backgroundImage = "url('" + options.backdropUrl + "')"; - } - if (options.fullscreen) { dlg.classList.add('videoPlayerContainer-onTop'); } @@ -1343,6 +1347,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa videoElement.addEventListener('play', onPlay); videoElement.addEventListener('click', onClick); videoElement.addEventListener('dblclick', onDblClick); + if (options.backdropUrl) { + videoElement.poster = options.backdropUrl; + } document.body.insertBefore(dlg, document.body.firstChild); videoDialog = dlg; @@ -1362,15 +1369,11 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa resolve(videoElement); }); } else { + hidePrePlaybackPage(); resolve(videoElement); } }); } else { - if (options.backdropUrl) { - dlg.classList.add('videoPlayerContainer-withBackdrop'); - dlg.style.backgroundImage = "url('" + options.backdropUrl + "')"; - } - resolve(dlg.querySelector('video')); } }); @@ -1412,12 +1415,12 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var list = []; var video = document.createElement('video'); - if (video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === "function" || document.pictureInPictureEnabled) { + if (video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === 'function' || document.pictureInPictureEnabled) { list.push('PictureInPicture'); } else if (browser.ipad) { // Unfortunately this creates a false positive on devices where its' not actually supported if (navigator.userAgent.toLowerCase().indexOf('os 9') === -1) { - if (video.webkitSupportsPresentationMode && video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === "function") { + if (video.webkitSupportsPresentationMode && video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === 'function') { list.push('PictureInPicture'); } } @@ -1432,7 +1435,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } list.push('SetBrightness'); - list.push("SetAspectRatio"); + list.push('SetAspectRatio'); return list; } @@ -1517,8 +1520,8 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa Windows.UI.ViewManagement.ApplicationView.getForCurrentView().tryEnterViewModeAsync(Windows.UI.ViewManagement.ApplicationViewMode.default); } } else { - if (video && video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === "function") { - video.webkitSetPresentationMode(isEnabled ? "picture-in-picture" : "inline"); + if (video && video.webkitSupportsPresentationMode && typeof video.webkitSetPresentationMode === 'function') { + video.webkitSetPresentationMode(isEnabled ? 'picture-in-picture' : 'inline'); } } }; @@ -1532,7 +1535,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } else { var video = this._mediaElement; if (video) { - return video.webkitPresentationMode === "picture-in-picture"; + return video.webkitPresentationMode === 'picture-in-picture'; } } @@ -1555,11 +1558,11 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (video) { if (isEnabled) { video.requestAirPlay().catch(function(err) { - console.error("Error requesting AirPlay", err); + console.error('Error requesting AirPlay', err); }); } else { document.exitAirPLay().catch(function(err) { - console.error("Error exiting AirPlay", err); + console.error('Error exiting AirPlay', err); }); } } @@ -1691,29 +1694,29 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa HtmlVideoPlayer.prototype.setAspectRatio = function (val) { var mediaElement = this._mediaElement; if (mediaElement) { - if ("auto" === val) { - mediaElement.style.removeProperty("object-fit"); + if ('auto' === val) { + mediaElement.style.removeProperty('object-fit'); } else { - mediaElement.style["object-fit"] = val; + mediaElement.style['object-fit'] = val; } } this._currentAspectRatio = val; }; HtmlVideoPlayer.prototype.getAspectRatio = function () { - return this._currentAspectRatio || "auto"; + return this._currentAspectRatio || 'auto'; }; HtmlVideoPlayer.prototype.getSupportedAspectRatios = function () { return [{ - name: "Auto", - id: "auto" + name: 'Auto', + id: 'auto' }, { - name: "Cover", - id: "cover" + name: 'Cover', + id: 'cover' }, { - name: "Fill", - id: "fill" + name: 'Fill', + id: 'fill' }]; }; @@ -1762,7 +1765,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (protocol) { mediaCategory.stats.push({ - label: globalize.translate("LabelProtocol"), + label: globalize.translate('LabelProtocol'), value: protocol }); } @@ -1772,12 +1775,12 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (this._hlsPlayer || this._shakaPlayer) { mediaCategory.stats.push({ - label: globalize.translate("LabelStreamType"), + label: globalize.translate('LabelStreamType'), value: 'HLS' }); } else { mediaCategory.stats.push({ - label: globalize.translate("LabelStreamType"), + label: globalize.translate('LabelStreamType'), value: 'Video' }); } @@ -1795,7 +1798,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa // Don't show player dimensions on smart TVs because the app UI could be lower resolution than the video and this causes users to think there is a problem if (width && height && !browser.tv) { videoCategory.stats.push({ - label: globalize.translate("LabelPlayerDimensions"), + label: globalize.translate('LabelPlayerDimensions'), value: width + 'x' + height }); } @@ -1805,7 +1808,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (width && height) { videoCategory.stats.push({ - label: globalize.translate("LabelVideoResolution"), + label: globalize.translate('LabelVideoResolution'), value: width + 'x' + height }); } @@ -1815,13 +1818,13 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var droppedVideoFrames = playbackQuality.droppedVideoFrames || 0; videoCategory.stats.push({ - label: globalize.translate("LabelDroppedFrames"), + label: globalize.translate('LabelDroppedFrames'), value: droppedVideoFrames }); var corruptedVideoFrames = playbackQuality.corruptedVideoFrames || 0; videoCategory.stats.push({ - label: globalize.translate("LabelCorruptedFrames"), + label: globalize.translate('LabelCorruptedFrames'), value: corruptedVideoFrames }); } diff --git a/src/components/htmlvideoplayer/style.css b/src/components/htmlvideoplayer/style.css index 5ecf4af66..b83a7816f 100644 --- a/src/components/htmlvideoplayer/style.css +++ b/src/components/htmlvideoplayer/style.css @@ -6,20 +6,9 @@ right: 0; display: flex; align-items: center; -} - -.videoPlayerContainer:not(.videoPlayerContainer-withBackdrop) { background: #000 !important; } -.videoPlayerContainer-withBackdrop { - background-repeat: no-repeat; - background-position: center center; - background-size: cover; - background-attachment: fixed; - background-color: #000; -} - .videoPlayerContainer-onTop { z-index: 1000; } diff --git a/src/components/imagedownloader/imagedownloader.js b/src/components/imagedownloader/imagedownloader.js index 9df083aea..3e0d00ac2 100644 --- a/src/components/imagedownloader/imagedownloader.js +++ b/src/components/imagedownloader/imagedownloader.js @@ -109,15 +109,15 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image html += ''; var startAtDisplay = totalRecordCount ? startIndex + 1 : 0; - html += globalize.translate("ListPaging", startAtDisplay, recordsEnd, totalRecordCount); + html += globalize.translate('ListPaging', startAtDisplay, recordsEnd, totalRecordCount); html += ''; if (showControls) { html += '
'; - html += ''; - html += ''; + html += ''; + html += ''; html += '
'; } @@ -144,7 +144,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image } function getDisplayUrl(url, apiClient) { - return apiClient.getUrl("Images/Remote", { imageUrl: url }); + return apiClient.getUrl('Images/Remote', { imageUrl: url }); } function getRemoteImageHtml(image, imageType, apiClient) { @@ -155,21 +155,21 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image var html = ''; - var cssClass = "card scalableCard imageEditorCard"; + var cssClass = 'card scalableCard imageEditorCard'; var cardBoxCssClass = 'cardBox visualCardBox'; var shape = 'backdrop'; - if (imageType === "Backdrop" || imageType === "Art" || imageType === "Thumb" || imageType === "Logo") { + if (imageType === 'Backdrop' || imageType === 'Art' || imageType === 'Thumb' || imageType === 'Logo') { shape = 'backdrop'; - } else if (imageType === "Banner") { + } else if (imageType === 'Banner') { shape = 'banner'; - } else if (imageType === "Disc") { + } else if (imageType === 'Disc') { shape = 'square'; } else { - if (currentItemType === "Episode") { + if (currentItemType === 'Episode') { shape = 'backdrop'; - } else if (currentItemType === "MusicAlbum" || currentItemType === "MusicArtist") { + } else if (currentItemType === 'MusicAlbum' || currentItemType === 'MusicArtist') { shape = 'square'; } else { shape = 'portrait'; @@ -241,18 +241,18 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image html += '
'; - if (image.RatingType === "Likes") { - html += image.CommunityRating + (image.CommunityRating === 1 ? " like" : " likes"); + if (image.RatingType === 'Likes') { + html += image.CommunityRating + (image.CommunityRating === 1 ? ' like' : ' likes'); } else { if (image.CommunityRating) { html += image.CommunityRating.toFixed(1); if (image.VoteCount) { - html += ' • ' + image.VoteCount + (image.VoteCount === 1 ? " vote" : " votes"); + html += ' • ' + image.VoteCount + (image.VoteCount === 1 ? ' vote' : ' votes'); } } else { - html += "Unrated"; + html += 'Unrated'; } } @@ -262,7 +262,7 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image if (enableFooterButtons) { html += '
'; - html += ''; + html += ''; html += '
'; } diff --git a/src/components/imagedownloader/imagedownloader.template.html b/src/components/imagedownloader/imagedownloader.template.html index dec796fb0..6ca2a2418 100644 --- a/src/components/imagedownloader/imagedownloader.template.html +++ b/src/components/imagedownloader/imagedownloader.template.html @@ -1,5 +1,5 @@
- +

${Search}

diff --git a/src/components/imageeditor/imageeditor.js b/src/components/imageeditor/imageeditor.js index 20aebf430..606cdfa71 100644 --- a/src/components/imageeditor/imageeditor.js +++ b/src/components/imageeditor/imageeditor.js @@ -99,10 +99,10 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', var html = ''; - var cssClass = "card scalableCard imageEditorCard"; + var cssClass = 'card scalableCard imageEditorCard'; var cardBoxCssClass = 'cardBox visualCardBox'; - cssClass += " backdropCard backdropCard-scalable"; + cssClass += ' backdropCard backdropCard-scalable'; if (tagName === 'button') { cssClass += ' btnImageCard'; @@ -152,26 +152,26 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', 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 += '
'; } @@ -251,7 +251,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', 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 +260,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', 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 +277,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', 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; @@ -425,7 +425,7 @@ define(['dialogHelper', 'connectionManager', 'loading', 'dom', 'layoutManager', addListeners(context, 'btnDeleteImage', 'click', function () { var type = this.getAttribute('data-imagetype'); var index = this.getAttribute('data-index'); - index = index === "null" ? null : parseInt(index); + index = index === 'null' ? null : parseInt(index); var apiClient = connectionManager.getApiClient(currentItem.ServerId); deleteImage(context, currentItem.Id, type, index, apiClient, true); }); diff --git a/src/components/imageeditor/imageeditor.template.html b/src/components/imageeditor/imageeditor.template.html index 37dce874c..1bf34f1aa 100644 --- a/src/components/imageeditor/imageeditor.template.html +++ b/src/components/imageeditor/imageeditor.template.html @@ -1,5 +1,5 @@
- +

${HeaderEditImages}

@@ -12,10 +12,10 @@

${Images}

@@ -27,10 +27,10 @@

${Backdrops}

@@ -42,10 +42,10 @@

${Screenshots}

diff --git a/src/components/imageoptionseditor/imageoptionseditor.js b/src/components/imageoptionseditor/imageoptionseditor.js index c9dc67809..73a6d119d 100644 --- a/src/components/imageoptionseditor/imageoptionseditor.js +++ b/src/components/imageoptionseditor/imageoptionseditor.js @@ -1,11 +1,11 @@ -define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emby-input"], function (globalize, dom, dialogHelper) { - "use strict"; +define(['globalize', 'dom', 'dialogHelper', 'emby-checkbox', 'emby-select', 'emby-input'], function (globalize, dom, dialogHelper) { + 'use strict'; function getDefaultImageConfig(itemType, type) { return { Type: type, MinWidth: 0, - Limit: "Primary" === type ? 1 : 0 + Limit: 'Primary' === type ? 1 : 0 }; } @@ -21,27 +21,27 @@ define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emb function setVisibilityOfBackdrops(elem, visible) { if (visible) { - elem.classList.remove("hide"); - elem.querySelector("input").setAttribute("required", "required"); + elem.classList.remove('hide'); + elem.querySelector('input').setAttribute('required', 'required'); } else { - elem.classList.add("hide"); - elem.querySelector("input").setAttribute("required", ""); - elem.querySelector("input").removeAttribute("required"); + elem.classList.add('hide'); + elem.querySelector('input').setAttribute('required', ''); + elem.querySelector('input').removeAttribute('required'); } } function loadValues(context, itemType, options, availableOptions) { var supportedImageTypes = availableOptions.SupportedImageTypes || []; - setVisibilityOfBackdrops(context.querySelector(".backdropFields"), -1 != supportedImageTypes.indexOf("Backdrop")); - setVisibilityOfBackdrops(context.querySelector(".screenshotFields"), -1 != supportedImageTypes.indexOf("Screenshot")); - Array.prototype.forEach.call(context.querySelectorAll(".imageType"), function (i) { - var imageType = i.getAttribute("data-imagetype"); - var container = dom.parentWithTag(i, "LABEL"); + setVisibilityOfBackdrops(context.querySelector('.backdropFields'), -1 != supportedImageTypes.indexOf('Backdrop')); + setVisibilityOfBackdrops(context.querySelector('.screenshotFields'), -1 != supportedImageTypes.indexOf('Screenshot')); + Array.prototype.forEach.call(context.querySelectorAll('.imageType'), function (i) { + var imageType = i.getAttribute('data-imagetype'); + var container = dom.parentWithTag(i, 'LABEL'); if (-1 == supportedImageTypes.indexOf(imageType)) { - container.classList.add("hide"); + container.classList.add('hide'); } else { - container.classList.remove("hide"); + container.classList.remove('hide'); } if (getImageConfig(options, availableOptions, imageType, itemType).Limit) { @@ -50,31 +50,31 @@ define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emb i.checked = false; } }); - var backdropConfig = getImageConfig(options, availableOptions, "Backdrop", itemType); - context.querySelector("#txtMaxBackdrops").value = backdropConfig.Limit; - context.querySelector("#txtMinBackdropDownloadWidth").value = backdropConfig.MinWidth; - var screenshotConfig = getImageConfig(options, availableOptions, "Screenshot", itemType); - context.querySelector("#txtMaxScreenshots").value = screenshotConfig.Limit; - context.querySelector("#txtMinScreenshotDownloadWidth").value = screenshotConfig.MinWidth; + var backdropConfig = getImageConfig(options, availableOptions, 'Backdrop', itemType); + context.querySelector('#txtMaxBackdrops').value = backdropConfig.Limit; + context.querySelector('#txtMinBackdropDownloadWidth').value = backdropConfig.MinWidth; + var screenshotConfig = getImageConfig(options, availableOptions, 'Screenshot', itemType); + context.querySelector('#txtMaxScreenshots').value = screenshotConfig.Limit; + context.querySelector('#txtMinScreenshotDownloadWidth').value = screenshotConfig.MinWidth; } function saveValues(context, options) { - options.ImageOptions = Array.prototype.map.call(context.querySelectorAll(".imageType:not(.hide)"), function (c) { + options.ImageOptions = Array.prototype.map.call(context.querySelectorAll('.imageType:not(.hide)'), function (c) { return { - Type: c.getAttribute("data-imagetype"), + Type: c.getAttribute('data-imagetype'), Limit: c.checked ? 1 : 0, MinWidth: 0 }; }); options.ImageOptions.push({ - Type: "Backdrop", - Limit: context.querySelector("#txtMaxBackdrops").value, - MinWidth: context.querySelector("#txtMinBackdropDownloadWidth").value + Type: 'Backdrop', + Limit: context.querySelector('#txtMaxBackdrops').value, + MinWidth: context.querySelector('#txtMinBackdropDownloadWidth').value }); options.ImageOptions.push({ - Type: "Screenshot", - Limit: context.querySelector("#txtMaxScreenshots").value, - MinWidth: context.querySelector("#txtMinScreenshotDownloadWidth").value + Type: 'Screenshot', + Limit: context.querySelector('#txtMaxScreenshots').value, + MinWidth: context.querySelector('#txtMinScreenshotDownloadWidth').value }); } @@ -82,23 +82,23 @@ define(["globalize", "dom", "dialogHelper", "emby-checkbox", "emby-select", "emb this.show = function (itemType, options, availableOptions) { return new Promise(function (resolve, reject) { var xhr = new XMLHttpRequest(); - xhr.open("GET", "components/imageoptionseditor/imageoptionseditor.template.html", true); + xhr.open('GET', 'components/imageoptionseditor/imageoptionseditor.template.html', true); xhr.onload = function (e) { var template = this.response; var dlg = dialogHelper.createDialog({ - size: "medium-tall", + size: 'medium-tall', removeOnClose: true, scrollY: false }); - dlg.classList.add("formDialog"); + dlg.classList.add('formDialog'); dlg.innerHTML = globalize.translateDocument(template); - dlg.addEventListener("close", function () { + dlg.addEventListener('close', function () { saveValues(dlg, options); }); loadValues(dlg, itemType, options, availableOptions); dialogHelper.open(dlg).then(resolve, resolve); - dlg.querySelector(".btnCancel").addEventListener("click", function () { + dlg.querySelector('.btnCancel').addEventListener('click', function () { dialogHelper.close(dlg); }); }; diff --git a/src/components/imageoptionseditor/imageoptionseditor.template.html b/src/components/imageoptionseditor/imageoptionseditor.template.html index 910d8fdd6..cbbc3b85f 100644 --- a/src/components/imageoptionseditor/imageoptionseditor.template.html +++ b/src/components/imageoptionseditor/imageoptionseditor.template.html @@ -1,5 +1,5 @@
- +

${HeaderImageOptions}

diff --git a/src/components/images/imageFetcher.js b/src/components/images/imageFetcher.js index 1e13cebc7..c6882ddb7 100644 --- a/src/components/images/imageFetcher.js +++ b/src/components/images/imageFetcher.js @@ -7,7 +7,7 @@ define(['dom'], function (dom) { return Promise.reject('elem cannot be null'); } - if (elem.tagName !== "IMG") { + if (elem.tagName !== 'IMG') { elem.style.backgroundImage = "url('" + url + "')"; return Promise.resolve(); @@ -27,7 +27,7 @@ define(['dom'], function (dom) { dom.addEventListener(elem, 'load', resolve, { once: true }); - elem.setAttribute("src", url); + elem.setAttribute('src', url); }); } diff --git a/src/components/images/imageLoader.js b/src/components/images/imageLoader.js index 28b6923c3..f23b407de 100644 --- a/src/components/images/imageLoader.js +++ b/src/components/images/imageLoader.js @@ -1,50 +1,82 @@ -define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', 'userSettings', 'require', 'css!./style'], function (lazyLoader, imageFetcher, layoutManager, browser, appSettings, userSettings, require) { - 'use strict'; - - var self = {}; - - function fillImage(elem, source, enableEffects) { - - if (!elem) { - throw new Error('elem cannot be null'); - } - - if (!source) { - source = elem.getAttribute('data-src'); - } +import * as lazyLoader from 'lazyLoader'; +import * as userSettings from 'userSettings'; +import 'css!./style'; +/* eslint-disable indent */ + export function lazyImage(elem, source = elem.getAttribute('data-src')) { if (!source) { return; } - fillImageElement(elem, source, enableEffects); + fillImageElement(elem, source); } - function fillImageElement(elem, source, enableEffects) { - imageFetcher.loadImage(elem, source).then(function () { + export function fillImage(entry) { + if (!entry) { + throw new Error('entry cannot be null'); + } - if (enableEffects !== false) { - fadeIn(elem); - } - - elem.removeAttribute("data-src"); - }); - } - - function fadeIn(elem) { - if (userSettings.enableFastFadein()) { - elem.classList.add('lazy-image-fadein-fast'); + var source = undefined; + if (entry.target) { + source = entry.target.getAttribute('data-src'); } else { - elem.classList.add('lazy-image-fadein'); + source = entry; + } + + if (entry.intersectionRatio > 0) { + if (source) fillImageElement(entry.target, source); + } else if (!source) { + emptyImageElement(entry.target); } } - function lazyChildren(elem) { + function fillImageElement(elem, url) { + if (url === undefined) { + throw new Error('url cannot be undefined'); + } + let preloaderImg = new Image(); + preloaderImg.src = url; + + preloaderImg.addEventListener('load', () => { + if (elem.tagName !== 'IMG') { + elem.style.backgroundImage = "url('" + url + "')"; + } else { + elem.setAttribute('src', url); + } + + if (userSettings.enableFastFadein()) { + elem.classList.add('lazy-image-fadein-fast'); + } else { + elem.classList.add('lazy-image-fadein'); + } + + elem.removeAttribute('data-src'); + }); + } + + function emptyImageElement(elem) { + var url; + + if (elem.tagName !== 'IMG') { + url = elem.style.backgroundImage.slice(4, -1).replace(/"/g, ''); + elem.style.backgroundImage = 'none'; + } else { + url = elem.getAttribute('src'); + elem.setAttribute('src', ''); + } + + elem.setAttribute('data-src', url); + + elem.classList.remove('lazy-image-fadein-fast'); + elem.classList.remove('lazy-image-fadein'); + } + + export function lazyChildren(elem) { lazyLoader.lazyChildren(elem, fillImage); } - function getPrimaryImageAspectRatio(items) { + export function getPrimaryImageAspectRatio(items) { var values = []; @@ -104,7 +136,7 @@ define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', return result; } - function fillImages(elems) { + export function fillImages(elems) { for (var i = 0, length = elems.length; i < length; i++) { var elem = elems[0]; @@ -112,10 +144,11 @@ define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', } } - self.fillImages = fillImages; - self.lazyImage = fillImage; - self.lazyChildren = lazyChildren; - self.getPrimaryImageAspectRatio = getPrimaryImageAspectRatio; - - return self; -}); +/* eslint-enable indent */ +export default { + fillImages: fillImages, + fillImage: fillImage, + lazyImage: lazyImage, + lazyChildren: lazyChildren, + getPrimaryImageAspectRatio: getPrimaryImageAspectRatio +}; diff --git a/src/components/images/style.css b/src/components/images/style.css index 2836dd015..2b9422d55 100644 --- a/src/components/images/style.css +++ b/src/components/images/style.css @@ -1,44 +1,13 @@ -.lazy-image-fadein { +.cardImageContainer.lazy { opacity: 0; - animation: lazy-image-fadein 330ms ease-in normal both; - -webkit-animation-duration: 0.8s; - -moz-animation-duration: 0.8s; - -o-animation-duration: 0.8s; - animation-duration: 0.8s; - -webkit-animation-name: popInAnimation; - -moz-animation-name: popInAnimation; - -o-animation-name: popInAnimation; - animation-name: popInAnimation; - -webkit-animation-fill-mode: forwards; - -moz-animation-fill-mode: forwards; - -o-animation-fill-mode: forwards; - animation-fill-mode: forwards; - -webkit-animation-timing-function: cubic-bezier(0, 0, 0.5, 1); - -moz-animation-timing-function: cubic-bezier(0, 0, 0.5, 1); - -o-animation-timing-function: cubic-bezier(0, 0, 0.5, 1); - animation-timing-function: cubic-bezier(0, 0, 0.5, 1); } -.lazy-image-fadein-fast { - animation: lazy-image-fadein 160ms ease-in normal both; +.cardImageContainer.lazy.lazy-image-fadein { + opacity: 1; + transition: opacity 0.7s; } -@keyframes lazy-image-fadein { - from { - opacity: 0; - } - - to { - opacity: 1; - } -} - -@keyframes popInAnimation { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } +.cardImageContainer.lazy.lazy-image-fadein-fast { + opacity: 1; + transition: opacity 0.2s; } diff --git a/src/components/imageuploader/imageuploader.js b/src/components/imageuploader/imageuploader.js index 400646f66..87ecc1bc3 100644 --- a/src/components/imageuploader/imageuploader.js +++ b/src/components/imageuploader/imageuploader.js @@ -74,7 +74,7 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' return false; } - if (!file.type.startsWith("image/")) { + if (!file.type.startsWith('image/')) { require(['toast'], function (toast) { toast(globalize.translate('MessageImageFileTypeAllowed')); }); @@ -87,9 +87,9 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' var dlg = dom.parentWithClass(this, 'dialog'); var imageType = dlg.querySelector('#selectImageType').value; - if (imageType === "None") { - require(["toast"], function(toast) { - toast(globalize.translate("MessageImageTypeNotSelected")); + if (imageType === 'None') { + require(['toast'], function(toast) { + toast(globalize.translate('MessageImageTypeNotSelected')); }); e.preventDefault(); return false; @@ -112,11 +112,11 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' page.querySelector('form').addEventListener('submit', onSubmit); - page.querySelector('#uploadImage').addEventListener("change", function () { + page.querySelector('#uploadImage').addEventListener('change', function () { setFiles(page, this.files); }); - page.querySelector('.btnBrowse').addEventListener("click", function () { + page.querySelector('.btnBrowse').addEventListener('click', function () { page.querySelector('#uploadImage').click(); }); } diff --git a/src/components/imageuploader/imageuploader.template.html b/src/components/imageuploader/imageuploader.template.html index 1b83b5095..75f572375 100644 --- a/src/components/imageuploader/imageuploader.template.html +++ b/src/components/imageuploader/imageuploader.template.html @@ -1,5 +1,5 @@
- +

${HeaderUploadImage}

@@ -14,7 +14,7 @@

${HeaderAddUpdateImage}

diff --git a/src/components/indicators/indicators.js b/src/components/indicators/indicators.js index 633706d20..7bc8ddd4e 100644 --- a/src/components/indicators/indicators.js +++ b/src/components/indicators/indicators.js @@ -1,198 +1,183 @@ -define(['datetime', 'itemHelper', 'emby-progressbar', 'css!./indicators.css', 'material-icons'], function (datetime, itemHelper) { - 'use strict'; +import datetime from 'datetime'; +import itemHelper from 'itemHelper'; +import 'emby-progressbar'; +import 'css!./indicators.css'; +import 'material-icons'; - function enableProgressIndicator(item) { - if (item.MediaType === 'Video') { - if (item.Type !== 'TvChannel') { - return true; - } - } - - if (item.Type === 'AudioBook' || item.Type === 'AudioPodcast') { - return true; - } - - return false; +export function enableProgressIndicator(item) { + if (item.MediaType === 'Video' && item.Type !== 'TvChannel') { + return true; } - function getProgressHtml(pct, options) { - var containerClass = 'itemProgressBar'; - if (options) { - if (options.containerClass) { - containerClass += ' ' + options.containerClass; - } - } - - return '
'; + if (item.Type === 'AudioBook' || item.Type === 'AudioPodcast') { + return true; } - function getAutoTimeProgressHtml(pct, options, isRecording, start, end) { - var containerClass = 'itemProgressBar'; - if (options) { - if (options.containerClass) { - containerClass += ' ' + options.containerClass; - } - } + return false; +} - var foregroundClass = 'itemProgressBarForeground'; - if (isRecording) { - foregroundClass += ' itemProgressBarForeground-recording'; - } - - return '
'; +export function getProgressHtml(pct, options) { + let containerClass = 'itemProgressBar'; + if (options && options.containerClass) { + containerClass += ' ' + options.containerClass; } - function getProgressBarHtml(item, options) { - var pct; - if (enableProgressIndicator(item) && item.Type !== "Recording") { - var userData = options ? (options.userData || item.UserData) : item.UserData; - if (userData) { - pct = userData.PlayedPercentage; - if (pct && pct < 100) { - return getProgressHtml(pct, options); - } + return '
'; +} + +function getAutoTimeProgressHtml(pct, options, isRecording, start, end) { + let containerClass = 'itemProgressBar'; + if (options && options.containerClass) { + containerClass += ' ' + options.containerClass; + } + + let foregroundClass = 'itemProgressBarForeground'; + if (isRecording) { + foregroundClass += ' itemProgressBarForeground-recording'; + } + + return '
'; +} + +export function getProgressBarHtml(item, options) { + let pct; + if (enableProgressIndicator(item) && item.Type !== 'Recording') { + const userData = options && options.userData ? options.userData : item.UserData; + + if (userData) { + pct = userData.PlayedPercentage; + if (pct && pct < 100) { + return getProgressHtml(pct, options); } } + } - if ((item.Type === 'Program' || item.Type === 'Timer' || item.Type === 'Recording') && item.StartDate && item.EndDate) { - var startDate = 0; - var endDate = 1; + if ((item.Type === 'Program' || item.Type === 'Timer' || item.Type === 'Recording') && item.StartDate && item.EndDate) { + let startDate = 0; + let endDate = 1; + try { + startDate = datetime.parseISO8601Date(item.StartDate).getTime(); + endDate = datetime.parseISO8601Date(item.EndDate).getTime(); + } catch (err) { + console.error(err); + } + + const now = new Date().getTime(); + const total = endDate - startDate; + pct = 100 * ((now - startDate) / total); + + if (pct > 0 && pct < 100) { + const isRecording = item.Type === 'Timer' || item.Type === 'Recording' || item.TimerId; + return getAutoTimeProgressHtml(pct, options, isRecording, startDate, endDate); + } + } + + return ''; +} + +export function enablePlayedIndicator(item) { + return itemHelper.canMarkPlayed(item); +} + +export function getPlayedIndicatorHtml(item) { + if (enablePlayedIndicator(item)) { + let userData = item.UserData || {}; + if (userData.UnplayedItemCount) { + return '
' + userData.UnplayedItemCount + '
'; + } + + if (userData.PlayedPercentage && userData.PlayedPercentage >= 100 || (userData.Played)) { + return '
'; + } + } + + return ''; +} + +export function getChildCountIndicatorHtml(item, options) { + const minCount = options && options.minCount ? options.minCount : 0; + + if (item.ChildCount && item.ChildCount > minCount) { + return '
' + item.ChildCount + '
'; + } + + return ''; +} + +export function getTimerIndicator(item) { + let 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 ''; +} + +export function getSyncIndicator(item) { + if (item.SyncPercent === 100) { + return '
'; + } else if (item.SyncPercent != null) { + return '
'; + } + + return ''; +} + +export function getTypeIndicator(item) { + const iconT = { + 'Video' : 'videocam', + 'Folder' : 'folder', + 'PhotoAlbum' : 'photo_album', + 'Photo' : 'photo' + }; + + const icon = iconT[item.Type]; + return icon ? '
' : ''; +} + +export function getMissingIndicator(item) { + if (item.Type === 'Episode' && item.LocationType === 'Virtual') { + if (item.PremiereDate) { try { - startDate = datetime.parseISO8601Date(item.StartDate).getTime(); - endDate = datetime.parseISO8601Date(item.EndDate).getTime(); + const premiereDate = datetime.parseISO8601Date(item.PremiereDate).getTime(); + if (premiereDate > new Date().getTime()) { + return '
Unaired
'; + } } catch (err) { console.error(err); } - - var now = new Date().getTime(); - var total = endDate - startDate; - pct = 100 * ((now - startDate) / total); - - if (pct > 0 && pct < 100) { - var isRecording = item.Type === 'Timer' || item.Type === 'Recording' || item.TimerId; - return getAutoTimeProgressHtml(pct, options, isRecording, startDate, endDate); - } } - - return ''; + return '
Missing
'; } - function enablePlayedIndicator(item) { - return itemHelper.canMarkPlayed(item); - } + return ''; +} - function getPlayedIndicator(item) { - if (enablePlayedIndicator(item)) { - var userData = item.UserData || {}; - if (userData.UnplayedItemCount) { - return '
' + userData.UnplayedItemCount + '
'; - } - - if (userData.PlayedPercentage && userData.PlayedPercentage >= 100 || (userData.Played)) { - return '
check
'; - } - } - - return ''; - } - - function getCountIndicatorHtml(count) { - return '
' + count + '
'; - } - - function getChildCountIndicatorHtml(item, options) { - var minCount = 0; - if (options) { - minCount = options.minCount || minCount; - } - - if (item.ChildCount && item.ChildCount > minCount) { - return getCountIndicatorHtml(item.ChildCount); - } - - return ''; - } - - 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 getSyncIndicator(item) { - if (item.SyncPercent === 100) { - return '
'; - } else if (item.SyncPercent != null) { - return '
'; - } - - return ''; - } - - function getTypeIndicator(item) { - if (item.Type === 'Video') { - return '
videocam
'; - } - if (item.Type === 'Folder') { - return '
folder
'; - } - if (item.Type === 'PhotoAlbum') { - return '
'; - } - if (item.Type === 'Photo') { - return '
photo
'; - } - - return ''; - } - - function getMissingIndicator(item) { - if (item.Type === 'Episode' && item.LocationType === 'Virtual') { - if (item.PremiereDate) { - try { - var premiereDate = datetime.parseISO8601Date(item.PremiereDate).getTime(); - if (premiereDate > new Date().getTime()) { - return '
Unaired
'; - } - } catch (err) { - console.error(err); - } - } - return '
Missing
'; - } - - return ''; - } - - return { - getProgressHtml: getProgressHtml, - getProgressBarHtml: getProgressBarHtml, - getPlayedIndicatorHtml: getPlayedIndicator, - getChildCountIndicatorHtml: getChildCountIndicatorHtml, - enableProgressIndicator: enableProgressIndicator, - getTimerIndicator: getTimerIndicator, - enablePlayedIndicator: enablePlayedIndicator, - getSyncIndicator: getSyncIndicator, - getTypeIndicator: getTypeIndicator, - getMissingIndicator: getMissingIndicator - }; -}); +export default { + getProgressHtml: getProgressHtml, + getProgressBarHtml: getProgressBarHtml, + getPlayedIndicatorHtml: getPlayedIndicatorHtml, + getChildCountIndicatorHtml: getChildCountIndicatorHtml, + enableProgressIndicator: enableProgressIndicator, + getTimerIndicator: getTimerIndicator, + enablePlayedIndicator: enablePlayedIndicator, + getSyncIndicator: getSyncIndicator, + getTypeIndicator: getTypeIndicator, + getMissingIndicator: getMissingIndicator +}; diff --git a/src/components/itemMediaInfo/itemMediaInfo.js b/src/components/itemMediaInfo/itemMediaInfo.js index ff2ec626d..81c84b6a2 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.js +++ b/src/components/itemMediaInfo/itemMediaInfo.js @@ -1,145 +1,145 @@ -define(["dialogHelper", "require", "layoutManager", "globalize", "userSettings", "connectionManager", "loading", "focusManager", "dom", "apphost", "emby-select", "listViewStyle", "paper-icon-button-light", "css!./../formdialog", "material-icons", "emby-button", "flexStyles"], function (dialogHelper, require, layoutManager, globalize, userSettings, connectionManager, loading, focusManager, dom, appHost) { - "use strict"; +define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', 'connectionManager', 'loading', 'focusManager', 'dom', 'apphost', 'emby-select', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'emby-button', 'flexStyles'], function (dialogHelper, require, layoutManager, globalize, userSettings, connectionManager, loading, focusManager, dom, appHost) { + 'use strict'; function setMediaInfo(user, page, item) { var html = item.MediaSources.map(function (version) { return getMediaSourceHtml(user, item, version); }).join('
'); if (item.MediaSources.length > 1) { - html = "
" + html; + html = '
' + html; } - var mediaInfoContent = page.querySelector("#mediaInfoContent"); + var mediaInfoContent = page.querySelector('#mediaInfoContent'); mediaInfoContent.innerHTML = html; } function getMediaSourceHtml(user, item, version) { - var html = ""; + var html = ''; if (version.Name) { - html += '

' + version.Name + "

"; + html += '

' + version.Name + '

'; } if (version.Container) { - html += createAttribute(globalize.translate("MediaInfoContainer"), version.Container) + "
"; + html += createAttribute(globalize.translate('MediaInfoContainer'), version.Container) + '
'; } if (version.Formats && version.Formats.length) { - html += createAttribute(globalize.translate("MediaInfoFormat"), version.Formats.join(",")) + "
"; + html += createAttribute(globalize.translate('MediaInfoFormat'), version.Formats.join(',')) + '
'; } if (version.Path && user && user.Policy.IsAdministrator) { - html += createAttribute(globalize.translate("MediaInfoPath"), version.Path) + "
"; + html += createAttribute(globalize.translate('MediaInfoPath'), version.Path) + '
'; } if (version.Size) { - var size = (version.Size / (1024 * 1024)).toFixed(0) + " MB"; - html += createAttribute(globalize.translate("MediaInfoSize"), size) + "
"; + var size = (version.Size / (1024 * 1024)).toFixed(0) + ' MB'; + html += createAttribute(globalize.translate('MediaInfoSize'), size) + '
'; } for (var i = 0, length = version.MediaStreams.length; i < length; i++) { var stream = version.MediaStreams[i]; - if (stream.Type === "Data") { + if (stream.Type === 'Data') { continue; } html += '
'; - var displayType = globalize.translate("MediaInfoStreamType" + stream.Type); - html += '

' + displayType + "

"; + var displayType = globalize.translate('MediaInfoStreamType' + stream.Type); + html += '

' + displayType + '

'; var attributes = []; if (stream.DisplayTitle) { - attributes.push(createAttribute("Title", stream.DisplayTitle)); + attributes.push(createAttribute('Title', stream.DisplayTitle)); } - if (stream.Language && stream.Type !== "Video") { - attributes.push(createAttribute(globalize.translate("MediaInfoLanguage"), stream.Language)); + if (stream.Language && stream.Type !== 'Video') { + attributes.push(createAttribute(globalize.translate('MediaInfoLanguage'), stream.Language)); } if (stream.Codec) { - attributes.push(createAttribute(globalize.translate("MediaInfoCodec"), stream.Codec.toUpperCase())); + attributes.push(createAttribute(globalize.translate('MediaInfoCodec'), stream.Codec.toUpperCase())); } if (stream.CodecTag) { - attributes.push(createAttribute(globalize.translate("MediaInfoCodecTag"), stream.CodecTag)); + attributes.push(createAttribute(globalize.translate('MediaInfoCodecTag'), stream.CodecTag)); } if (stream.IsAVC != null) { - attributes.push(createAttribute("AVC", (stream.IsAVC ? "Yes" : "No"))); + attributes.push(createAttribute('AVC', (stream.IsAVC ? 'Yes' : 'No'))); } if (stream.Profile) { - attributes.push(createAttribute(globalize.translate("MediaInfoProfile"), stream.Profile)); + attributes.push(createAttribute(globalize.translate('MediaInfoProfile'), stream.Profile)); } if (stream.Level) { - attributes.push(createAttribute(globalize.translate("MediaInfoLevel"), stream.Level)); + attributes.push(createAttribute(globalize.translate('MediaInfoLevel'), stream.Level)); } if (stream.Width || stream.Height) { - attributes.push(createAttribute(globalize.translate("MediaInfoResolution"), stream.Width + "x" + stream.Height)); + attributes.push(createAttribute(globalize.translate('MediaInfoResolution'), stream.Width + 'x' + stream.Height)); } - if (stream.AspectRatio && stream.Codec !== "mjpeg") { - attributes.push(createAttribute(globalize.translate("MediaInfoAspectRatio"), stream.AspectRatio)); + if (stream.AspectRatio && stream.Codec !== 'mjpeg') { + attributes.push(createAttribute(globalize.translate('MediaInfoAspectRatio'), stream.AspectRatio)); } - if (stream.Type === "Video") { + if (stream.Type === 'Video') { if (stream.IsAnamorphic != null) { - attributes.push(createAttribute(globalize.translate("MediaInfoAnamorphic"), (stream.IsAnamorphic ? "Yes" : "No"))); + attributes.push(createAttribute(globalize.translate('MediaInfoAnamorphic'), (stream.IsAnamorphic ? 'Yes' : 'No'))); } - attributes.push(createAttribute(globalize.translate("MediaInfoInterlaced"), (stream.IsInterlaced ? "Yes" : "No"))); + attributes.push(createAttribute(globalize.translate('MediaInfoInterlaced'), (stream.IsInterlaced ? 'Yes' : 'No'))); } if (stream.AverageFrameRate || stream.RealFrameRate) { - attributes.push(createAttribute(globalize.translate("MediaInfoFramerate"), (stream.AverageFrameRate || stream.RealFrameRate))); + attributes.push(createAttribute(globalize.translate('MediaInfoFramerate'), (stream.AverageFrameRate || stream.RealFrameRate))); } if (stream.ChannelLayout) { - attributes.push(createAttribute(globalize.translate("MediaInfoLayout"), stream.ChannelLayout)); + attributes.push(createAttribute(globalize.translate('MediaInfoLayout'), stream.ChannelLayout)); } if (stream.Channels) { - attributes.push(createAttribute(globalize.translate("MediaInfoChannels"), stream.Channels + " ch")); + attributes.push(createAttribute(globalize.translate('MediaInfoChannels'), stream.Channels + ' ch')); } - if (stream.BitRate && stream.Codec !== "mjpeg") { - attributes.push(createAttribute(globalize.translate("MediaInfoBitrate"), (parseInt(stream.BitRate / 1000)) + " kbps")); + if (stream.BitRate && stream.Codec !== 'mjpeg') { + attributes.push(createAttribute(globalize.translate('MediaInfoBitrate'), (parseInt(stream.BitRate / 1000)) + ' kbps')); } if (stream.SampleRate) { - attributes.push(createAttribute(globalize.translate("MediaInfoSampleRate"), stream.SampleRate + " Hz")); + attributes.push(createAttribute(globalize.translate('MediaInfoSampleRate'), stream.SampleRate + ' Hz')); } if (stream.BitDepth) { - attributes.push(createAttribute(globalize.translate("MediaInfoBitDepth"), stream.BitDepth + " bit")); + attributes.push(createAttribute(globalize.translate('MediaInfoBitDepth'), stream.BitDepth + ' bit')); } if (stream.PixelFormat) { - attributes.push(createAttribute(globalize.translate("MediaInfoPixelFormat"), stream.PixelFormat)); + attributes.push(createAttribute(globalize.translate('MediaInfoPixelFormat'), stream.PixelFormat)); } if (stream.RefFrames) { - attributes.push(createAttribute(globalize.translate("MediaInfoRefFrames"), stream.RefFrames)); + attributes.push(createAttribute(globalize.translate('MediaInfoRefFrames'), stream.RefFrames)); } if (stream.NalLengthSize) { - attributes.push(createAttribute("NAL", stream.NalLengthSize)); + attributes.push(createAttribute('NAL', stream.NalLengthSize)); } - if (stream.Type !== "Video") { - attributes.push(createAttribute(globalize.translate("MediaInfoDefault"), (stream.IsDefault ? "Yes" : "No"))); + if (stream.Type !== 'Video') { + attributes.push(createAttribute(globalize.translate('MediaInfoDefault'), (stream.IsDefault ? 'Yes' : 'No'))); } - if (stream.Type === "Subtitle") { - attributes.push(createAttribute(globalize.translate("MediaInfoForced"), (stream.IsForced ? "Yes" : "No"))); - attributes.push(createAttribute(globalize.translate("MediaInfoExternal"), (stream.IsExternal ? "Yes" : "No"))); + if (stream.Type === 'Subtitle') { + attributes.push(createAttribute(globalize.translate('MediaInfoForced'), (stream.IsForced ? 'Yes' : 'No'))); + attributes.push(createAttribute(globalize.translate('MediaInfoExternal'), (stream.IsExternal ? 'Yes' : 'No'))); } - if (stream.Type === "Video" && version.Timestamp) { - attributes.push(createAttribute(globalize.translate("MediaInfoTimestamp"), version.Timestamp)); + if (stream.Type === 'Video' && version.Timestamp) { + attributes.push(createAttribute(globalize.translate('MediaInfoTimestamp'), version.Timestamp)); } - html += attributes.join("
"); - html += "
"; + html += attributes.join('
'); + html += '
'; } return html; } function createAttribute(label, value) { - return '' + label + '' + value + ""; + return '' + label + '' + value + ''; } function showMediaInfoMore(itemId, serverId, template) { var apiClient = connectionManager.getApiClient(serverId); return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function (item) { var dialogOptions = { - size: "small", + size: 'small', removeOnClose: true, scrollY: false }; if (layoutManager.tv) { - dialogOptions.size = "fullscreen"; + dialogOptions.size = 'fullscreen'; } var dlg = dialogHelper.createDialog(dialogOptions); - dlg.classList.add("formDialog"); - var html = ""; - html += globalize.translateDocument(template, "core"); + dlg.classList.add('formDialog'); + var html = ''; + html += globalize.translateDocument(template, 'core'); dlg.innerHTML = html; if (layoutManager.tv) { - dlg.querySelector(".formDialogContent"); + dlg.querySelector('.formDialogContent'); } dialogHelper.open(dlg); - dlg.querySelector(".btnCancel").addEventListener("click", function (e) { + dlg.querySelector('.btnCancel').addEventListener('click', function (e) { dialogHelper.close(dlg); }); apiClient.getCurrentUser().then(function (user) { @@ -152,7 +152,7 @@ define(["dialogHelper", "require", "layoutManager", "globalize", "userSettings", function showMediaInfo(itemId, serverId) { loading.show(); return new Promise(function (resolve, reject) { - require(["text!./itemMediaInfo.template.html"], function (template) { + require(['text!./itemMediaInfo.template.html'], function (template) { showMediaInfoMore(itemId, serverId, template).then(resolve, reject); }); }); diff --git a/src/components/itemMediaInfo/itemMediaInfo.template.html b/src/components/itemMediaInfo/itemMediaInfo.template.html index d5f583dca..bc8ce5968 100644 --- a/src/components/itemMediaInfo/itemMediaInfo.template.html +++ b/src/components/itemMediaInfo/itemMediaInfo.template.html @@ -1,6 +1,6 @@

${HeaderMediaInfo}

diff --git a/src/components/itemcontextmenu.js b/src/components/itemcontextmenu.js index eec46899a..8c809a096 100644 --- a/src/components/itemcontextmenu.js +++ b/src/components/itemcontextmenu.js @@ -1,5 +1,5 @@ -define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", "playbackManager", "loading", "appSettings", "browser", "actionsheet"], function (appHost, globalize, connectionManager, itemHelper, appRouter, playbackManager, loading, appSettings, browser, actionsheet) { - "use strict"; +define(['apphost', 'globalize', 'connectionManager', 'itemHelper', 'appRouter', 'playbackManager', 'loading', 'appSettings', 'browser', 'actionsheet'], function (appHost, globalize, connectionManager, itemHelper, appRouter, playbackManager, loading, appSettings, browser, actionsheet) { + 'use strict'; function getCommands(options) { var item = options.item; @@ -10,20 +10,20 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", var commands = []; - if (canPlay && item.MediaType !== "Photo") { + if (canPlay && item.MediaType !== 'Photo') { if (options.play !== false) { commands.push({ - name: globalize.translate("Play"), - id: "resume", - icon: "" + name: globalize.translate('Play'), + id: 'resume', + icon: 'play_arrow' }); } - if (options.playAllFromHere && item.Type !== "Program" && item.Type !== "TvChannel") { + if (options.playAllFromHere && item.Type !== 'Program' && item.Type !== 'TvChannel') { commands.push({ - name: globalize.translate("PlayAllFromHere"), - id: "playallfromhere", - icon: "" + name: globalize.translate('PlayAllFromHere'), + id: 'playallfromhere', + icon: 'play_arrow' }); } } @@ -31,17 +31,17 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", if (playbackManager.canQueue(item)) { if (options.queue !== false) { commands.push({ - name: globalize.translate("AddToPlayQueue"), - id: "queue", - icon: "playlist_add" + name: globalize.translate('AddToPlayQueue'), + id: 'queue', + icon: 'playlist_add' }); } if (options.queue !== false) { commands.push({ - name: globalize.translate("PlayNext"), - id: "queuenext", - icon: "playlist_add" + name: globalize.translate('PlayNext'), + id: 'queuenext', + icon: 'playlist_add' }); } @@ -53,24 +53,24 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", //} } - if (item.IsFolder || item.Type === "MusicArtist" || item.Type === "MusicGenre") { - if (item.CollectionType !== "livetv") { + if (item.IsFolder || item.Type === 'MusicArtist' || item.Type === 'MusicGenre') { + if (item.CollectionType !== 'livetv') { if (options.shuffle !== false) { commands.push({ - name: globalize.translate("Shuffle"), - id: "shuffle", - icon: "shuffle" + name: globalize.translate('Shuffle'), + id: 'shuffle', + icon: 'shuffle' }); } } } - if (item.MediaType === "Audio" || item.Type === "MusicAlbum" || item.Type === "MusicArtist" || item.Type === "MusicGenre") { + if (item.MediaType === 'Audio' || item.Type === 'MusicAlbum' || item.Type === 'MusicArtist' || item.Type === 'MusicGenre') { if (options.instantMix !== false && !itemHelper.isLocalItem(item)) { commands.push({ - name: globalize.translate("InstantMix"), - id: "instantmix", - icon: "explore" + name: globalize.translate('InstantMix'), + id: 'instantmix', + icon: 'explore' }); } } @@ -84,74 +84,74 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", if (!restrictOptions) { if (itemHelper.supportsAddingToCollection(item)) { commands.push({ - name: globalize.translate("AddToCollection"), - id: "addtocollection", - icon: "playlist_add" + name: globalize.translate('AddToCollection'), + id: 'addtocollection', + icon: 'playlist_add' }); } if (itemHelper.supportsAddingToPlaylist(item) && options.playlist !== false) { commands.push({ - name: globalize.translate("AddToPlaylist"), - id: "addtoplaylist", - icon: "playlist_add" + name: globalize.translate('AddToPlaylist'), + id: 'addtoplaylist', + icon: 'playlist_add' }); } } - if ((item.Type === "Timer") && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { + if ((item.Type === 'Timer') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { commands.push({ - name: globalize.translate("CancelRecording"), - id: "canceltimer", - icon: "cancel" + name: globalize.translate('CancelRecording'), + id: 'canceltimer', + icon: 'cancel' }); } - if ((item.Type === "Recording" && item.Status === "InProgress") && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { + if ((item.Type === 'Recording' && item.Status === 'InProgress') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { commands.push({ - name: globalize.translate("CancelRecording"), - id: "canceltimer", - icon: "cancel" + name: globalize.translate('CancelRecording'), + id: 'canceltimer', + icon: 'cancel' }); } - if ((item.Type === "SeriesTimer") && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { + if ((item.Type === 'SeriesTimer') && user.Policy.EnableLiveTvManagement && options.cancelTimer !== false) { commands.push({ - name: globalize.translate("CancelSeries"), - id: "cancelseriestimer", - icon: "cancel" + name: globalize.translate('CancelSeries'), + id: 'cancelseriestimer', + icon: 'cancel' }); } if (item.CanDelete && options.deleteItem !== false) { - if (item.Type === "Playlist" || item.Type === "BoxSet") { + if (item.Type === 'Playlist' || item.Type === 'BoxSet') { commands.push({ - name: globalize.translate("Delete"), - id: "delete", - icon: "delete" + name: globalize.translate('Delete'), + id: 'delete', + icon: 'delete' }); } else { commands.push({ - name: globalize.translate("DeleteMedia"), - id: "delete", - icon: "delete" + name: globalize.translate('DeleteMedia'), + id: 'delete', + icon: 'delete' }); } } // Books are promoted to major download Button and therefor excluded in the context menu - if ((item.CanDownload && appHost.supports("filedownload")) && item.Type !== "Book") { + if ((item.CanDownload && appHost.supports('filedownload')) && item.Type !== 'Book') { commands.push({ - name: globalize.translate("Download"), - id: "download", - icon: "file_download" + name: globalize.translate('Download'), + id: 'download', + icon: 'file_download' }); commands.push({ - name: globalize.translate("CopyStreamURL"), - id: "copy-stream", - icon: "content_copy" + name: globalize.translate('CopyStreamURL'), + id: 'copy-stream', + icon: 'content_copy' }); } @@ -163,12 +163,12 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", var canEdit = itemHelper.canEdit(user, item); if (canEdit) { - if (options.edit !== false && item.Type !== "SeriesTimer") { - var text = (item.Type === "Timer" || item.Type === "SeriesTimer") ? globalize.translate("Edit") : globalize.translate("EditMetadata"); + if (options.edit !== false && item.Type !== 'SeriesTimer') { + var text = (item.Type === 'Timer' || item.Type === 'SeriesTimer') ? globalize.translate('Edit') : globalize.translate('EditMetadata'); commands.push({ name: text, - id: "edit", - icon: "edit" + id: 'edit', + icon: 'edit' }); } } @@ -176,20 +176,20 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", if (itemHelper.canEditImages(user, item)) { if (options.editImages !== false) { commands.push({ - name: globalize.translate("EditImages"), - id: "editimages", - icon: "image" + name: globalize.translate('EditImages'), + id: 'editimages', + icon: 'image' }); } } if (canEdit) { - if (item.MediaType === "Video" && item.Type !== "TvChannel" && item.Type !== "Program" && item.LocationType !== "Virtual" && !(item.Type === "Recording" && item.Status !== "Completed")) { + 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("EditSubtitles"), - id: "editsubtitles", - icon: "closed_caption" + name: globalize.translate('EditSubtitles'), + id: 'editsubtitles', + icon: 'closed_caption' }); } } @@ -198,9 +198,9 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", if (options.identify !== false) { if (itemHelper.canIdentify(user, item)) { commands.push({ - name: globalize.translate("Identify"), - id: "identify", - icon: "edit" + name: globalize.translate('Identify'), + id: 'identify', + icon: 'edit' }); } } @@ -208,54 +208,54 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", if (item.MediaSources) { if (options.moremediainfo !== false) { commands.push({ - name: globalize.translate("MoreMediaInfo"), - id: "moremediainfo", - icon: "info" + name: globalize.translate('MoreMediaInfo'), + id: 'moremediainfo', + icon: 'info' }); } } - if (item.Type === "Program" && options.record !== false) { + if (item.Type === 'Program' && options.record !== false) { if (item.TimerId) { commands.push({ - name: globalize.translate("ManageRecording"), - id: "record", - icon: "fiber_manual_record" + name: globalize.translate('ManageRecording'), + id: 'record', + icon: 'fiber_manual_record' }); } } - if (item.Type === "Program" && options.record !== false) { + if (item.Type === 'Program' && options.record !== false) { if (!item.TimerId) { commands.push({ - name: globalize.translate("Record"), - id: "record", - icon: "fiber_manual_record" + name: globalize.translate('Record'), + id: 'record', + icon: 'fiber_manual_record' }); } } if (itemHelper.canRefreshMetadata(item, user)) { commands.push({ - name: globalize.translate("RefreshMetadata"), - id: "refresh", - icon: "refresh" + name: globalize.translate('RefreshMetadata'), + id: 'refresh', + icon: 'refresh' }); } if (item.PlaylistItemId && options.playlistId) { commands.push({ - name: globalize.translate("RemoveFromPlaylist"), - id: "removefromplaylist", - icon: "remove" + name: globalize.translate('RemoveFromPlaylist'), + id: 'removefromplaylist', + icon: 'remove' }); } if (options.collectionId) { commands.push({ - name: globalize.translate("RemoveFromCollection"), - id: "removefromcollection", - icon: "remove" + name: globalize.translate('RemoveFromCollection'), + id: 'removefromcollection', + icon: 'remove' }); } @@ -263,9 +263,9 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", if (options.share === true) { if (itemHelper.canShare(item, user)) { commands.push({ - name: globalize.translate("Share"), - id: "share", - icon: "share" + name: globalize.translate('Share'), + id: 'share', + icon: 'share' }); } } @@ -274,26 +274,26 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", if (options.sync !== false) { if (itemHelper.canSync(user, item)) { commands.push({ - name: globalize.translate("Sync"), - id: "sync", - icon: "sync" + name: globalize.translate('Sync'), + id: 'sync', + icon: 'sync' }); } } - if (options.openAlbum !== false && item.AlbumId && item.MediaType !== "Photo") { + if (options.openAlbum !== false && item.AlbumId && item.MediaType !== 'Photo') { commands.push({ - name: globalize.translate("ViewAlbum"), - id: "album", - icon: "album" + name: globalize.translate('ViewAlbum'), + id: 'album', + icon: 'album' }); } if (options.openArtist !== false && item.ArtistItems && item.ArtistItems.length) { commands.push({ - name: globalize.translate("ViewArtist"), - id: "artist", - icon: "person" + name: globalize.translate('ViewArtist'), + id: 'artist', + icon: 'person' }); } @@ -317,24 +317,24 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", return new Promise(function (resolve, reject) { switch (id) { - case "addtocollection": - require(["collectionEditor"], function (collectionEditor) { + case 'addtocollection': + require(['collectionEditor'], function (collectionEditor) { new collectionEditor().show({ items: [itemId], serverId: serverId }).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; - case "addtoplaylist": - require(["playlistEditor"], function (playlistEditor) { + case 'addtoplaylist': + require(['playlistEditor'], function (playlistEditor) { new playlistEditor().show({ items: [itemId], serverId: serverId }).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; - case "download": - require(["fileDownloader"], function (fileDownloader) { + case 'download': + require(['fileDownloader'], function (fileDownloader) { var downloadHref = apiClient.getItemDownloadUrl(itemId); fileDownloader.download([{ url: downloadHref, @@ -346,21 +346,21 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", getResolveFunction(getResolveFunction(resolve, id), id)(); }); break; - case "copy-stream": + case 'copy-stream': var downloadHref = apiClient.getItemDownloadUrl(itemId); var textAreaCopy = function () { - var textArea = document.createElement("textarea"); + var textArea = document.createElement('textarea'); textArea.value = downloadHref; document.body.appendChild(textArea); textArea.focus(); textArea.select(); - if (document.execCommand("copy")) { - require(["toast"], function (toast) { - toast(globalize.translate("CopyStreamURLSuccess")); + if (document.execCommand('copy')) { + require(['toast'], function (toast) { + toast(globalize.translate('CopyStreamURLSuccess')); }); } else { - prompt(globalize.translate("CopyStreamURL"), downloadHref); + prompt(globalize.translate('CopyStreamURL'), downloadHref); } document.body.removeChild(textArea); }; @@ -371,8 +371,8 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", } else { /* eslint-disable-next-line compat/compat */ navigator.clipboard.writeText(downloadHref).then(function () { - require(["toast"], function (toast) { - toast(globalize.translate("CopyStreamURLSuccess")); + require(['toast'], function (toast) { + toast(globalize.translate('CopyStreamURLSuccess')); }); }).catch(function () { textAreaCopy(); @@ -380,118 +380,118 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", } getResolveFunction(resolve, id)(); break; - case "editsubtitles": - require(["subtitleEditor"], function (subtitleEditor) { + case 'editsubtitles': + require(['subtitleEditor'], function (subtitleEditor) { subtitleEditor.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; - case "edit": + case 'edit': editItem(apiClient, item).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); break; - case "editimages": - require(["imageEditor"], function (imageEditor) { + case 'editimages': + require(['imageEditor'], function (imageEditor) { imageEditor.show({ itemId: itemId, serverId: serverId }).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; - case "identify": - require(["itemIdentifier"], function (itemIdentifier) { + case 'identify': + require(['itemIdentifier'], function (itemIdentifier) { itemIdentifier.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; - case "moremediainfo": - require(["itemMediaInfo"], function (itemMediaInfo) { + case 'moremediainfo': + require(['itemMediaInfo'], function (itemMediaInfo) { itemMediaInfo.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; - case "refresh": + case 'refresh': refresh(apiClient, item); getResolveFunction(resolve, id)(); break; - case "open": + case 'open': appRouter.showItem(item); getResolveFunction(resolve, id)(); break; - case "play": + case 'play': play(item, false); getResolveFunction(resolve, id)(); break; - case "resume": + case 'resume': play(item, true); getResolveFunction(resolve, id)(); break; - case "queue": + case 'queue': play(item, false, true); getResolveFunction(resolve, id)(); break; - case "queuenext": + case 'queuenext': play(item, false, true, true); getResolveFunction(resolve, id)(); break; - case "record": - require(["recordingCreator"], function (recordingCreator) { + case 'record': + require(['recordingCreator'], function (recordingCreator) { recordingCreator.show(itemId, serverId).then(getResolveFunction(resolve, id, true), getResolveFunction(resolve, id)); }); break; - case "shuffle": + case 'shuffle': playbackManager.shuffle(item); getResolveFunction(resolve, id)(); break; - case "instantmix": + case 'instantmix': playbackManager.instantMix(item); getResolveFunction(resolve, id)(); break; - case "delete": + case 'delete': deleteItem(apiClient, item).then(getResolveFunction(resolve, id, true, true), getResolveFunction(resolve, id)); break; - case "share": + case 'share': navigator.share({ title: item.Name, text: item.Overview, - url: "https://github.com/jellyfin/jellyfin" + url: 'https://github.com/jellyfin/jellyfin' }); break; - case "album": + case 'album': appRouter.showItem(item.AlbumId, item.ServerId); getResolveFunction(resolve, id)(); break; - case "artist": + case 'artist': appRouter.showItem(item.ArtistItems[0].Id, item.ServerId); getResolveFunction(resolve, id)(); break; - case "playallfromhere": + case 'playallfromhere': getResolveFunction(resolve, id)(); break; - case "queueallfromhere": + case 'queueallfromhere': getResolveFunction(resolve, id)(); break; - case "removefromplaylist": + case 'removefromplaylist': apiClient.ajax({ - url: apiClient.getUrl("Playlists/" + options.playlistId + "/Items", { - EntryIds: [item.PlaylistItemId].join(",") + url: apiClient.getUrl('Playlists/' + options.playlistId + '/Items', { + EntryIds: [item.PlaylistItemId].join(',') }), - type: "DELETE" + type: 'DELETE' }).then(function () { getResolveFunction(resolve, id, true)(); }); break; - case "removefromcollection": + case 'removefromcollection': apiClient.ajax({ - type: "DELETE", - url: apiClient.getUrl("Collections/" + options.collectionId + "/Items", { + type: 'DELETE', + url: apiClient.getUrl('Collections/' + options.collectionId + '/Items', { - Ids: [item.Id].join(",") + Ids: [item.Id].join(',') }) }).then(function () { getResolveFunction(resolve, id, true)(); }); break; - case "canceltimer": + case 'canceltimer': deleteTimer(apiClient, item, resolve, id); break; - case "cancelseriestimer": + case 'cancelseriestimer': deleteSeriesTimer(apiClient, item, resolve, id); break; default: @@ -502,7 +502,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", } function deleteTimer(apiClient, item, resolve, command) { - require(["recordingHelper"], function (recordingHelper) { + require(['recordingHelper'], function (recordingHelper) { var timerId = item.TimerId || item.Id; recordingHelper.cancelTimerWithConfirmation(timerId, item.ServerId).then(function () { getResolveFunction(resolve, command, true)(); @@ -511,7 +511,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", } function deleteSeriesTimer(apiClient, item, resolve, command) { - require(["recordingHelper"], function (recordingHelper) { + require(['recordingHelper'], function (recordingHelper) { recordingHelper.cancelSeriesTimerWithConfirmation(item.Id, item.ServerId).then(function () { getResolveFunction(resolve, command, true)(); }); @@ -519,14 +519,14 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", } function play(item, resume, queue, queueNext) { - var method = queue ? (queueNext ? "queueNext" : "queue") : "play"; + var method = queue ? (queueNext ? 'queueNext' : 'queue') : 'play'; var startPosition = 0; if (resume && item.UserData && item.UserData.PlaybackPositionTicks) { startPosition = item.UserData.PlaybackPositionTicks; } - if (item.Type === "Program") { + if (item.Type === 'Program') { playbackManager[method]({ ids: [item.ChannelId], startPositionTicks: startPosition, @@ -544,16 +544,16 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", return new Promise(function (resolve, reject) { var serverId = apiClient.serverInfo().Id; - if (item.Type === "Timer") { - require(["recordingEditor"], function (recordingEditor) { + 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) { + } else if (item.Type === 'SeriesTimer') { + require(['seriesRecordingEditor'], function (recordingEditor) { recordingEditor.show(item.Id, serverId).then(resolve, reject); }); } else { - require(["metadataEditor"], function (metadataEditor) { + require(['metadataEditor'], function (metadataEditor) { metadataEditor.show(item.Id, serverId).then(resolve, reject); }); } @@ -562,7 +562,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", function deleteItem(apiClient, item) { return new Promise(function (resolve, reject) { - require(["deleteHelper"], function (deleteHelper) { + require(['deleteHelper'], function (deleteHelper) { deleteHelper.deleteItem({ item: item, navigate: false @@ -574,11 +574,11 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", } function refresh(apiClient, item) { - require(["refreshDialog"], function (refreshDialog) { + require(['refreshDialog'], function (refreshDialog) { new refreshDialog({ itemIds: [item.Id], serverId: apiClient.serverInfo().Id, - mode: item.Type === "CollectionFolder" ? "scan" : null + mode: item.Type === 'CollectionFolder' ? 'scan' : null }).show(); }); } @@ -592,7 +592,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter", return actionsheet.show({ items: commands, positionTo: options.positionTo, - resolveOnClick: ["share"] + resolveOnClick: ['share'] }).then(function (id) { return executeCommand(options.item, id, options); }); diff --git a/src/components/itemhelper.js b/src/components/itemhelper.js index 8e0883474..b18f37110 100644 --- a/src/components/itemhelper.js +++ b/src/components/itemhelper.js @@ -4,7 +4,7 @@ define(['apphost', 'globalize'], function (appHost, globalize) { function getDisplayName(item, options) { if (!item) { - throw new Error("null item passed into getDisplayName"); + throw new Error('null item passed into getDisplayName'); } options = options || {}; @@ -15,31 +15,31 @@ define(['apphost', 'globalize'], function (appHost, globalize) { var name = ((item.Type === 'Program' || item.Type === 'Recording') && (item.IsSeries || item.EpisodeTitle) ? item.EpisodeTitle : item.Name) || ''; - if (item.Type === "TvChannel") { + if (item.Type === 'TvChannel') { if (item.ChannelNumber) { return item.ChannelNumber + ' ' + name; } return name; } - if (item.Type === "Episode" && item.ParentIndexNumber === 0) { + if (item.Type === 'Episode' && item.ParentIndexNumber === 0) { name = globalize.translate('ValueSpecialEpisodeName', name); - } else if ((item.Type === "Episode" || item.Type === 'Program') && item.IndexNumber != null && item.ParentIndexNumber != null && options.includeIndexNumber !== false) { + } else if ((item.Type === 'Episode' || item.Type === 'Program') && item.IndexNumber != null && item.ParentIndexNumber != null && options.includeIndexNumber !== false) { var displayIndexNumber = item.IndexNumber; var number = displayIndexNumber; - var nameSeparator = " - "; + var nameSeparator = ' - '; if (options.includeParentInfo !== false) { - number = "S" + item.ParentIndexNumber + ":E" + number; + number = 'S' + item.ParentIndexNumber + ':E' + number; } else { - nameSeparator = ". "; + nameSeparator = '. '; } if (item.IndexNumberEnd) { displayIndexNumber = item.IndexNumberEnd; - number += "-" + displayIndexNumber; + number += '-' + displayIndexNumber; } if (number) { @@ -94,14 +94,14 @@ define(['apphost', 'globalize'], function (appHost, globalize) { return false; } - return item.MediaType || item.IsFolder || item.Type === "Genre" || item.Type === "MusicGenre" || item.Type === "MusicArtist"; + return item.MediaType || item.IsFolder || item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'MusicArtist'; } function canEdit(user, item) { var itemType = item.Type; - if (itemType === "UserRootFolder" || itemType === "UserView") { + if (itemType === 'UserRootFolder' || itemType === 'UserView') { return false; } @@ -149,15 +149,15 @@ define(['apphost', 'globalize'], function (appHost, globalize) { var itemType = item.Type; - if (itemType === "Movie" || - itemType === "Trailer" || - itemType === "Series" || - itemType === "BoxSet" || - itemType === "Person" || - itemType === "Book" || - itemType === "MusicAlbum" || - itemType === "MusicArtist" || - itemType === "MusicVideo") { + if (itemType === 'Movie' || + itemType === 'Trailer' || + itemType === 'Series' || + itemType === 'BoxSet' || + itemType === 'Person' || + itemType === 'Book' || + itemType === 'MusicAlbum' || + itemType === 'MusicArtist' || + itemType === 'MusicVideo') { if (user.Policy.IsAdministrator) { @@ -259,11 +259,11 @@ define(['apphost', 'globalize'], function (appHost, globalize) { } } - if (item.Type === "Series" || - item.Type === "Season" || - item.Type === "BoxSet" || - item.MediaType === "Book" || - item.MediaType === "Recording") { + if (item.Type === 'Series' || + item.Type === 'Season' || + item.Type === 'BoxSet' || + item.MediaType === 'Book' || + item.MediaType === 'Recording') { return true; } diff --git a/src/components/itemidentifier/itemidentifier.js b/src/components/itemidentifier/itemidentifier.js index 9f89aef94..871093602 100644 --- a/src/components/itemidentifier/itemidentifier.js +++ b/src/components/itemidentifier/itemidentifier.js @@ -1,5 +1,5 @@ -define(["dialogHelper", "loading", "connectionManager", "require", "globalize", "scrollHelper", "layoutManager", "focusManager", "browser", "emby-input", "emby-checkbox", "paper-icon-button-light", "css!./../formdialog", "material-icons", "cardStyle"], function (dialogHelper, loading, connectionManager, require, globalize, scrollHelper, layoutManager, focusManager, browser) { - "use strict"; +define(['dialogHelper', 'loading', 'connectionManager', 'require', 'globalize', 'scrollHelper', 'layoutManager', 'focusManager', 'browser', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'cardStyle'], function (dialogHelper, loading, connectionManager, require, globalize, scrollHelper, layoutManager, focusManager, browser) { + 'use strict'; var enableFocusTransform = !browser.slow && !browser.edge; @@ -23,7 +23,7 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", var i; var length; - var identifyField = page.querySelectorAll(".identifyField"); + var identifyField = page.querySelectorAll('.identifyField'); var value; for (i = 0, length = identifyField.length; i < length; i++) { @@ -31,17 +31,17 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", if (value) { - if (identifyField[i].type === "number") { + if (identifyField[i].type === 'number') { value = parseInt(value); } - lookupInfo[identifyField[i].getAttribute("data-lookup")] = value; + lookupInfo[identifyField[i].getAttribute('data-lookup')] = value; } } var hasId = false; - var txtLookupId = page.querySelectorAll(".txtLookupId"); + var txtLookupId = page.querySelectorAll('.txtLookupId'); for (i = 0, length = txtLookupId.length; i < length; i++) { value = txtLookupId[i].value; @@ -49,12 +49,12 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", if (value) { hasId = true; } - lookupInfo.ProviderIds[txtLookupId[i].getAttribute("data-providerkey")] = value; + lookupInfo.ProviderIds[txtLookupId[i].getAttribute('data-providerkey')] = value; } if (!hasId && !lookupInfo.Name) { - require(["toast"], function (toast) { - toast(globalize.translate("PleaseEnterNameOrId")); + require(['toast'], function (toast) { + toast(globalize.translate('PleaseEnterNameOrId')); }); return; } @@ -74,11 +74,11 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", var apiClient = getApiClient(); apiClient.ajax({ - type: "POST", - url: apiClient.getUrl("Items/RemoteSearch/" + currentItemType), + type: 'POST', + url: apiClient.getUrl('Items/RemoteSearch/' + currentItemType), data: JSON.stringify(lookupInfo), - contentType: "application/json", - dataType: "json" + contentType: 'application/json', + dataType: 'json' }).then(function (results) { @@ -89,14 +89,14 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", function showIdentificationSearchResults(page, results) { - var identificationSearchResults = page.querySelector(".identificationSearchResults"); + var identificationSearchResults = page.querySelector('.identificationSearchResults'); - page.querySelector(".popupIdentifyForm").classList.add("hide"); - identificationSearchResults.classList.remove("hide"); - page.querySelector(".identifyOptionsForm").classList.add("hide"); - page.querySelector(".dialogContentInner").classList.remove("dialog-content-centered"); + page.querySelector('.popupIdentifyForm').classList.add('hide'); + identificationSearchResults.classList.remove('hide'); + page.querySelector('.identifyOptionsForm').classList.add('hide'); + page.querySelector('.dialogContentInner').classList.remove('dialog-content-centered'); - var html = ""; + var html = ''; var i; var length; for (i = 0, length = results.length; i < length; i++) { @@ -105,11 +105,11 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", html += getSearchResultHtml(result, i); } - var elem = page.querySelector(".identificationSearchResultList"); + var elem = page.querySelector('.identificationSearchResultList'); elem.innerHTML = html; function onSearchImageClick() { - var index = parseInt(this.getAttribute("data-index")); + var index = parseInt(this.getAttribute('data-index')); var currentResult = results[index]; @@ -122,10 +122,10 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", } } - var searchImages = elem.querySelectorAll(".card"); + var searchImages = elem.querySelectorAll('.card'); for (i = 0, length = searchImages.length; i < length; i++) { - searchImages[i].addEventListener("click", onSearchImageClick); + searchImages[i].addEventListener('click', onSearchImageClick); } if (layoutManager.tv) { @@ -143,13 +143,13 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", function showIdentifyOptions(page, identifyResult) { - var identifyOptionsForm = page.querySelector(".identifyOptionsForm"); + var identifyOptionsForm = page.querySelector('.identifyOptionsForm'); - page.querySelector(".popupIdentifyForm").classList.add("hide"); - page.querySelector(".identificationSearchResults").classList.add("hide"); - identifyOptionsForm.classList.remove("hide"); - page.querySelector("#chkIdentifyReplaceImages").checked = true; - page.querySelector(".dialogContentInner").classList.add("dialog-content-centered"); + page.querySelector('.popupIdentifyForm').classList.add('hide'); + page.querySelector('.identificationSearchResults').classList.add('hide'); + identifyOptionsForm.classList.remove('hide'); + page.querySelector('#chkIdentifyReplaceImages').checked = true; + page.querySelector('.dialogContentInner').classList.add('dialog-content-centered'); currentSearchResult = identifyResult; @@ -160,48 +160,48 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", lines.push(identifyResult.ProductionYear); } - var resultHtml = lines.join("
"); + var resultHtml = lines.join('
'); if (identifyResult.ImageUrl) { var displayUrl = getSearchImageDisplayUrl(identifyResult.ImageUrl, identifyResult.SearchProviderName); - resultHtml = '
' + resultHtml + "
"; + resultHtml = '
' + resultHtml + '
'; } - page.querySelector(".selectedSearchResult").innerHTML = resultHtml; + page.querySelector('.selectedSearchResult').innerHTML = resultHtml; - focusManager.focus(identifyOptionsForm.querySelector(".btnSubmit")); + focusManager.focus(identifyOptionsForm.querySelector('.btnSubmit')); } function getSearchResultHtml(result, index) { // TODO move card creation code to Card component - var html = ""; - var cssClass = "card scalableCard"; - var cardBoxCssClass = "cardBox"; + var html = ''; + var cssClass = 'card scalableCard'; + var cardBoxCssClass = 'cardBox'; var padderClass; - if (currentItemType === "Episode") { - cssClass += " backdropCard backdropCard-scalable"; - padderClass = "cardPadder-backdrop"; - } else if (currentItemType === "MusicAlbum" || currentItemType === "MusicArtist") { - cssClass += " squareCard squareCard-scalable"; - padderClass = "cardPadder-square"; + if (currentItemType === 'Episode') { + cssClass += ' backdropCard backdropCard-scalable'; + padderClass = 'cardPadder-backdrop'; + } else if (currentItemType === 'MusicAlbum' || currentItemType === 'MusicArtist') { + cssClass += ' squareCard squareCard-scalable'; + padderClass = 'cardPadder-square'; } else { - cssClass += " portraitCard portraitCard-scalable"; - padderClass = "cardPadder-portrait"; + cssClass += ' portraitCard portraitCard-scalable'; + padderClass = 'cardPadder-portrait'; } if (layoutManager.tv) { - cssClass += " show-focus"; + cssClass += ' show-focus'; if (enableFocusTransform) { - cssClass += " show-animation"; + cssClass += ' show-animation'; } } - cardBoxCssClass += " cardBox-bottompadded"; + cardBoxCssClass += ' cardBox-bottompadded'; html += '
"; + html += '
'; + html += '
'; var numLines = 2; - if (currentItemType === "MusicAlbum") { + if (currentItemType === 'MusicAlbum') { numLines++; } @@ -242,19 +242,19 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", } else { html += '
'; } - html += lines[i] || " "; - html += "
"; + html += lines[i] || ' '; + html += '
'; } - html += "
"; - html += ""; + html += '
'; + html += ''; return html; } function getSearchImageDisplayUrl(url, provider) { var apiClient = getApiClient(); - return apiClient.getUrl("Items/RemoteSearch/Image", { imageUrl: url, ProviderName: provider }); + return apiClient.getUrl('Items/RemoteSearch/Image', { imageUrl: url, ProviderName: provider }); } function submitIdentficationResult(page) { @@ -262,16 +262,16 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", loading.show(); var options = { - ReplaceAllImages: page.querySelector("#chkIdentifyReplaceImages").checked + ReplaceAllImages: page.querySelector('#chkIdentifyReplaceImages').checked }; var apiClient = getApiClient(); apiClient.ajax({ - type: "POST", - url: apiClient.getUrl("Items/RemoteSearch/Apply/" + currentItem.Id, options), + type: 'POST', + url: apiClient.getUrl('Items/RemoteSearch/Apply/' + currentItem.Id, options), data: JSON.stringify(currentSearchResult), - contentType: "application/json" + contentType: 'application/json' }).then(function () { @@ -292,45 +292,45 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", var apiClient = getApiClient(); - apiClient.getJSON(apiClient.getUrl("Items/" + item.Id + "/ExternalIdInfos")).then(function (idList) { + apiClient.getJSON(apiClient.getUrl('Items/' + item.Id + '/ExternalIdInfos')).then(function (idList) { - var html = ""; + var html = ''; for (var i = 0, length = idList.length; i < length; i++) { var idInfo = idList[i]; - var id = "txtLookup" + idInfo.Key; + var id = 'txtLookup' + idInfo.Key; html += '
'; var fullName = idInfo.Name; if (idInfo.Type) { - fullName = idInfo.Name + " " + globalize.translate(idInfo.Type); + fullName = idInfo.Name + ' ' + globalize.translate(idInfo.Type); } - var idLabel = globalize.translate("LabelDynamicExternalId", fullName); + var idLabel = globalize.translate('LabelDynamicExternalId', fullName); html += ''; - html += "
"; + html += '
'; } - page.querySelector("#txtLookupName").value = ""; + page.querySelector('#txtLookupName').value = ''; - if (item.Type === "Person" || item.Type === "BoxSet") { + if (item.Type === 'Person' || item.Type === 'BoxSet') { - page.querySelector(".fldLookupYear").classList.add("hide"); - page.querySelector("#txtLookupYear").value = ""; + page.querySelector('.fldLookupYear').classList.add('hide'); + page.querySelector('#txtLookupYear').value = ''; } else { - page.querySelector(".fldLookupYear").classList.remove("hide"); - page.querySelector("#txtLookupYear").value = ""; + page.querySelector('.fldLookupYear').classList.remove('hide'); + page.querySelector('#txtLookupYear').value = ''; } - page.querySelector(".identifyProviderIds").innerHTML = html; + page.querySelector('.identifyProviderIds').innerHTML = html; - page.querySelector(".formDialogHeaderTitle").innerHTML = globalize.translate("Identify"); + page.querySelector('.formDialogHeaderTitle').innerHTML = globalize.translate('Identify'); }); } @@ -338,7 +338,7 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", loading.show(); - require(["text!./itemidentifier.template.html"], function (template) { + require(['text!./itemidentifier.template.html'], function (template) { var apiClient = getApiClient(); @@ -348,30 +348,30 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", currentItemType = currentItem.Type; var dialogOptions = { - size: "fullscreen-border", + size: 'fullscreen-border', removeOnClose: true, scrollY: false }; if (layoutManager.tv) { - dialogOptions.size = "fullscreen"; + dialogOptions.size = 'fullscreen'; } var dlg = dialogHelper.createDialog(dialogOptions); - dlg.classList.add("formDialog"); - dlg.classList.add("recordingDialog"); + dlg.classList.add('formDialog'); + dlg.classList.add('recordingDialog'); - var html = ""; - html += globalize.translateDocument(template, "core"); + var html = ''; + html += globalize.translateDocument(template, 'core'); dlg.innerHTML = html; // Has to be assigned a z-index after the call to .open() - dlg.addEventListener("close", onDialogClosed); + dlg.addEventListener('close', onDialogClosed); if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false); + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); } if (item.Path) { @@ -384,26 +384,26 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", dialogHelper.open(dlg); - dlg.querySelector(".popupIdentifyForm").addEventListener("submit", function (e) { + dlg.querySelector('.popupIdentifyForm').addEventListener('submit', function (e) { e.preventDefault(); searchForIdentificationResults(dlg); return false; }); - dlg.querySelector(".identifyOptionsForm").addEventListener("submit", function (e) { + dlg.querySelector('.identifyOptionsForm').addEventListener('submit', function (e) { e.preventDefault(); submitIdentficationResult(dlg); return false; }); - dlg.querySelector(".btnCancel").addEventListener("click", function (e) { + dlg.querySelector('.btnCancel').addEventListener('click', function (e) { dialogHelper.close(dlg); }); - dlg.classList.add("identifyDialog"); + dlg.classList.add('identifyDialog'); showIdentificationForm(dlg, item); loading.hide(); @@ -426,47 +426,47 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", currentItem = null; currentItemType = itemType; - require(["text!./itemidentifier.template.html"], function (template) { + require(['text!./itemidentifier.template.html'], function (template) { var dialogOptions = { - size: "fullscreen-border", + size: 'fullscreen-border', removeOnClose: true, scrollY: false }; if (layoutManager.tv) { - dialogOptions.size = "fullscreen"; + dialogOptions.size = 'fullscreen'; } var dlg = dialogHelper.createDialog(dialogOptions); - dlg.classList.add("formDialog"); - dlg.classList.add("recordingDialog"); + dlg.classList.add('formDialog'); + dlg.classList.add('recordingDialog'); - var html = ""; - html += globalize.translateDocument(template, "core"); + var html = ''; + html += globalize.translateDocument(template, 'core'); dlg.innerHTML = html; if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false); + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); } dialogHelper.open(dlg); - dlg.querySelector(".btnCancel").addEventListener("click", function (e) { + dlg.querySelector('.btnCancel').addEventListener('click', function (e) { dialogHelper.close(dlg); }); - dlg.querySelector(".popupIdentifyForm").addEventListener("submit", function (e) { + dlg.querySelector('.popupIdentifyForm').addEventListener('submit', function (e) { e.preventDefault(); searchForIdentificationResults(dlg); return false; }); - dlg.addEventListener("close", function () { + dlg.addEventListener('close', function () { loading.hide(); var foundItem = hasChanges ? currentSearchResult : null; @@ -474,7 +474,7 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", resolveFunc(foundItem); }); - dlg.classList.add("identifyDialog"); + dlg.classList.add('identifyDialog'); showIdentificationFormFindNew(dlg, itemName, itemYear, itemType); }); @@ -482,20 +482,20 @@ define(["dialogHelper", "loading", "connectionManager", "require", "globalize", function showIdentificationFormFindNew(dlg, itemName, itemYear, itemType) { - dlg.querySelector("#txtLookupName").value = itemName; + dlg.querySelector('#txtLookupName').value = itemName; - if (itemType === "Person" || itemType === "BoxSet") { + if (itemType === 'Person' || itemType === 'BoxSet') { - dlg.querySelector(".fldLookupYear").classList.add("hide"); - dlg.querySelector("#txtLookupYear").value = ""; + dlg.querySelector('.fldLookupYear').classList.add('hide'); + dlg.querySelector('#txtLookupYear').value = ''; } else { - dlg.querySelector(".fldLookupYear").classList.remove("hide"); - dlg.querySelector("#txtLookupYear").value = itemYear; + dlg.querySelector('.fldLookupYear').classList.remove('hide'); + dlg.querySelector('#txtLookupYear').value = itemYear; } - dlg.querySelector(".formDialogHeaderTitle").innerHTML = globalize.translate("Search"); + dlg.querySelector('.formDialogHeaderTitle').innerHTML = globalize.translate('Search'); } return { diff --git a/src/components/itemidentifier/itemidentifier.template.html b/src/components/itemidentifier/itemidentifier.template.html index 9b3e58a86..9ea0e945d 100644 --- a/src/components/itemidentifier/itemidentifier.template.html +++ b/src/components/itemidentifier/itemidentifier.template.html @@ -1,6 +1,6 @@

${Identify}

diff --git a/src/components/lazyloader/lazyedgehack.css b/src/components/lazyloader/lazyedgehack.css deleted file mode 100644 index e358872f1..000000000 --- a/src/components/lazyloader/lazyedgehack.css +++ /dev/null @@ -1,5 +0,0 @@ -.lazy { - /* In edge, intersection observer will not fire on 0px sized elements */ - min-width: 0.1em; - min-height: 0.1em; -} diff --git a/src/components/lazyloader/lazyloader-intersectionobserver.js b/src/components/lazyloader/lazyloader-intersectionobserver.js index 5f8374260..8cf5b9cd0 100644 --- a/src/components/lazyloader/lazyloader-intersectionobserver.js +++ b/src/components/lazyloader/lazyloader-intersectionobserver.js @@ -1,103 +1,67 @@ -define(['require', 'browser'], function (require, browser) { - 'use strict'; +/* eslint-disable indent */ + export class LazyLoader { + constructor(options) { + this.options = options; + } - function LazyLoader(options) { + createObserver() { + const callback = this.options.callback; - this.options = options; - } + const observer = new IntersectionObserver( + (entries) => { + entries.forEach(entry => { + callback(entry); + }, + {rootMargin: '50%'}); + }); - if (browser.edge) { - require(['css!./lazyedgehack']); - } + this.observer = observer; + } - LazyLoader.prototype.createObserver = function () { + addElements(elements) { + let observer = this.observer; - var observerOptions = {}; - var options = this.options; - var loadedCount = 0; - var callback = options.callback; - - observerOptions.rootMargin = "50%"; - - var observerId = 'obs' + new Date().getTime(); - - var self = this; - var observer = new IntersectionObserver(function (entries) { - for (var j = 0, length2 = entries.length; j < length2; j++) { - var entry = entries[j]; - - if (entry.intersectionRatio > 0) { - - // Stop watching and load the image - var target = entry.target; - - observer.unobserve(target); - - if (!target[observerId]) { - target[observerId] = 1; - callback(target); - loadedCount++; - - if (loadedCount >= self.elementCount) { - self.destroyObserver(); - } - } - } + if (!observer) { + this.createObserver(); + observer = this.observer; } - }, - observerOptions - ); - this.observer = observer; - }; - - LazyLoader.prototype.addElements = function (elements) { - - var observer = this.observer; - - if (!observer) { - this.createObserver(); - observer = this.observer; + Array.from(elements).forEach(element => { + observer.observe(element); + }); } - this.elementCount = (this.elementCount || 0) + elements.length; + destroyObserver() { + const observer = this.observer; - for (var i = 0, length = elements.length; i < length; i++) { - observer.observe(elements[i]); + if (observer) { + observer.disconnect(); + this.observer = null; + } } - }; - LazyLoader.prototype.destroyObserver = function (elements) { - - var observer = this.observer; - - if (observer) { - observer.disconnect(); - this.observer = null; + destroy() { + this.destroyObserver(); + this.options = null; } - }; - - LazyLoader.prototype.destroy = function (elements) { - - this.destroyObserver(); - this.options = null; - }; + } function unveilElements(elements, root, callback) { - if (!elements.length) { return; } - var lazyLoader = new LazyLoader({ + const lazyLoader = new LazyLoader({ callback: callback }); lazyLoader.addElements(elements); } - LazyLoader.lazyChildren = function (elem, callback) { - + export function lazyChildren(elem, callback) { unveilElements(elem.getElementsByClassName('lazy'), elem, callback); - }; + } - return LazyLoader; -}); +/* eslint-enable indent */ +export default { + LazyLoader: LazyLoader, + lazyChildren: lazyChildren +}; diff --git a/src/components/lazyloader/lazyloader-scroll.js b/src/components/lazyloader/lazyloader-scroll.js deleted file mode 100644 index 4930f6376..000000000 --- a/src/components/lazyloader/lazyloader-scroll.js +++ /dev/null @@ -1,185 +0,0 @@ -define(['visibleinviewport', 'dom', 'browser'], function (visibleinviewport, dom, browser) { - 'use strict'; - - var thresholdX; - var thresholdY; - - function resetThresholds() { - - var threshold = 0.3; - - thresholdX = screen.availWidth * threshold; - thresholdY = screen.availHeight * threshold; - } - - function resetThresholdsOnTimer() { - - setTimeout(resetThresholds, 500); - } - - if (browser.iOS) { - dom.addEventListener(window, "orientationchange", resetThresholdsOnTimer, { passive: true }); - dom.addEventListener(window, 'resize', resetThresholdsOnTimer, { passive: true }); - } else { - dom.addEventListener(window, "orientationchange", resetThresholds, { passive: true }); - dom.addEventListener(window, 'resize', resetThresholds, { passive: true }); - } - resetThresholds(); - - function isVisible(elem) { - return visibleinviewport(elem, true, thresholdX, thresholdY); - } - - var wheelEvent = (document.implementation.hasFeature('Event.wheel', '3.0') ? 'wheel' : 'mousewheel'); - var self = {}; - - function cancelAll(tokens) { - for (var i = 0, length = tokens.length; i < length; i++) { - - tokens[i] = true; - } - } - - function unveilElementsInternal(instance, callback) { - - var unveiledElements = []; - var cancellationTokens = []; - var loadedCount = 0; - - function unveilInternal(tokenIndex) { - - var anyFound = false; - var out = false; - - var elements = instance.elements; - // TODO: This out construct assumes left to right, top to bottom - - for (var i = 0, length = elements.length; i < length; i++) { - - if (cancellationTokens[tokenIndex]) { - return; - } - if (unveiledElements[i]) { - continue; - } - var elem = elements[i]; - if (!out && isVisible(elem)) { - anyFound = true; - unveiledElements[i] = true; - callback(elem); - loadedCount++; - } else { - - if (anyFound) { - out = true; - } - } - } - - if (loadedCount >= elements.length) { - dom.removeEventListener(document, 'focus', unveil, { - capture: true, - passive: true - }); - dom.removeEventListener(document, 'scroll', unveil, { - capture: true, - passive: true - }); - dom.removeEventListener(document, wheelEvent, unveil, { - capture: true, - passive: true - }); - dom.removeEventListener(window, 'resize', unveil, { - capture: true, - passive: true - }); - } - } - - function unveil() { - - cancelAll(cancellationTokens); - - var index = cancellationTokens.length; - cancellationTokens.length++; - - setTimeout(function () { - unveilInternal(index); - }, 1); - } - - dom.addEventListener(document, 'focus', unveil, { - capture: true, - passive: true - }); - dom.addEventListener(document, 'scroll', unveil, { - capture: true, - passive: true - }); - dom.addEventListener(document, wheelEvent, unveil, { - capture: true, - passive: true - }); - dom.addEventListener(window, 'resize', unveil, { - capture: true, - passive: true - }); - - unveil(); - } - - function LazyLoader(options) { - - this.options = options; - } - - LazyLoader.prototype.createObserver = function () { - - unveilElementsInternal(this, this.options.callback); - this.observer = 1; - }; - - LazyLoader.prototype.addElements = function (elements) { - - this.elements = this.elements || []; - - for (var i = 0, length = elements.length; i < length; i++) { - this.elements.push(elements[i]); - } - - var observer = this.observer; - - if (!observer) { - this.createObserver(); - } - - }; - - LazyLoader.prototype.destroyObserver = function (elements) { - - }; - - LazyLoader.prototype.destroy = function (elements) { - - this.destroyObserver(); - this.options = null; - }; - - function unveilElements(elements, root, callback) { - - if (!elements.length) { - return; - } - var lazyLoader = new LazyLoader({ - callback: callback - }); - lazyLoader.addElements(elements); - } - - LazyLoader.lazyChildren = function (elem, callback) { - - unveilElements(elem.getElementsByClassName('lazy'), elem, callback); - }; - - return LazyLoader; -}); diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index 08197299e..fec465640 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -1,130 +1,131 @@ -define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], function(globalize, dom) { - "use strict"; +define(['globalize', 'dom', 'emby-checkbox', 'emby-select', 'emby-input'], function(globalize, dom) { + 'use strict'; function populateLanguages(parent) { return ApiClient.getCultures().then(function(languages) { - populateLanguagesIntoSelect(parent.querySelector("#selectLanguage"), languages); - populateLanguagesIntoList(parent.querySelector(".subtitleDownloadLanguages"), languages); + populateLanguagesIntoSelect(parent.querySelector('#selectLanguage'), languages); + populateLanguagesIntoList(parent.querySelector('.subtitleDownloadLanguages'), languages); }); } function populateLanguagesIntoSelect(select, languages) { - var html = ""; + var html = ''; html += ""; for (var i = 0; i < languages.length; i++) { var culture = languages[i]; - html += ""; + html += "'; } select.innerHTML = html; } function populateLanguagesIntoList(element, languages) { - var html = ""; + var html = ''; for (var i = 0; i < languages.length; i++) { var culture = languages[i]; - html += '"; + html += ''; } element.innerHTML = html; } function populateCountries(select) { return ApiClient.getCountries().then(function(allCountries) { - var html = ""; + var html = ''; html += ""; for (var i = 0; i < allCountries.length; i++) { var culture = allCountries[i]; - html += ""; + html += "'; } select.innerHTML = html; }); } function populateRefreshInterval(select) { - var html = ""; - html += ""; + var html = ''; + html += "'; html += [30, 60, 90].map(function(val) { - return ""; - }).join(""); + return "'; + }).join(''); select.innerHTML = html; } function renderMetadataReaders(page, plugins) { - var html = ""; - var elem = page.querySelector(".metadataReaders"); + var html = ''; + var elem = page.querySelector('.metadataReaders'); - if (plugins.length < 1) return elem.innerHTML = "", elem.classList.add("hide"), !1; - html += '

' + globalize.translate("LabelMetadataReaders") + "

"; + if (plugins.length < 1) return elem.innerHTML = '', elem.classList.add('hide'), !1; + html += '

' + globalize.translate('LabelMetadataReaders') + '

'; html += '
'; for (var i = 0; i < plugins.length; i++) { var plugin = plugins[i]; html += '
'; - html += ''; + html += ''; html += '
'; html += '

'; html += plugin.Name; - html += "

"; - html += "
"; + html += ''; + html += '
'; if (i > 0) { - html += ''; + html += ''; } else if (plugins.length > 1) { - html += ''; + html += ''; } - html += "
"; + html += '
'; } - html += "
"; - html += '
' + globalize.translate("LabelMetadataReadersHelp") + "
"; + html += '
'; + html += '
' + globalize.translate('LabelMetadataReadersHelp') + '
'; if (plugins.length < 2) { - elem.classList.add("hide"); + elem.classList.add('hide'); } else { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } elem.innerHTML = html; return true; } function renderMetadataSavers(page, metadataSavers) { - var html = ""; - var elem = page.querySelector(".metadataSavers"); - if (!metadataSavers.length) return elem.innerHTML = "", elem.classList.add("hide"), false; - html += '

' + globalize.translate("LabelMetadataSavers") + "

"; + var html = ''; + var elem = page.querySelector('.metadataSavers'); + if (!metadataSavers.length) return elem.innerHTML = '', elem.classList.add('hide'), false; + html += '

' + globalize.translate('LabelMetadataSavers') + '

'; html += '
'; for (var i = 0; i < metadataSavers.length; i++) { var plugin = metadataSavers[i]; - html += '"; + html += ''; } - html += "
"; - html += '
' + globalize.translate("LabelMetadataSaversHelp") + "
"; + html += ''; + html += '
' + globalize.translate('LabelMetadataSaversHelp') + '
'; elem.innerHTML = html; - elem.classList.remove("hide"); + elem.classList.remove('hide'); return true; } function getMetadataFetchersForTypeHtml(availableTypeOptions, libraryOptionsForType) { - var html = ""; + var html = ''; var plugins = availableTypeOptions.MetadataFetchers; plugins = getOrderedPlugins(plugins, libraryOptionsForType.MetadataFetcherOrder || []); if (!plugins.length) return html; html += '
'; - html += '

' + globalize.translate("LabelTypeMetadataDownloaders", globalize.translate(availableTypeOptions.Type)) + "

"; + html += '

' + globalize.translate('LabelTypeMetadataDownloaders', globalize.translate(availableTypeOptions.Type)) + '

'; html += '
'; - for (var i = 0; i < plugins.length; i++) { - var plugin = plugins[i]; + + plugins.forEach((plugin, index) => { html += '
'; var isChecked = libraryOptionsForType.MetadataFetchers ? -1 !== libraryOptionsForType.MetadataFetchers.indexOf(plugin.Name) : plugin.DefaultEnabled; - var checkedHtml = isChecked ? ' checked="checked"' : ""; - html += '"; + var checkedHtml = isChecked ? ' checked="checked"' : ''; + html += ''; html += '
'; html += '

'; html += plugin.Name; - html += "

"; - html += "
"; - i > 0 ? html += '' : plugins.length > 1 && (html += ''), html += "
"; - } - html += "
"; - html += '
' + globalize.translate("LabelMetadataDownloadersHelp") + "
"; - html += "
"; + html += ''; + html += ''; + index > 0 ? html += '' : plugins.length > 1 && (html += ''), html += ''; + }); + + html += ''; + html += '
' + globalize.translate('LabelMetadataDownloadersHelp') + '
'; + html += ''; return html; } @@ -138,62 +139,62 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct } function renderMetadataFetchers(page, availableOptions, libraryOptions) { - var html = ""; - var elem = page.querySelector(".metadataFetchers"); + var html = ''; + var elem = page.querySelector('.metadataFetchers'); for (var i = 0; i < availableOptions.TypeOptions.length; i++) { var availableTypeOptions = availableOptions.TypeOptions[i]; html += getMetadataFetchersForTypeHtml(availableTypeOptions, getTypeOptions(libraryOptions, availableTypeOptions.Type) || {}); } elem.innerHTML = html; if (html) { - elem.classList.remove("hide"); - page.querySelector(".fldAutoRefreshInterval").classList.remove("hide"); - page.querySelector(".fldMetadataLanguage").classList.remove("hide"); - page.querySelector(".fldMetadataCountry").classList.remove("hide"); + elem.classList.remove('hide'); + page.querySelector('.fldAutoRefreshInterval').classList.remove('hide'); + page.querySelector('.fldMetadataLanguage').classList.remove('hide'); + page.querySelector('.fldMetadataCountry').classList.remove('hide'); } else { - elem.classList.add("hide"); - page.querySelector(".fldAutoRefreshInterval").classList.add("hide"); - page.querySelector(".fldMetadataLanguage").classList.add("hide"); - page.querySelector(".fldMetadataCountry").classList.add("hide"); + elem.classList.add('hide'); + page.querySelector('.fldAutoRefreshInterval').classList.add('hide'); + page.querySelector('.fldMetadataLanguage').classList.add('hide'); + page.querySelector('.fldMetadataCountry').classList.add('hide'); } return true; } function renderSubtitleFetchers(page, availableOptions, libraryOptions) { - var html = ""; - var elem = page.querySelector(".subtitleFetchers"); + var html = ''; + var elem = page.querySelector('.subtitleFetchers'); var plugins = availableOptions.SubtitleFetchers; plugins = getOrderedPlugins(plugins, libraryOptions.SubtitleFetcherOrder || []); if (!plugins.length) return html; - html += '

' + globalize.translate("LabelSubtitleDownloaders") + "

"; + html += '

' + globalize.translate('LabelSubtitleDownloaders') + '

'; html += '
'; for (var i = 0; i < plugins.length; i++) { var plugin = plugins[i]; html += '
'; var isChecked = libraryOptions.DisabledSubtitleFetchers ? -1 === libraryOptions.DisabledSubtitleFetchers.indexOf(plugin.Name) : plugin.DefaultEnabled; - var checkedHtml = isChecked ? ' checked="checked"' : ""; - html += '"; + var checkedHtml = isChecked ? ' checked="checked"' : ''; + html += ''; html += '
'; html += '

'; html += plugin.Name; - html += "

"; - html += "
"; + html += ''; + html += '
'; if (i > 0) { - html += ''; + html += ''; } else if (plugins.length > 1) { - html += ''; + html += ''; } - html += "
"; + html += ''; } - html += ""; - html += '
' + globalize.translate("SubtitleDownloadersHelp") + "
"; + html += ''; + html += '
' + globalize.translate('SubtitleDownloadersHelp') + '
'; elem.innerHTML = html; } function getImageFetchersForTypeHtml(availableTypeOptions, libraryOptionsForType) { - var html = ""; + var html = ''; var plugins = availableTypeOptions.ImageFetchers; plugins = getOrderedPlugins(plugins, libraryOptionsForType.ImageFetcherOrder || []); @@ -201,60 +202,60 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct html += '
'; html += '
'; - html += '

' + globalize.translate("HeaderTypeImageFetchers", availableTypeOptions.Type) + "

"; + html += '

' + globalize.translate('HeaderTypeImageFetchers', availableTypeOptions.Type) + '

'; var supportedImageTypes = availableTypeOptions.SupportedImageTypes || []; - if (supportedImageTypes.length > 1 || 1 === supportedImageTypes.length && "Primary" !== supportedImageTypes[0]) { - html += '"; + if (supportedImageTypes.length > 1 || 1 === supportedImageTypes.length && 'Primary' !== supportedImageTypes[0]) { + html += ''; } - html += "
"; + html += '
'; html += '
'; for (var i = 0; i < plugins.length; i++) { var plugin = plugins[i]; html += '
'; var isChecked = libraryOptionsForType.ImageFetchers ? -1 !== libraryOptionsForType.ImageFetchers.indexOf(plugin.Name) : plugin.DefaultEnabled; - var checkedHtml = isChecked ? ' checked="checked"' : ""; - html += '"; + var checkedHtml = isChecked ? ' checked="checked"' : ''; + html += ''; html += '
'; html += '

'; html += plugin.Name; - html += "

"; - html += "
"; + html += ''; + html += '
'; if (i > 0) { - html += ''; + html += ''; } else if (plugins.length > 1) { - html += ''; + html += ''; } - html += "
"; + html += ''; } - html += ""; - html += '
' + globalize.translate("LabelImageFetchersHelp") + "
"; - html += ""; + html += ''; + html += '
' + globalize.translate('LabelImageFetchersHelp') + '
'; + html += ''; return html; } function renderImageFetchers(page, availableOptions, libraryOptions) { - var html = ""; - var elem = page.querySelector(".imageFetchers"); + var html = ''; + var elem = page.querySelector('.imageFetchers'); for (var i = 0; i < availableOptions.TypeOptions.length; i++) { var availableTypeOptions = availableOptions.TypeOptions[i]; html += getImageFetchersForTypeHtml(availableTypeOptions, getTypeOptions(libraryOptions, availableTypeOptions.Type) || {}); } elem.innerHTML = html; if (html) { - elem.classList.remove("hide"); - page.querySelector(".chkDownloadImagesInAdvanceContainer").classList.remove("hide"); - page.querySelector(".chkSaveLocalContainer").classList.remove("hide"); + elem.classList.remove('hide'); + page.querySelector('.chkDownloadImagesInAdvanceContainer').classList.remove('hide'); + page.querySelector('.chkSaveLocalContainer').classList.remove('hide'); } else { - elem.classList.add("hide"); - page.querySelector(".chkDownloadImagesInAdvanceContainer").classList.add("hide"); - page.querySelector(".chkSaveLocalContainer").classList.add("hide"); + elem.classList.add('hide'); + page.querySelector('.chkDownloadImagesInAdvanceContainer').classList.add('hide'); + page.querySelector('.chkSaveLocalContainer').classList.add('hide'); } return true; } function populateMetadataSettings(parent, contentType, isNewLibrary) { - var isNewLibrary = parent.classList.contains("newlibrary"); - return ApiClient.getJSON(ApiClient.getUrl("Libraries/AvailableOptions", { + var isNewLibrary = parent.classList.contains('newlibrary'); + return ApiClient.getJSON(ApiClient.getUrl('Libraries/AvailableOptions', { LibraryContentType: contentType, IsNewLibrary: isNewLibrary })).then(function(availableOptions) { @@ -265,70 +266,80 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct renderMetadataFetchers(parent, availableOptions, {}); renderSubtitleFetchers(parent, availableOptions, {}); renderImageFetchers(parent, availableOptions, {}); - availableOptions.SubtitleFetchers.length ? parent.querySelector(".subtitleDownloadSettings").classList.remove("hide") : parent.querySelector(".subtitleDownloadSettings").classList.add("hide"); + availableOptions.SubtitleFetchers.length ? parent.querySelector('.subtitleDownloadSettings').classList.remove('hide') : parent.querySelector('.subtitleDownloadSettings').classList.add('hide'); }).catch(function() { return Promise.resolve(); }); } function adjustSortableListElement(elem) { - var btnSortable = elem.querySelector(".btnSortable"); - var inner = btnSortable.querySelector("i"); + var btnSortable = elem.querySelector('.btnSortable'); + var inner = btnSortable.querySelector('.material-icons'); if (elem.previousSibling) { - btnSortable.title = globalize.translate("ButtonUp"); - btnSortable.classList.add("btnSortableMoveUp"); - btnSortable.classList.remove("btnSortableMoveDown"); - inner.classList.remove("keyboard_arrow_down"); - inner.classList.add("keyboard_arrow_up"); + btnSortable.title = globalize.translate('ButtonUp'); + btnSortable.classList.add('btnSortableMoveUp'); + btnSortable.classList.remove('btnSortableMoveDown'); + inner.classList.remove('keyboard_arrow_down'); + inner.classList.add('keyboard_arrow_up'); } else { - btnSortable.title = globalize.translate("ButtonDown"); - btnSortable.classList.remove("btnSortableMoveUp"); - btnSortable.classList.add("btnSortableMoveDown"); - inner.classList.remove("keyboard_arrow_up"); - inner.classList.add("keyboard_arrow_down"); + btnSortable.title = globalize.translate('ButtonDown'); + btnSortable.classList.remove('btnSortableMoveUp'); + btnSortable.classList.add('btnSortableMoveDown'); + inner.classList.remove('keyboard_arrow_up'); + inner.classList.add('keyboard_arrow_down'); } } function showImageOptionsForType(type) { - require(["imageoptionseditor"], function(ImageOptionsEditor) { + require(['imageoptionseditor'], function(ImageOptionsEditor) { var typeOptions = getTypeOptions(currentLibraryOptions, type); - typeOptions || (typeOptions = { - Type: type - }, currentLibraryOptions.TypeOptions.push(typeOptions)); + if (!typeOptions) { + typeOptions = { + Type: type + }; + currentLibraryOptions.TypeOptions.push(typeOptions); + } var availableOptions = getTypeOptions(currentAvailableOptions || {}, type); - (new ImageOptionsEditor).show(type, typeOptions, availableOptions); + var imageOptionsEditor = new ImageOptionsEditor(); + imageOptionsEditor.show(type, typeOptions, availableOptions); }); } function onImageFetchersContainerClick(e) { - var btnImageOptionsForType = dom.parentWithClass(e.target, "btnImageOptionsForType"); + var btnImageOptionsForType = dom.parentWithClass(e.target, 'btnImageOptionsForType'); if (btnImageOptionsForType) { - return void showImageOptionsForType(dom.parentWithClass(btnImageOptionsForType, "imageFetcher").getAttribute("data-type")); + return void showImageOptionsForType(dom.parentWithClass(btnImageOptionsForType, 'imageFetcher').getAttribute('data-type')); } onSortableContainerClick.call(this, e); } function onSortableContainerClick(e) { - var btnSortable = dom.parentWithClass(e.target, "btnSortable"); + var btnSortable = dom.parentWithClass(e.target, 'btnSortable'); if (btnSortable) { - var li = dom.parentWithClass(btnSortable, "sortableOption"); - var list = dom.parentWithClass(li, "paperList"); - if (btnSortable.classList.contains("btnSortableMoveDown")) { + var li = dom.parentWithClass(btnSortable, 'sortableOption'); + var list = dom.parentWithClass(li, 'paperList'); + if (btnSortable.classList.contains('btnSortableMoveDown')) { var next = li.nextSibling; - next && (li.parentNode.removeChild(li), next.parentNode.insertBefore(li, next.nextSibling)); + if (next) { + li.parentNode.removeChild(li); + next.parentNode.insertBefore(li, next.nextSibling); + } } else { var prev = li.previousSibling; - prev && (li.parentNode.removeChild(li), prev.parentNode.insertBefore(li, prev)); + if (prev) { + li.parentNode.removeChild(li); + prev.parentNode.insertBefore(li, prev); + } } - Array.prototype.forEach.call(list.querySelectorAll(".sortableOption"), adjustSortableListElement); + Array.prototype.forEach.call(list.querySelectorAll('.sortableOption'), adjustSortableListElement); } } function bindEvents(parent) { - parent.querySelector(".metadataReaders").addEventListener("click", onSortableContainerClick); - parent.querySelector(".subtitleFetchers").addEventListener("click", onSortableContainerClick); - parent.querySelector(".metadataFetchers").addEventListener("click", onSortableContainerClick); - parent.querySelector(".imageFetchers").addEventListener("click", onImageFetchersContainerClick); + parent.querySelector('.metadataReaders').addEventListener('click', onSortableContainerClick); + parent.querySelector('.subtitleFetchers').addEventListener('click', onSortableContainerClick); + parent.querySelector('.metadataFetchers').addEventListener('click', onSortableContainerClick); + parent.querySelector('.imageFetchers').addEventListener('click', onImageFetchersContainerClick); } function embed(parent, contentType, libraryOptions) { @@ -337,15 +348,15 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct }; currentAvailableOptions = null; var isNewLibrary = null === libraryOptions; - isNewLibrary && parent.classList.add("newlibrary"); + isNewLibrary && parent.classList.add('newlibrary'); return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest; - xhr.open("GET", "components/libraryoptionseditor/libraryoptionseditor.template.html", true); + xhr.open('GET', 'components/libraryoptionseditor/libraryoptionseditor.template.html', true); xhr.onload = function(e) { var template = this.response; parent.innerHTML = globalize.translateDocument(template); - populateRefreshInterval(parent.querySelector("#selectAutoRefreshInterval")); - var promises = [populateLanguages(parent), populateCountries(parent.querySelector("#selectCountry"))]; + populateRefreshInterval(parent.querySelector('#selectAutoRefreshInterval')); + var promises = [populateLanguages(parent), populateCountries(parent.querySelector('#selectCountry'))]; Promise.all(promises).then(function() { return setContentType(parent, contentType).then(function() { libraryOptions && setLibraryOptions(parent, libraryOptions); @@ -359,69 +370,69 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct } function setAdvancedVisible(parent, visible) { - var elems = parent.querySelectorAll(".advanced"); + var elems = parent.querySelectorAll('.advanced'); for (var i = 0; i < elems.length; i++) { - visible ? elems[i].classList.remove("advancedHide") : elems[i].classList.add("advancedHide"); + visible ? elems[i].classList.remove('advancedHide') : elems[i].classList.add('advancedHide'); } } function setContentType(parent, contentType) { - if (contentType === "homevideos" || contentType === "photos") { - parent.querySelector(".chkEnablePhotosContainer").classList.remove("hide"); + if (contentType === 'homevideos' || contentType === 'photos') { + parent.querySelector('.chkEnablePhotosContainer').classList.remove('hide'); } else { - parent.querySelector(".chkEnablePhotosContainer").classList.add("hide"); + parent.querySelector('.chkEnablePhotosContainer').classList.add('hide'); } - if (contentType !== "tvshows" && contentType !== "movies" && contentType !== "homevideos" && contentType !== "musicvideos" && contentType !== "mixed") { - parent.querySelector(".chapterSettingsSection").classList.add("hide"); + if (contentType !== 'tvshows' && contentType !== 'movies' && contentType !== 'homevideos' && contentType !== 'musicvideos' && contentType !== 'mixed') { + parent.querySelector('.chapterSettingsSection').classList.add('hide'); } else { - parent.querySelector(".chapterSettingsSection").classList.remove("hide"); + parent.querySelector('.chapterSettingsSection').classList.remove('hide'); } - if (contentType === "tvshows") { - parent.querySelector(".chkImportMissingEpisodesContainer").classList.remove("hide"); - parent.querySelector(".chkAutomaticallyGroupSeriesContainer").classList.remove("hide"); - parent.querySelector(".fldSeasonZeroDisplayName").classList.remove("hide"); - parent.querySelector("#txtSeasonZeroName").setAttribute("required", "required"); + if (contentType === 'tvshows') { + parent.querySelector('.chkImportMissingEpisodesContainer').classList.remove('hide'); + parent.querySelector('.chkAutomaticallyGroupSeriesContainer').classList.remove('hide'); + parent.querySelector('.fldSeasonZeroDisplayName').classList.remove('hide'); + parent.querySelector('#txtSeasonZeroName').setAttribute('required', 'required'); } else { - parent.querySelector(".chkImportMissingEpisodesContainer").classList.add("hide"); - parent.querySelector(".chkAutomaticallyGroupSeriesContainer").classList.add("hide"); - parent.querySelector(".fldSeasonZeroDisplayName").classList.add("hide"); - parent.querySelector("#txtSeasonZeroName").removeAttribute("required"); + parent.querySelector('.chkImportMissingEpisodesContainer').classList.add('hide'); + parent.querySelector('.chkAutomaticallyGroupSeriesContainer').classList.add('hide'); + parent.querySelector('.fldSeasonZeroDisplayName').classList.add('hide'); + parent.querySelector('#txtSeasonZeroName').removeAttribute('required'); } - if (contentType === "books" || contentType === "boxsets" || contentType === "playlists" || contentType === "music") { - parent.querySelector(".chkEnableEmbeddedTitlesContainer").classList.add("hide"); + if (contentType === 'books' || contentType === 'boxsets' || contentType === 'playlists' || contentType === 'music') { + parent.querySelector('.chkEnableEmbeddedTitlesContainer').classList.add('hide'); } else { - parent.querySelector(".chkEnableEmbeddedTitlesContainer").classList.remove("hide"); + parent.querySelector('.chkEnableEmbeddedTitlesContainer').classList.remove('hide'); } - if (contentType === "tvshows") { - parent.querySelector(".chkEnableEmbeddedEpisodeInfosContainer").classList.remove("hide"); + if (contentType === 'tvshows') { + parent.querySelector('.chkEnableEmbeddedEpisodeInfosContainer').classList.remove('hide'); } else { - parent.querySelector(".chkEnableEmbeddedEpisodeInfosContainer").classList.add("hide"); + parent.querySelector('.chkEnableEmbeddedEpisodeInfosContainer').classList.add('hide'); } return populateMetadataSettings(parent, contentType); } function setSubtitleFetchersIntoOptions(parent, options) { - options.DisabledSubtitleFetchers = Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll(".chkSubtitleFetcher"), function(elem) { + options.DisabledSubtitleFetchers = Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll('.chkSubtitleFetcher'), function(elem) { return !elem.checked; }), function(elem) { - return elem.getAttribute("data-pluginname"); + return elem.getAttribute('data-pluginname'); }); - options.SubtitleFetcherOrder = Array.prototype.map.call(parent.querySelectorAll(".subtitleFetcherItem"), function(elem) { - return elem.getAttribute("data-pluginname"); + options.SubtitleFetcherOrder = Array.prototype.map.call(parent.querySelectorAll('.subtitleFetcherItem'), function(elem) { + return elem.getAttribute('data-pluginname'); }); } function setMetadataFetchersIntoOptions(parent, options) { - var sections = parent.querySelectorAll(".metadataFetcher"); + var sections = parent.querySelectorAll('.metadataFetcher'); for (var i = 0; i < sections.length; i++) { var section = sections[i]; - var type = section.getAttribute("data-type"); + var type = section.getAttribute('data-type'); var typeOptions = getTypeOptions(options, type); if (!typeOptions) { typeOptions = { @@ -429,23 +440,23 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct }; options.TypeOptions.push(typeOptions); } - typeOptions.MetadataFetchers = Array.prototype.map.call(Array.prototype.filter.call(section.querySelectorAll(".chkMetadataFetcher"), function(elem) { + typeOptions.MetadataFetchers = Array.prototype.map.call(Array.prototype.filter.call(section.querySelectorAll('.chkMetadataFetcher'), function(elem) { return elem.checked; }), function(elem) { - return elem.getAttribute("data-pluginname"); + return elem.getAttribute('data-pluginname'); }); - typeOptions.MetadataFetcherOrder = Array.prototype.map.call(section.querySelectorAll(".metadataFetcherItem"), function(elem) { - return elem.getAttribute("data-pluginname"); + typeOptions.MetadataFetcherOrder = Array.prototype.map.call(section.querySelectorAll('.metadataFetcherItem'), function(elem) { + return elem.getAttribute('data-pluginname'); }); } } function setImageFetchersIntoOptions(parent, options) { - var sections = parent.querySelectorAll(".imageFetcher"); + var sections = parent.querySelectorAll('.imageFetcher'); for (var i = 0; i < sections.length; i++) { var section = sections[i]; - var type = section.getAttribute("data-type"); + var type = section.getAttribute('data-type'); var typeOptions = getTypeOptions(options, type); if (!typeOptions) { typeOptions = { @@ -454,14 +465,14 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct options.TypeOptions.push(typeOptions); } - typeOptions.ImageFetchers = Array.prototype.map.call(Array.prototype.filter.call(section.querySelectorAll(".chkImageFetcher"), function(elem) { + typeOptions.ImageFetchers = Array.prototype.map.call(Array.prototype.filter.call(section.querySelectorAll('.chkImageFetcher'), function(elem) { return elem.checked; }), function(elem) { - return elem.getAttribute("data-pluginname"); + return elem.getAttribute('data-pluginname'); }); - typeOptions.ImageFetcherOrder = Array.prototype.map.call(section.querySelectorAll(".imageFetcherItem"), function(elem) { - return elem.getAttribute("data-pluginname"); + typeOptions.ImageFetcherOrder = Array.prototype.map.call(section.querySelectorAll('.imageFetcherItem'), function(elem) { + return elem.getAttribute('data-pluginname'); }); } } @@ -485,40 +496,40 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct function getLibraryOptions(parent) { var options = { EnableArchiveMediaFiles: false, - EnablePhotos: parent.querySelector(".chkEnablePhotos").checked, - EnableRealtimeMonitor: parent.querySelector(".chkEnableRealtimeMonitor").checked, - ExtractChapterImagesDuringLibraryScan: parent.querySelector(".chkExtractChaptersDuringLibraryScan").checked, - EnableChapterImageExtraction: parent.querySelector(".chkExtractChapterImages").checked, - DownloadImagesInAdvance: parent.querySelector("#chkDownloadImagesInAdvance").checked, + EnablePhotos: parent.querySelector('.chkEnablePhotos').checked, + EnableRealtimeMonitor: parent.querySelector('.chkEnableRealtimeMonitor').checked, + ExtractChapterImagesDuringLibraryScan: parent.querySelector('.chkExtractChaptersDuringLibraryScan').checked, + EnableChapterImageExtraction: parent.querySelector('.chkExtractChapterImages').checked, + DownloadImagesInAdvance: parent.querySelector('#chkDownloadImagesInAdvance').checked, EnableInternetProviders: true, - ImportMissingEpisodes: parent.querySelector("#chkImportMissingEpisodes").checked, - SaveLocalMetadata: parent.querySelector("#chkSaveLocal").checked, - EnableAutomaticSeriesGrouping: parent.querySelector(".chkAutomaticallyGroupSeries").checked, - PreferredMetadataLanguage: parent.querySelector("#selectLanguage").value, - MetadataCountryCode: parent.querySelector("#selectCountry").value, - SeasonZeroDisplayName: parent.querySelector("#txtSeasonZeroName").value, - AutomaticRefreshIntervalDays: parseInt(parent.querySelector("#selectAutoRefreshInterval").value), - EnableEmbeddedTitles: parent.querySelector("#chkEnableEmbeddedTitles").checked, - EnableEmbeddedEpisodeInfos: parent.querySelector("#chkEnableEmbeddedEpisodeInfos").checked, - SkipSubtitlesIfEmbeddedSubtitlesPresent: parent.querySelector("#chkSkipIfGraphicalSubsPresent").checked, - SkipSubtitlesIfAudioTrackMatches: parent.querySelector("#chkSkipIfAudioTrackPresent").checked, - SaveSubtitlesWithMedia: parent.querySelector("#chkSaveSubtitlesLocally").checked, - RequirePerfectSubtitleMatch: parent.querySelector("#chkRequirePerfectMatch").checked, - MetadataSavers: Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll(".chkMetadataSaver"), function(elem) { + ImportMissingEpisodes: parent.querySelector('#chkImportMissingEpisodes').checked, + SaveLocalMetadata: parent.querySelector('#chkSaveLocal').checked, + EnableAutomaticSeriesGrouping: parent.querySelector('.chkAutomaticallyGroupSeries').checked, + PreferredMetadataLanguage: parent.querySelector('#selectLanguage').value, + MetadataCountryCode: parent.querySelector('#selectCountry').value, + SeasonZeroDisplayName: parent.querySelector('#txtSeasonZeroName').value, + AutomaticRefreshIntervalDays: parseInt(parent.querySelector('#selectAutoRefreshInterval').value), + EnableEmbeddedTitles: parent.querySelector('#chkEnableEmbeddedTitles').checked, + EnableEmbeddedEpisodeInfos: parent.querySelector('#chkEnableEmbeddedEpisodeInfos').checked, + SkipSubtitlesIfEmbeddedSubtitlesPresent: parent.querySelector('#chkSkipIfGraphicalSubsPresent').checked, + SkipSubtitlesIfAudioTrackMatches: parent.querySelector('#chkSkipIfAudioTrackPresent').checked, + SaveSubtitlesWithMedia: parent.querySelector('#chkSaveSubtitlesLocally').checked, + RequirePerfectSubtitleMatch: parent.querySelector('#chkRequirePerfectMatch').checked, + MetadataSavers: Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll('.chkMetadataSaver'), function(elem) { return elem.checked; }), function(elem) { - return elem.getAttribute("data-pluginname"); + return elem.getAttribute('data-pluginname'); }), TypeOptions: [] }; - options.LocalMetadataReaderOrder = Array.prototype.map.call(parent.querySelectorAll(".localReaderOption"), function(elem) { - return elem.getAttribute("data-pluginname"); + options.LocalMetadataReaderOrder = Array.prototype.map.call(parent.querySelectorAll('.localReaderOption'), function(elem) { + return elem.getAttribute('data-pluginname'); }); - options.SubtitleDownloadLanguages = Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll(".chkSubtitleLanguage"), function(elem) { + options.SubtitleDownloadLanguages = Array.prototype.map.call(Array.prototype.filter.call(parent.querySelectorAll('.chkSubtitleLanguage'), function(elem) { return elem.checked; }), function(elem) { - return elem.getAttribute("data-lang"); + return elem.getAttribute('data-lang'); }); setSubtitleFetchersIntoOptions(parent, options); setMetadataFetchersIntoOptions(parent, options); @@ -539,29 +550,29 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct function setLibraryOptions(parent, options) { currentLibraryOptions = options; currentAvailableOptions = parent.availableOptions; - parent.querySelector("#selectLanguage").value = options.PreferredMetadataLanguage || ""; - parent.querySelector("#selectCountry").value = options.MetadataCountryCode || ""; - parent.querySelector("#selectAutoRefreshInterval").value = options.AutomaticRefreshIntervalDays || "0"; - parent.querySelector("#txtSeasonZeroName").value = options.SeasonZeroDisplayName || "Specials"; - parent.querySelector(".chkEnablePhotos").checked = options.EnablePhotos; - 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("#chkSaveLocal").checked = options.SaveLocalMetadata; - parent.querySelector("#chkImportMissingEpisodes").checked = options.ImportMissingEpisodes; - parent.querySelector(".chkAutomaticallyGroupSeries").checked = options.EnableAutomaticSeriesGrouping; - parent.querySelector("#chkEnableEmbeddedTitles").checked = options.EnableEmbeddedTitles; - parent.querySelector("#chkEnableEmbeddedEpisodeInfos").checked = options.EnableEmbeddedEpisodeInfos; - parent.querySelector("#chkSkipIfGraphicalSubsPresent").checked = options.SkipSubtitlesIfEmbeddedSubtitlesPresent; - parent.querySelector("#chkSaveSubtitlesLocally").checked = options.SaveSubtitlesWithMedia; - parent.querySelector("#chkSkipIfAudioTrackPresent").checked = options.SkipSubtitlesIfAudioTrackMatches; - parent.querySelector("#chkRequirePerfectMatch").checked = options.RequirePerfectSubtitleMatch; - Array.prototype.forEach.call(parent.querySelectorAll(".chkMetadataSaver"), function(elem) { - elem.checked = options.MetadataSavers ? -1 !== options.MetadataSavers.indexOf(elem.getAttribute("data-pluginname")) : "true" === elem.getAttribute("data-defaultenabled"); + parent.querySelector('#selectLanguage').value = options.PreferredMetadataLanguage || ''; + parent.querySelector('#selectCountry').value = options.MetadataCountryCode || ''; + parent.querySelector('#selectAutoRefreshInterval').value = options.AutomaticRefreshIntervalDays || '0'; + parent.querySelector('#txtSeasonZeroName').value = options.SeasonZeroDisplayName || 'Specials'; + parent.querySelector('.chkEnablePhotos').checked = options.EnablePhotos; + 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('#chkSaveLocal').checked = options.SaveLocalMetadata; + parent.querySelector('#chkImportMissingEpisodes').checked = options.ImportMissingEpisodes; + parent.querySelector('.chkAutomaticallyGroupSeries').checked = options.EnableAutomaticSeriesGrouping; + parent.querySelector('#chkEnableEmbeddedTitles').checked = options.EnableEmbeddedTitles; + parent.querySelector('#chkEnableEmbeddedEpisodeInfos').checked = options.EnableEmbeddedEpisodeInfos; + parent.querySelector('#chkSkipIfGraphicalSubsPresent').checked = options.SkipSubtitlesIfEmbeddedSubtitlesPresent; + parent.querySelector('#chkSaveSubtitlesLocally').checked = options.SaveSubtitlesWithMedia; + parent.querySelector('#chkSkipIfAudioTrackPresent').checked = options.SkipSubtitlesIfAudioTrackMatches; + parent.querySelector('#chkRequirePerfectMatch').checked = options.RequirePerfectSubtitleMatch; + Array.prototype.forEach.call(parent.querySelectorAll('.chkMetadataSaver'), function(elem) { + elem.checked = options.MetadataSavers ? -1 !== options.MetadataSavers.indexOf(elem.getAttribute('data-pluginname')) : 'true' === elem.getAttribute('data-defaultenabled'); }); - Array.prototype.forEach.call(parent.querySelectorAll(".chkSubtitleLanguage"), function(elem) { - elem.checked = !!options.SubtitleDownloadLanguages && -1 !== options.SubtitleDownloadLanguages.indexOf(elem.getAttribute("data-lang")); + Array.prototype.forEach.call(parent.querySelectorAll('.chkSubtitleLanguage'), function(elem) { + elem.checked = !!options.SubtitleDownloadLanguages && -1 !== options.SubtitleDownloadLanguages.indexOf(elem.getAttribute('data-lang')); }); renderMetadataReaders(parent, getOrderedPlugins(parent.availableOptions.MetadataReaders, options.LocalMetadataReaderOrder || [])); renderMetadataFetchers(parent, parent.availableOptions, options); diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js index 76fda7a0c..0743b3528 100644 --- a/src/components/listview/listview.js +++ b/src/components/listview/listview.js @@ -73,7 +73,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan var options = { maxWidth: width * 2, - type: "Primary" + type: 'Primary' }; if (item.ImageTags && item.ImageTags.Primary) { @@ -106,7 +106,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan var options = { maxWidth: width * 2, - type: "Primary" + type: 'Primary' }; if (item.ChannelId && item.ChannelPrimaryImageTag) { @@ -160,7 +160,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan var button = options.rightButtons[i]; - html += ''; + html += ''; } return html; @@ -219,7 +219,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } } - var cssClass = "listItem"; + var cssClass = 'listItem'; if (options.border || (options.highlight !== false && !layoutManager.tv)) { cssClass += ' listItem-border'; @@ -236,7 +236,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan var downloadWidth = 80; if (isLargeStyle) { - cssClass += " listItem-largeImage"; + cssClass += ' listItem-largeImage'; downloadWidth = 500; } @@ -262,9 +262,9 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } if (!clickEntireItem && options.dragHandle) { - //html += ''; + //html += ''; // Firefox and Edge are not allowing the button to be draggable - html += ''; + html += ''; } if (options.image !== false) { @@ -297,7 +297,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan } if (playOnImageClick) { - html += ''; + html += ''; } var progressHtml = indicators.getProgressBarHtml(item, { @@ -355,7 +355,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan }); if (options.showIndexNumber && item.IndexNumber != null) { - displayName = item.IndexNumber + ". " + displayName; + displayName = item.IndexNumber + '. ' + displayName; } if (options.showParentTitle && options.parentTitleWithTitle) { @@ -426,7 +426,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan html += '
'; - var moreIcon = ''; + const moreIcon = 'more_horiz'; html += getTextLinesHtml(textlines, isLargeStyle); @@ -475,15 +475,15 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (!clickEntireItem) { if (options.addToListButton) { - html += ''; + html += ''; } if (options.moreButton !== false) { - html += ''; + html += ''; } if (options.infoButton) { - html += ''; + html += ''; } if (options.rightButtons) { @@ -496,11 +496,11 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan var likes = userData.Likes == null ? '' : userData.Likes; if (itemHelper.canMarkPlayed(item)) { - html += ''; + html += ''; } if (itemHelper.canRate(item)) { - html += ''; + html += ''; } } } diff --git a/src/components/loading/loading.js b/src/components/loading/loading.js index d6c00347c..9a9aa3ca7 100644 --- a/src/components/loading/loading.js +++ b/src/components/loading/loading.js @@ -19,7 +19,7 @@ define(['components/loading/loadingLegacy', 'browser', 'css!./loading'], functio if (!elem) { - elem = document.createElement("div"); + elem = document.createElement('div'); loadingElem = elem; elem.classList.add('docspinner'); diff --git a/src/components/loading/loadingLegacy.js b/src/components/loading/loadingLegacy.js index 757cea016..d766a4aca 100644 --- a/src/components/loading/loadingLegacy.js +++ b/src/components/loading/loadingLegacy.js @@ -7,7 +7,7 @@ define(['require', 'css!./loadingLegacy'], function (require) { show: function () { var elem = loadingElem; if (!elem) { - elem = document.createElement("img"); + elem = document.createElement('img'); elem.src = require.toUrl('.').split('?')[0] + '/loader.gif'; loadingElem = elem; diff --git a/src/components/logoscreensaver/plugin.js b/src/components/logoscreensaver/plugin.js index 2becfad0c..f9dd90198 100644 --- a/src/components/logoscreensaver/plugin.js +++ b/src/components/logoscreensaver/plugin.js @@ -1,12 +1,12 @@ -define(["pluginManager"], function (pluginManager) { +define(['pluginManager'], function (pluginManager) { return function () { var self = this; - self.name = "Logo ScreenSaver"; - self.type = "screensaver"; - self.id = "logoscreensaver"; + self.name = 'Logo ScreenSaver'; + self.type = 'screensaver'; + self.id = 'logoscreensaver'; self.supportsAnonymous = true; var interval; @@ -24,7 +24,7 @@ define(["pluginManager"], function (pluginManager) { rotateOut ]; - var elem = document.querySelector(".logoScreenSaverImage"); + var elem = document.querySelector('.logoScreenSaverImage'); if (elem && elem.animate) { var random = getRandomInt(0, animations.length - 1); @@ -39,96 +39,96 @@ define(["pluginManager"], function (pluginManager) { function bounceInLeft(elem, iterations) { var keyframes = [ - { transform: "translate3d(-3000px, 0, 0)", opacity: "0", offset: 0 }, - { transform: "translate3d(25px, 0, 0)", opacity: "1", offset: 0.6 }, - { transform: "translate3d(-100px, 0, 0)", offset: 0.75 }, - { transform: "translate3d(5px, 0, 0)", offset: 0.9 }, - { transform: "none", opacity: "1", offset: 1 }]; - var timing = { duration: 900, iterations: iterations, easing: "cubic-bezier(0.215, 0.610, 0.355, 1.000)" }; + { transform: 'translate3d(-3000px, 0, 0)', opacity: '0', offset: 0 }, + { transform: 'translate3d(25px, 0, 0)', opacity: '1', offset: 0.6 }, + { transform: 'translate3d(-100px, 0, 0)', offset: 0.75 }, + { transform: 'translate3d(5px, 0, 0)', offset: 0.9 }, + { transform: 'none', opacity: '1', offset: 1 }]; + var timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' }; return elem.animate(keyframes, timing); } function bounceInRight(elem, iterations) { var keyframes = [ - { transform: "translate3d(3000px, 0, 0)", opacity: "0", offset: 0 }, - { transform: "translate3d(-25px, 0, 0)", opacity: "1", offset: 0.6 }, - { transform: "translate3d(100px, 0, 0)", offset: 0.75 }, - { transform: "translate3d(-5px, 0, 0)", offset: 0.9 }, - { transform: "none", opacity: "1", offset: 1 }]; - var timing = { duration: 900, iterations: iterations, easing: "cubic-bezier(0.215, 0.610, 0.355, 1.000)" }; + { transform: 'translate3d(3000px, 0, 0)', opacity: '0', offset: 0 }, + { transform: 'translate3d(-25px, 0, 0)', opacity: '1', offset: 0.6 }, + { transform: 'translate3d(100px, 0, 0)', offset: 0.75 }, + { transform: 'translate3d(-5px, 0, 0)', offset: 0.9 }, + { transform: 'none', opacity: '1', offset: 1 }]; + var timing = { duration: 900, iterations: iterations, easing: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' }; return elem.animate(keyframes, timing); } function shake(elem, iterations) { var keyframes = [ - { transform: "translate3d(0, 0, 0)", offset: 0 }, - { transform: "translate3d(-10px, 0, 0)", offset: 0.1 }, - { transform: "translate3d(10px, 0, 0)", offset: 0.2 }, - { transform: "translate3d(-10px, 0, 0)", offset: 0.3 }, - { transform: "translate3d(10px, 0, 0)", offset: 0.4 }, - { transform: "translate3d(-10px, 0, 0)", offset: 0.5 }, - { transform: "translate3d(10px, 0, 0)", offset: 0.6 }, - { transform: "translate3d(-10px, 0, 0)", offset: 0.7 }, - { transform: "translate3d(10px, 0, 0)", offset: 0.8 }, - { transform: "translate3d(-10px, 0, 0)", offset: 0.9 }, - { transform: "translate3d(0, 0, 0)", offset: 1 }]; + { transform: 'translate3d(0, 0, 0)', offset: 0 }, + { transform: 'translate3d(-10px, 0, 0)', offset: 0.1 }, + { transform: 'translate3d(10px, 0, 0)', offset: 0.2 }, + { transform: 'translate3d(-10px, 0, 0)', offset: 0.3 }, + { transform: 'translate3d(10px, 0, 0)', offset: 0.4 }, + { transform: 'translate3d(-10px, 0, 0)', offset: 0.5 }, + { transform: 'translate3d(10px, 0, 0)', offset: 0.6 }, + { transform: 'translate3d(-10px, 0, 0)', offset: 0.7 }, + { transform: 'translate3d(10px, 0, 0)', offset: 0.8 }, + { transform: 'translate3d(-10px, 0, 0)', offset: 0.9 }, + { transform: 'translate3d(0, 0, 0)', offset: 1 }]; var timing = { duration: 900, iterations: iterations }; return elem.animate(keyframes, timing); } function swing(elem, iterations) { var keyframes = [ - { transform: "translate(0%)", offset: 0 }, - { transform: "rotate3d(0, 0, 1, 15deg)", offset: 0.2 }, - { transform: "rotate3d(0, 0, 1, -10deg)", offset: 0.4 }, - { transform: "rotate3d(0, 0, 1, 5deg)", offset: 0.6 }, - { transform: "rotate3d(0, 0, 1, -5deg)", offset: 0.8 }, - { transform: "rotate3d(0, 0, 1, 0deg)", offset: 1 }]; + { transform: 'translate(0%)', offset: 0 }, + { transform: 'rotate3d(0, 0, 1, 15deg)', offset: 0.2 }, + { transform: 'rotate3d(0, 0, 1, -10deg)', offset: 0.4 }, + { transform: 'rotate3d(0, 0, 1, 5deg)', offset: 0.6 }, + { transform: 'rotate3d(0, 0, 1, -5deg)', offset: 0.8 }, + { transform: 'rotate3d(0, 0, 1, 0deg)', offset: 1 }]; var timing = { duration: 900, iterations: iterations }; return elem.animate(keyframes, timing); } function tada(elem, iterations) { var keyframes = [ - { transform: "scale3d(1, 1, 1)", offset: 0 }, - { transform: "scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)", offset: 0.1 }, - { transform: "scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)", offset: 0.2 }, - { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)", offset: 0.3 }, - { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)", offset: 0.4 }, - { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)", offset: 0.5 }, - { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)", offset: 0.6 }, - { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)", offset: 0.7 }, - { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)", offset: 0.8 }, - { transform: "scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)", offset: 0.9 }, - { transform: "scale3d(1, 1, 1)", offset: 1 }]; + { transform: 'scale3d(1, 1, 1)', offset: 0 }, + { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.1 }, + { transform: 'scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg)', offset: 0.2 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.3 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.4 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.5 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.6 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.7 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg)', offset: 0.8 }, + { transform: 'scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg)', offset: 0.9 }, + { transform: 'scale3d(1, 1, 1)', offset: 1 }]; var timing = { duration: 900, iterations: iterations }; return elem.animate(keyframes, timing); } function wobble(elem, iterations) { var keyframes = [ - { transform: "translate(0%)", offset: 0 }, - { transform: "translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)", offset: 0.15 }, - { transform: "translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)", offset: 0.45 }, - { transform: "translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)", offset: 0.6 }, - { transform: "translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)", offset: 0.75 }, - { transform: "translateX(0%)", offset: 1 }]; + { transform: 'translate(0%)', offset: 0 }, + { transform: 'translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg)', offset: 0.15 }, + { transform: 'translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg)', offset: 0.45 }, + { transform: 'translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg)', offset: 0.6 }, + { transform: 'translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg)', offset: 0.75 }, + { transform: 'translateX(0%)', offset: 1 }]; var timing = { duration: 900, iterations: iterations }; return elem.animate(keyframes, timing); } function rotateIn(elem, iterations) { - var transformOrigin = elem.style["transform-origin"]; - var keyframes = [{ transform: "rotate3d(0, 0, 1, -200deg)", opacity: "0", transformOrigin: "center", offset: 0 }, - { transform: "none", opacity: "1", transformOrigin: "center", offset: 1 }]; + var transformOrigin = elem.style['transform-origin']; + var keyframes = [{ transform: 'rotate3d(0, 0, 1, -200deg)', opacity: '0', transformOrigin: 'center', offset: 0 }, + { transform: 'none', opacity: '1', transformOrigin: 'center', offset: 1 }]; var timing = { duration: 900, iterations: iterations }; return elem.animate(keyframes, timing); } function rotateOut(elem, iterations) { - var transformOrigin = elem.style["transform-origin"]; - var keyframes = [{ transform: "none", opacity: "1", transformOrigin: "center", offset: 0 }, - { transform: "rotate3d(0, 0, 1, 200deg)", opacity: "0", transformOrigin: "center", offset: 1 }]; + var transformOrigin = elem.style['transform-origin']; + var keyframes = [{ transform: 'none', opacity: '1', transformOrigin: 'center', offset: 0 }, + { transform: 'rotate3d(0, 0, 1, 200deg)', opacity: '0', transformOrigin: 'center', offset: 1 }]; var timing = { duration: 900, iterations: iterations }; return elem.animate(keyframes, timing); @@ -136,8 +136,8 @@ define(["pluginManager"], function (pluginManager) { function fadeOut(elem, iterations) { var keyframes = [ - { opacity: "1", offset: 0 }, - { opacity: "0", offset: 1 }]; + { opacity: '1', offset: 0 }, + { opacity: '0', offset: 1 }]; var timing = { duration: 400, iterations: iterations }; return elem.animate(keyframes, timing); } @@ -151,13 +151,13 @@ define(["pluginManager"], function (pluginManager) { self.show = function () { - require(["css!" + pluginManager.mapPath(self, "style.css")], function () { + require(['css!' + pluginManager.mapPath(self, 'style.css')], function () { - var elem = document.querySelector(".logoScreenSaver"); + var elem = document.querySelector('.logoScreenSaver'); if (!elem) { - elem = document.createElement("div"); - elem.classList.add("logoScreenSaver"); + elem = document.createElement('div'); + elem.classList.add('logoScreenSaver'); document.body.appendChild(elem); elem.innerHTML = ''; @@ -172,7 +172,7 @@ define(["pluginManager"], function (pluginManager) { stopInterval(); - var elem = document.querySelector(".logoScreenSaver"); + var elem = document.querySelector('.logoScreenSaver'); if (elem) { diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index 257147001..e1c543436 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -166,6 +166,7 @@ define(['dom', 'browser', 'events', 'emby-tabs', 'emby-button'], function (dom, }).join('') + '
'; tabsContainerElem.innerHTML = tabsHtml; + window.CustomElements.upgradeSubtree(tabsContainerElem); document.body.classList.add('withSectionTabs'); tabOwnerView = view; diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index 188ea9a07..c569a7c78 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -6,7 +6,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater var status; if (item.Type === 'SeriesTimer') { - return ''; + return ''; } else if (item.TimerId || item.SeriesTimerId) { status = item.Status || 'Cancelled'; @@ -20,13 +20,13 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater if (item.SeriesTimerId) { if (status !== 'Cancelled') { - return ''; + return ''; } - return ''; + return ''; } - return ''; + return ''; } function getProgramInfoHtml(item, options) { @@ -57,7 +57,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater miscInfo.push(text); } catch (e) { - console.error("error parsing date: " + item.StartDate); + console.error('error parsing date: ' + item.StartDate); } } @@ -109,7 +109,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater var minutes; var count; - var showFolderRuntime = item.Type === "MusicAlbum" || item.MediaType === 'MusicArtist' || item.MediaType === 'Playlist' || item.MediaType === 'MusicGenre'; + var showFolderRuntime = item.Type === 'MusicAlbum' || item.MediaType === 'MusicArtist' || item.MediaType === 'Playlist' || item.MediaType === 'MusicGenre'; if (showFolderRuntime) { @@ -123,7 +123,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater if (item.RunTimeTicks) { miscInfo.push(datetime.getDisplayRunningTime(item.RunTimeTicks)); } - } else if (item.Type === "PhotoAlbum" || item.Type === "BoxSet") { + } else if (item.Type === 'PhotoAlbum' || item.Type === 'BoxSet') { count = item.ChildCount; @@ -133,7 +133,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater } } - if ((item.Type === "Episode" || item.MediaType === 'Photo') && options.originalAirDate !== false) { + if ((item.Type === 'Episode' || item.MediaType === 'Photo') && options.originalAirDate !== false) { if (item.PremiereDate) { @@ -143,7 +143,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = datetime.toLocaleDateString(date); miscInfo.push(text); } catch (e) { - console.error("error parsing date: " + item.PremiereDate); + console.error('error parsing date: ' + item.PremiereDate); } } } @@ -171,18 +171,18 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = datetime.toLocaleDateString(date); miscInfo.push(text); - if (item.Type !== "Recording") { + if (item.Type !== 'Recording') { text = datetime.getDisplayTime(date); miscInfo.push(text); } } catch (e) { - console.error("error parsing date: " + item.StartDate); + console.error('error parsing date: ' + item.StartDate); } } - if (options.year !== false && item.ProductionYear && item.Type === "Series") { + if (options.year !== false && item.ProductionYear && item.Type === 'Series') { - if (item.Status === "Continuing") { + if (item.Status === 'Continuing') { miscInfo.push(globalize.translate('SeriesYearToPresent', item.ProductionYear)); } else if (item.ProductionYear) { @@ -196,11 +196,11 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater var endYear = datetime.parseISO8601Date(item.EndDate).getFullYear(); if (endYear !== item.ProductionYear) { - text += "-" + datetime.parseISO8601Date(item.EndDate).getFullYear(); + text += '-' + datetime.parseISO8601Date(item.EndDate).getFullYear(); } } catch (e) { - console.error("error parsing date: " + item.EndDate); + console.error('error parsing date: ' + item.EndDate); } } @@ -248,7 +248,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = globalize.translate('OriginalAirDateValue', datetime.toLocaleDateString(date)); miscInfo.push(text); } catch (e) { - console.error("error parsing date: " + item.PremiereDate); + console.error('error parsing date: ' + item.PremiereDate); } } else if (item.ProductionYear) { miscInfo.push(item.ProductionYear); @@ -256,7 +256,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater } if (options.year !== false) { - if (item.Type !== "Series" && item.Type !== "Episode" && item.Type !== "Person" && item.MediaType !== 'Photo' && item.Type !== 'Program' && item.Type !== 'Season') { + if (item.Type !== 'Series' && item.Type !== 'Episode' && item.Type !== 'Person' && item.MediaType !== 'Photo' && item.Type !== 'Program' && item.Type !== 'Season') { if (item.ProductionYear) { @@ -267,15 +267,15 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = datetime.parseISO8601Date(item.PremiereDate).getFullYear(); miscInfo.push(text); } catch (e) { - console.error("error parsing date: " + item.PremiereDate); + console.error('error parsing date: ' + item.PremiereDate); } } } } - if (item.RunTimeTicks && item.Type !== "Series" && item.Type !== 'Program' && !showFolderRuntime && options.runtime !== false) { + if (item.RunTimeTicks && item.Type !== 'Series' && item.Type !== 'Program' && !showFolderRuntime && options.runtime !== false) { - if (item.Type === "Audio") { + if (item.Type === 'Audio') { miscInfo.push(datetime.getDisplayRunningTime(item.RunTimeTicks)); @@ -284,11 +284,11 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater minutes = minutes || 1; - miscInfo.push(Math.round(minutes) + " mins"); + miscInfo.push(Math.round(minutes) + ' mins'); } } - if (item.OfficialRating && item.Type !== "Season" && item.Type !== "Episode") { + if (item.OfficialRating && item.Type !== 'Season' && item.Type !== 'Episode') { miscInfo.push({ text: item.OfficialRating, cssClass: 'mediaInfoOfficialRating' @@ -296,11 +296,11 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater } if (item.Video3DFormat) { - miscInfo.push("3D"); + miscInfo.push('3D'); } if (item.MediaType === 'Photo' && item.Width && item.Height) { - miscInfo.push(item.Width + "x" + item.Height); + miscInfo.push(item.Width + 'x' + item.Height); } if (options.container !== false && item.Type === 'Audio' && item.Container) { @@ -390,7 +390,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater if (item.CommunityRating) { html += '
'; - html += 'star'; + html += ''; html += item.CommunityRating.toFixed(1); html += '
'; } @@ -490,26 +490,26 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater if (i.IsInterlaced) { return '1440i'; } - return '1440P'; + return '1440p'; } if (width >= 1800 || height >= 1000) { if (i.IsInterlaced) { return '1080i'; } - return '1080P'; + return '1080p'; } if (width >= 1200 || height >= 700) { if (i.IsInterlaced) { return '720i'; } - return '720P'; + return '720p'; } if (width >= 700 || height >= 400) { if (i.IsInterlaced) { return '480i'; } - return '480P'; + return '480p'; } } diff --git a/src/components/medialibrarycreator/medialibrarycreator.js b/src/components/medialibrarycreator/medialibrarycreator.js index 1665efe27..450f5a64e 100644 --- a/src/components/medialibrarycreator/medialibrarycreator.js +++ b/src/components/medialibrarycreator/medialibrarycreator.js @@ -1,5 +1,5 @@ -define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionseditor/libraryoptionseditor", "globalize", "emby-toggle", "emby-input", "emby-select", "paper-icon-button-light", "listViewStyle", "formDialogStyle", "emby-button", "flexStyles"], function (loading, dialogHelper, dom, $, libraryoptionseditor, globalize) { - "use strict"; +define(['loading', 'dialogHelper', 'dom', 'jQuery', 'components/libraryoptionseditor/libraryoptionseditor', 'globalize', 'emby-toggle', 'emby-input', 'emby-select', 'paper-icon-button-light', 'listViewStyle', 'formDialogStyle', 'emby-button', 'flexStyles'], function (loading, dialogHelper, dom, $, libraryoptionseditor, globalize) { + 'use strict'; function onAddLibrary() { if (isCreating) { @@ -7,10 +7,10 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed } if (pathInfos.length == 0) { - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert({ - text: globalize.translate("PleaseAddAtLeastOneFolder"), - type: "error" + text: globalize.translate('PleaseAddAtLeastOneFolder'), + type: 'error' }); }); @@ -19,15 +19,15 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed isCreating = true; loading.show(); - var dlg = dom.parentWithClass(this, "dlg-librarycreator"); - var name = $("#txtValue", dlg).val(); - var type = $("#selectCollectionType", dlg).val(); + var dlg = dom.parentWithClass(this, 'dlg-librarycreator'); + var name = $('#txtValue', dlg).val(); + var type = $('#selectCollectionType', dlg).val(); - if (type == "mixed") { + if (type == 'mixed') { type = null; } - var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector(".libraryOptions")); + var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector('.libraryOptions')); libraryOptions.PathInfos = pathInfos; ApiClient.addVirtualFolder(name, type, currentOptions.refresh, libraryOptions).then(function () { hasChanges = true; @@ -35,8 +35,8 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed loading.hide(); dialogHelper.close(dlg); }, function () { - require(["toast"], function (toast) { - toast(globalize.translate("ErrorAddingMediaPathToVirtualFolder")); + require(['toast'], function (toast) { + toast(globalize.translate('ErrorAddingMediaPathToVirtualFolder')); }); isCreating = false; @@ -47,50 +47,50 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed function getCollectionTypeOptionsHtml(collectionTypeOptions) { return collectionTypeOptions.map(function (i) { - return '"; - }).join(""); + return ''; + }).join(''); } function initEditor(page, collectionTypeOptions) { - $("#selectCollectionType", page).html(getCollectionTypeOptionsHtml(collectionTypeOptions)).val("").on("change", function () { + $('#selectCollectionType', page).html(getCollectionTypeOptionsHtml(collectionTypeOptions)).val('').on('change', function () { var value = this.value; - var dlg = $(this).parents(".dialog")[0]; - libraryoptionseditor.setContentType(dlg.querySelector(".libraryOptions"), value == "mixed" ? "" : value); + var dlg = $(this).parents('.dialog')[0]; + libraryoptionseditor.setContentType(dlg.querySelector('.libraryOptions'), value == 'mixed' ? '' : value); if (value) { - dlg.querySelector(".libraryOptions").classList.remove("hide"); + dlg.querySelector('.libraryOptions').classList.remove('hide'); } else { - dlg.querySelector(".libraryOptions").classList.add("hide"); + dlg.querySelector('.libraryOptions').classList.add('hide'); } - if (value != "mixed") { + if (value != 'mixed') { var index = this.selectedIndex; if (index != -1) { - var name = this.options[index].innerHTML.replace("*", "").replace("&", "&"); - $("#txtValue", dlg).val(name); + var name = this.options[index].innerHTML.replace('*', '').replace('&', '&'); + $('#txtValue', dlg).val(name); var folderOption = collectionTypeOptions.filter(function (i) { return i.value == value; })[0]; - $(".collectionTypeFieldDescription", dlg).html(folderOption.message || ""); + $('.collectionTypeFieldDescription', dlg).html(folderOption.message || ''); } } }); - page.querySelector(".btnAddFolder").addEventListener("click", onAddButtonClick); - page.querySelector(".btnSubmit").addEventListener("click", onAddLibrary); - page.querySelector(".folderList").addEventListener("click", onRemoveClick); - page.querySelector(".chkAdvanced").addEventListener("change", onToggleAdvancedChange); + page.querySelector('.btnAddFolder').addEventListener('click', onAddButtonClick); + page.querySelector('.btnSubmit').addEventListener('click', onAddLibrary); + page.querySelector('.folderList').addEventListener('click', onRemoveClick); + page.querySelector('.chkAdvanced').addEventListener('change', onToggleAdvancedChange); } function onToggleAdvancedChange() { - var dlg = dom.parentWithClass(this, "dlg-librarycreator"); - libraryoptionseditor.setAdvancedVisible(dlg.querySelector(".libraryOptions"), this.checked); + var dlg = dom.parentWithClass(this, 'dlg-librarycreator'); + libraryoptionseditor.setAdvancedVisible(dlg.querySelector('.libraryOptions'), this.checked); } function onAddButtonClick() { - var page = dom.parentWithClass(this, "dlg-librarycreator"); + var page = dom.parentWithClass(this, 'dlg-librarycreator'); - require(["directorybrowser"], function (directoryBrowser) { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ enableNetworkSharePath: true, @@ -106,30 +106,30 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed } function getFolderHtml(pathInfo, index) { - var html = ""; + var html = ''; html += '
'; - html += '
'; - html += '
' + pathInfo.Path + "
"; + html += '
'; + html += '
' + pathInfo.Path + '
'; if (pathInfo.NetworkPath) { - html += '
' + pathInfo.NetworkPath + "
"; + html += '
' + pathInfo.NetworkPath + '
'; } - html += "
"; - html += ''; - html += "
"; + html += '
'; + html += ''; + html += ''; return html; } function renderPaths(page) { - var foldersHtml = pathInfos.map(getFolderHtml).join(""); - var folderList = page.querySelector(".folderList"); + var foldersHtml = pathInfos.map(getFolderHtml).join(''); + var folderList = page.querySelector('.folderList'); folderList.innerHTML = foldersHtml; if (foldersHtml) { - folderList.classList.remove("hide"); + folderList.classList.remove('hide'); } else { - folderList.classList.add("hide"); + folderList.classList.add('hide'); } } @@ -154,14 +154,14 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed } function onRemoveClick(e) { - var button = dom.parentWithClass(e.target, "btnRemovePath"); - var index = parseInt(button.getAttribute("data-index")); + var button = dom.parentWithClass(e.target, 'btnRemovePath'); + var index = parseInt(button.getAttribute('data-index')); var location = pathInfos[index].Path; var locationLower = location.toLowerCase(); pathInfos = pathInfos.filter(function (p) { return p.Path.toLowerCase() != locationLower; }); - renderPaths(dom.parentWithClass(button, "dlg-librarycreator")); + renderPaths(dom.parentWithClass(button, 'dlg-librarycreator')); } function onDialogClosed() { @@ -169,9 +169,9 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed } function initLibraryOptions(dlg) { - libraryoptionseditor.embed(dlg.querySelector(".libraryOptions")).then(function () { - $("#selectCollectionType", dlg).trigger("change"); - onToggleAdvancedChange.call(dlg.querySelector(".chkAdvanced")); + libraryoptionseditor.embed(dlg.querySelector('.libraryOptions')).then(function () { + $('#selectCollectionType', dlg).trigger('change'); + onToggleAdvancedChange.call(dlg.querySelector('.chkAdvanced')); }); } @@ -182,25 +182,25 @@ define(["loading", "dialogHelper", "dom", "jQuery", "components/libraryoptionsed currentResolve = resolve; hasChanges = false; var xhr = new XMLHttpRequest(); - xhr.open("GET", "components/medialibrarycreator/medialibrarycreator.template.html", true); + xhr.open('GET', 'components/medialibrarycreator/medialibrarycreator.template.html', true); xhr.onload = function (e) { var template = this.response; var dlg = dialogHelper.createDialog({ - size: "medium-tall", + size: 'medium-tall', modal: false, removeOnClose: true, scrollY: false }); - dlg.classList.add("ui-body-a"); - dlg.classList.add("background-theme-a"); - dlg.classList.add("dlg-librarycreator"); - dlg.classList.add("formDialog"); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('dlg-librarycreator'); + dlg.classList.add('formDialog'); dlg.innerHTML = globalize.translateDocument(template); initEditor(dlg, options.collectionTypeOptions); - dlg.addEventListener("close", onDialogClosed); + dlg.addEventListener('close', onDialogClosed); dialogHelper.open(dlg); - dlg.querySelector(".btnCancel").addEventListener("click", function () { + dlg.querySelector('.btnCancel').addEventListener('click', function () { dialogHelper.close(dlg); }); pathInfos = []; diff --git a/src/components/medialibrarycreator/medialibrarycreator.template.html b/src/components/medialibrarycreator/medialibrarycreator.template.html index 32c6b254b..f92a63e40 100644 --- a/src/components/medialibrarycreator/medialibrarycreator.template.html +++ b/src/components/medialibrarycreator/medialibrarycreator.template.html @@ -1,5 +1,5 @@
- +

${ButtonAddMediaLibrary}

@@ -26,7 +26,7 @@

${HeadersFolders}

diff --git a/src/components/medialibraryeditor/medialibraryeditor.js b/src/components/medialibraryeditor/medialibraryeditor.js index 6a0f955b2..314150962 100644 --- a/src/components/medialibraryeditor/medialibraryeditor.js +++ b/src/components/medialibraryeditor/medialibraryeditor.js @@ -1,5 +1,5 @@ -define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionseditor/libraryoptionseditor", "globalize", "emby-button", "listViewStyle", "paper-icon-button-light", "formDialogStyle", "emby-toggle", "flexStyles"], function (jQuery, loading, dialogHelper, dom, libraryoptionseditor, globalize) { - "use strict"; +define(['jQuery', 'loading', 'dialogHelper', 'dom', 'components/libraryoptionseditor/libraryoptionseditor', 'globalize', 'emby-button', 'listViewStyle', 'paper-icon-button-light', 'formDialogStyle', 'emby-toggle', 'flexStyles'], function (jQuery, loading, dialogHelper, dom, libraryoptionseditor, globalize) { + 'use strict'; function onEditLibrary() { if (isCreating) { @@ -8,8 +8,8 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed isCreating = true; loading.show(); - var dlg = dom.parentWithClass(this, "dlg-libraryeditor"); - var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector(".libraryOptions")); + var dlg = dom.parentWithClass(this, 'dlg-libraryeditor'); + var libraryOptions = libraryoptionseditor.getLibraryOptions(dlg.querySelector('.libraryOptions')); libraryOptions = Object.assign(currentOptions.library.LibraryOptions || {}, libraryOptions); ApiClient.updateVirtualFolderOptions(currentOptions.library.ItemId, libraryOptions).then(function () { hasChanges = true; @@ -30,8 +30,8 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed hasChanges = true; refreshLibraryFromServer(page); }, function () { - require(["toast"], function (toast) { - toast(globalize.translate("ErrorAddingMediaPathToVirtualFolder")); + require(['toast'], function (toast) { + toast(globalize.translate('ErrorAddingMediaPathToVirtualFolder')); }); }); } @@ -45,8 +45,8 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed hasChanges = true; refreshLibraryFromServer(page); }, function () { - require(["toast"], function (toast) { - toast(globalize.translate("ErrorAddingMediaPathToVirtualFolder")); + require(['toast'], function (toast) { + toast(globalize.translate('ErrorAddingMediaPathToVirtualFolder')); }); }); } @@ -55,20 +55,20 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed var button = btnRemovePath; var virtualFolder = currentOptions.library; - require(["confirm"], function (confirm) { + require(['confirm'], function (confirm) { confirm({ - title: globalize.translate("HeaderRemoveMediaLocation"), - text: globalize.translate("MessageConfirmRemoveMediaLocation"), - confirmText: globalize.translate("ButtonDelete"), - primary: "delete" + title: globalize.translate('HeaderRemoveMediaLocation'), + text: globalize.translate('MessageConfirmRemoveMediaLocation'), + confirmText: globalize.translate('ButtonDelete'), + primary: 'delete' }).then(function () { var refreshAfterChange = currentOptions.refresh; ApiClient.removeMediaPath(virtualFolder.Name, location, refreshAfterChange).then(function () { hasChanges = true; - refreshLibraryFromServer(dom.parentWithClass(button, "dlg-libraryeditor")); + refreshLibraryFromServer(dom.parentWithClass(button, 'dlg-libraryeditor')); }, function () { - require(["toast"], function (toast) { - toast(globalize.translate("DefaultErrorMessage")); + require(['toast'], function (toast) { + toast(globalize.translate('DefaultErrorMessage')); }); }); }); @@ -76,39 +76,39 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed } function onListItemClick(e) { - var listItem = dom.parentWithClass(e.target, "listItem"); + var listItem = dom.parentWithClass(e.target, 'listItem'); if (listItem) { - var index = parseInt(listItem.getAttribute("data-index")); + var index = parseInt(listItem.getAttribute('data-index')); var pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || []; var pathInfo = null == index ? {} : pathInfos[index] || {}; var originalPath = pathInfo.Path || (null == index ? null : currentOptions.library.Locations[index]); - var btnRemovePath = dom.parentWithClass(e.target, "btnRemovePath"); + var btnRemovePath = dom.parentWithClass(e.target, 'btnRemovePath'); if (btnRemovePath) { onRemoveClick(btnRemovePath, originalPath); return; } - showDirectoryBrowser(dom.parentWithClass(listItem, "dlg-libraryeditor"), originalPath, pathInfo.NetworkPath); + showDirectoryBrowser(dom.parentWithClass(listItem, 'dlg-libraryeditor'), originalPath, pathInfo.NetworkPath); } } function getFolderHtml(pathInfo, index) { - var html = ""; + var html = ''; html += '
'; - html += '
'; + html += '
'; html += '

'; html += pathInfo.Path; - html += "

"; + html += ''; if (pathInfo.NetworkPath) { - html += '
' + pathInfo.NetworkPath + "
"; + html += '
' + pathInfo.NetworkPath + '
'; } - html += "
"; - html += ''; - html += "
"; + html += '
'; + html += ''; + html += ''; return html; } @@ -137,20 +137,20 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed } if (options.library.CollectionType === 'boxsets') { - page.querySelector(".folders").classList.add("hide"); + page.querySelector('.folders').classList.add('hide'); } else { - page.querySelector(".folders").classList.remove("hide"); + page.querySelector('.folders').classList.remove('hide'); } - page.querySelector(".folderList").innerHTML = pathInfos.map(getFolderHtml).join(""); + page.querySelector('.folderList').innerHTML = pathInfos.map(getFolderHtml).join(''); } function onAddButtonClick() { - showDirectoryBrowser(dom.parentWithClass(this, "dlg-libraryeditor")); + showDirectoryBrowser(dom.parentWithClass(this, 'dlg-libraryeditor')); } function showDirectoryBrowser(context, originalPath, networkPath) { - require(["directorybrowser"], function (directoryBrowser) { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ enableNetworkSharePath: true, @@ -173,18 +173,18 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed } function onToggleAdvancedChange() { - var dlg = dom.parentWithClass(this, "dlg-libraryeditor"); - libraryoptionseditor.setAdvancedVisible(dlg.querySelector(".libraryOptions"), this.checked); + var dlg = dom.parentWithClass(this, 'dlg-libraryeditor'); + libraryoptionseditor.setAdvancedVisible(dlg.querySelector('.libraryOptions'), this.checked); } function initEditor(dlg, options) { renderLibrary(dlg, options); - dlg.querySelector(".btnAddFolder").addEventListener("click", onAddButtonClick); - dlg.querySelector(".folderList").addEventListener("click", onListItemClick); - dlg.querySelector(".chkAdvanced").addEventListener("change", onToggleAdvancedChange); - dlg.querySelector(".btnSubmit").addEventListener("click", onEditLibrary); - libraryoptionseditor.embed(dlg.querySelector(".libraryOptions"), options.library.CollectionType, options.library.LibraryOptions).then(function () { - onToggleAdvancedChange.call(dlg.querySelector(".chkAdvanced")); + dlg.querySelector('.btnAddFolder').addEventListener('click', onAddButtonClick); + dlg.querySelector('.folderList').addEventListener('click', onListItemClick); + dlg.querySelector('.chkAdvanced').addEventListener('change', onToggleAdvancedChange); + dlg.querySelector('.btnSubmit').addEventListener('click', onEditLibrary); + libraryoptionseditor.embed(dlg.querySelector('.libraryOptions'), options.library.CollectionType, options.library.LibraryOptions).then(function () { + onToggleAdvancedChange.call(dlg.querySelector('.chkAdvanced')); }); } @@ -199,26 +199,26 @@ define(["jQuery", "loading", "dialogHelper", "dom", "components/libraryoptionsed currentDeferred = deferred; hasChanges = false; var xhr = new XMLHttpRequest(); - xhr.open("GET", "components/medialibraryeditor/medialibraryeditor.template.html", true); + xhr.open('GET', 'components/medialibraryeditor/medialibraryeditor.template.html', true); xhr.onload = function (e) { var template = this.response; var dlg = dialogHelper.createDialog({ - size: "medium-tall", + size: 'medium-tall', modal: false, removeOnClose: true, scrollY: false }); - dlg.classList.add("dlg-libraryeditor"); - dlg.classList.add("ui-body-a"); - dlg.classList.add("background-theme-a"); - dlg.classList.add("formDialog"); + dlg.classList.add('dlg-libraryeditor'); + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('formDialog'); dlg.innerHTML = globalize.translateDocument(template); - dlg.querySelector(".formDialogHeaderTitle").innerHTML = options.library.Name; + dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.library.Name; initEditor(dlg, options); - dlg.addEventListener("close", onDialogClosed); + dlg.addEventListener('close', onDialogClosed); dialogHelper.open(dlg); - dlg.querySelector(".btnCancel").addEventListener("click", function () { + dlg.querySelector('.btnCancel').addEventListener('click', function () { dialogHelper.close(dlg); }); refreshLibraryFromServer(dlg); diff --git a/src/components/medialibraryeditor/medialibraryeditor.template.html b/src/components/medialibraryeditor/medialibraryeditor.template.html index 172c535fa..6c814cf2d 100644 --- a/src/components/medialibraryeditor/medialibraryeditor.template.html +++ b/src/components/medialibraryeditor/medialibraryeditor.template.html @@ -1,5 +1,5 @@
- +

@@ -20,7 +20,7 @@

${HeadersFolders}

diff --git a/src/components/metadataeditor/metadataeditor.js b/src/components/metadataeditor/metadataeditor.js index 8a64cac7e..e1c1c8001 100644 --- a/src/components/metadataeditor/metadataeditor.js +++ b/src/components/metadataeditor/metadataeditor.js @@ -142,9 +142,9 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi Status: form.querySelector('#selectStatus').value, AirDays: getSelectedAirDays(form), AirTime: form.querySelector('#txtAirTime').value, - Genres: getListValues(form.querySelector("#listGenres")), - Tags: getListValues(form.querySelector("#listTags")), - Studios: getListValues(form.querySelector("#listStudios")).map(function (element) { + Genres: getListValues(form.querySelector('#listGenres')), + Tags: getListValues(form.querySelector('#listTags')), + Studios: getListValues(form.querySelector('#listStudios')).map(function (element) { return { Name: element }; }), @@ -158,7 +158,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi OfficialRating: form.querySelector('#selectOfficialRating').value, CustomRating: form.querySelector('#selectCustomRating').value, People: currentItem.People, - LockData: form.querySelector("#chkLockData").checked, + LockData: form.querySelector('#chkLockData').checked, LockedFields: Array.prototype.filter.call(form.querySelectorAll('.selectLockedField'), function (c) { return !c.checked; }).map(function (c) { @@ -177,14 +177,14 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi item.PreferredMetadataLanguage = form.querySelector('#selectLanguage').value; item.PreferredMetadataCountryCode = form.querySelector('#selectCountry').value; - if (currentItem.Type === "Person") { + if (currentItem.Type === 'Person') { var placeOfBirth = form.querySelector('#txtPlaceOfBirth').value; item.ProductionLocations = placeOfBirth ? [placeOfBirth] : []; } - if (currentItem.Type === "Series") { + if (currentItem.Type === 'Series') { // 600000000 var seriesRuntime = form.querySelector('#txtSeriesRuntime').value; @@ -356,7 +356,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi form.removeEventListener('submit', onSubmit); form.addEventListener('submit', onSubmit); - context.querySelector("#btnAddPerson").addEventListener('click', function (event, data) { + context.querySelector('#btnAddPerson').addEventListener('click', function (event, data) { editPerson(context, {}, -1); }); @@ -403,7 +403,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi function populateCountries(select, allCountries) { - var html = ""; + var html = ''; html += ""; @@ -411,7 +411,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi var culture = allCountries[i]; - html += ""; + html += "'; } select.innerHTML = html; @@ -419,7 +419,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi function populateLanguages(select, languages) { - var html = ""; + var html = ''; html += ""; @@ -427,7 +427,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi var culture = languages[i]; - html += ""; + html += "'; } select.innerHTML = html; @@ -462,12 +462,12 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi var idInfo = externalIds[i]; - var id = "txt1" + idInfo.Key; + var id = 'txt1' + idInfo.Key; var formatString = idInfo.UrlFormatString || ''; var fullName = idInfo.Name; if (idInfo.Type) { - fullName = idInfo.Name + " " + globalize.translate(idInfo.Type); + fullName = idInfo.Name + ' ' + globalize.translate(idInfo.Type); } var labelText = globalize.translate('LabelDynamicExternalId', fullName); @@ -482,7 +482,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi html += ''; if (formatString) { - html += ''; + html += ''; } html += ''; @@ -544,37 +544,37 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi hideElement('#fldPath', context); } - if (item.Type === "Series" || item.Type === "Movie" || item.Type === "Trailer") { + if (item.Type === 'Series' || item.Type === 'Movie' || item.Type === 'Trailer') { showElement('#fldOriginalName', context); } else { hideElement('#fldOriginalName', context); } - if (item.Type === "Series") { + if (item.Type === 'Series') { showElement('#fldSeriesRuntime', context); } else { hideElement('#fldSeriesRuntime', context); } - if (item.Type === "Series" || item.Type === "Person") { + if (item.Type === 'Series' || item.Type === 'Person') { showElement('#fldEndDate', context); } else { hideElement('#fldEndDate', context); } - if (item.Type === "MusicAlbum") { + if (item.Type === 'MusicAlbum') { showElement('#albumAssociationMessage', context); } else { hideElement('#albumAssociationMessage', context); } - if (item.Type === "Movie" || item.Type === "Trailer") { + if (item.Type === 'Movie' || item.Type === 'Trailer') { showElement('#fldCriticRating', context); } else { hideElement('#fldCriticRating', context); } - if (item.Type === "Series") { + if (item.Type === 'Series') { showElement('#fldStatus', context); showElement('#fldAirDays', context); showElement('#fldAirTime', context); @@ -584,19 +584,19 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi hideElement('#fldAirTime', context); } - if (item.MediaType === "Video" && item.Type !== "TvChannel") { + if (item.MediaType === 'Video' && item.Type !== 'TvChannel') { showElement('#fld3dFormat', context); } else { hideElement('#fld3dFormat', context); } - if (item.Type === "Audio") { + if (item.Type === 'Audio') { showElement('#fldAlbumArtist', context); } else { hideElement('#fldAlbumArtist', context); } - if (item.Type === "Audio" || item.Type === "MusicVideo") { + if (item.Type === 'Audio' || item.Type === 'MusicVideo') { showElement('#fldArtist', context); showElement('#fldAlbum', context); } else { @@ -604,29 +604,29 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi hideElement('#fldAlbum', context); } - if (item.Type === "Episode" && item.ParentIndexNumber === 0) { + if (item.Type === 'Episode' && item.ParentIndexNumber === 0) { showElement('#collapsibleSpecialEpisodeInfo', context); } else { hideElement('#collapsibleSpecialEpisodeInfo', context); } - if (item.Type === "Person" || - item.Type === "Genre" || - item.Type === "Studio" || - item.Type === "MusicGenre" || - item.Type === "TvChannel" || - item.Type === "Book") { + if (item.Type === 'Person' || + item.Type === 'Genre' || + item.Type === 'Studio' || + item.Type === 'MusicGenre' || + item.Type === 'TvChannel' || + item.Type === 'Book') { hideElement('#peopleCollapsible', context); } else { showElement('#peopleCollapsible', context); } - if (item.Type === "Person" || item.Type === "Genre" || item.Type === "Studio" || item.Type === "MusicGenre" || item.Type === "TvChannel") { + if (item.Type === 'Person' || item.Type === 'Genre' || item.Type === 'Studio' || item.Type === 'MusicGenre' || item.Type === 'TvChannel') { hideElement('#fldCommunityRating', context); hideElement('#genresCollapsible', context); hideElement('#studiosCollapsible', context); - if (item.Type === "TvChannel") { + if (item.Type === 'TvChannel') { showElement('#fldOfficialRating', context); } else { hideElement('#fldOfficialRating', context); @@ -642,7 +642,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi showElement('#tagsCollapsible', context); - if (item.Type === "TvChannel") { + if (item.Type === 'TvChannel') { hideElement('#metadataSettingsCollapsible', context); hideElement('#fldPremiereDate', context); hideElement('#fldDateAdded', context); @@ -654,39 +654,39 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi showElement('#fldYear', context); } - if (item.Type === "TvChannel") { + if (item.Type === 'TvChannel') { hideElement('.overviewContainer', context); } else { showElement('.overviewContainer', context); } - if (item.Type === "Person") { + if (item.Type === 'Person') { //todo context.querySelector('#txtProductionYear').label(globalize.translate('LabelBirthYear')); - context.querySelector("#txtPremiereDate").label(globalize.translate('LabelBirthDate')); - context.querySelector("#txtEndDate").label(globalize.translate('LabelDeathDate')); + context.querySelector('#txtPremiereDate').label(globalize.translate('LabelBirthDate')); + context.querySelector('#txtEndDate').label(globalize.translate('LabelDeathDate')); showElement('#fldPlaceOfBirth'); } else { context.querySelector('#txtProductionYear').label(globalize.translate('LabelYear')); - context.querySelector("#txtPremiereDate").label(globalize.translate('LabelReleaseDate')); - context.querySelector("#txtEndDate").label(globalize.translate('LabelEndDate')); + context.querySelector('#txtPremiereDate').label(globalize.translate('LabelReleaseDate')); + context.querySelector('#txtEndDate').label(globalize.translate('LabelEndDate')); hideElement('#fldPlaceOfBirth'); } - if (item.MediaType === "Video" && item.Type !== "TvChannel") { + if (item.MediaType === 'Video' && item.Type !== 'TvChannel') { showElement('#fldOriginalAspectRatio'); } else { hideElement('#fldOriginalAspectRatio'); } - if (item.Type === "Audio" || item.Type === "Episode" || item.Type === "Season") { + if (item.Type === 'Audio' || item.Type === 'Episode' || item.Type === 'Season') { showElement('#fldIndexNumber'); - if (item.Type === "Episode") { + if (item.Type === 'Episode') { context.querySelector('#txtIndexNumber').label(globalize.translate('LabelEpisodeNumber')); - } else if (item.Type === "Season") { + } else if (item.Type === 'Season') { context.querySelector('#txtIndexNumber').label(globalize.translate('LabelSeasonNumber')); - } else if (item.Type === "Audio") { + } else if (item.Type === 'Audio') { context.querySelector('#txtIndexNumber').label(globalize.translate('LabelTrackNumber')); } else { context.querySelector('#txtIndexNumber').label(globalize.translate('LabelNumber')); @@ -695,12 +695,12 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi hideElement('#fldIndexNumber'); } - if (item.Type === "Audio" || item.Type === "Episode") { + if (item.Type === 'Audio' || item.Type === 'Episode') { showElement('#fldParentIndexNumber'); - if (item.Type === "Episode") { + if (item.Type === 'Episode') { context.querySelector('#txtParentIndexNumber').label(globalize.translate('LabelSeasonNumber')); - } else if (item.Type === "Audio") { + } else if (item.Type === 'Audio') { context.querySelector('#txtParentIndexNumber').label(globalize.translate('LabelDiscNumber')); } else { context.querySelector('#txtParentIndexNumber').label(globalize.translate('LabelParentNumber')); @@ -709,12 +709,12 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi hideElement('#fldParentIndexNumber', context); } - if (item.Type === "BoxSet") { + if (item.Type === 'BoxSet') { showElement('#fldDisplayOrder', context); hideElement('.seriesDisplayOrderDescription', context); context.querySelector('#selectDisplayOrder').innerHTML = ''; - } else if (item.Type === "Series") { + } else if (item.Type === 'Series') { showElement('#fldDisplayOrder', context); showElement('.seriesDisplayOrderDescription', context); @@ -731,19 +731,19 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi populateRatings(parentalRatingOptions, select, item.OfficialRating); - select.value = item.OfficialRating || ""; + select.value = item.OfficialRating || ''; select = context.querySelector('#selectCustomRating'); populateRatings(parentalRatingOptions, select, item.CustomRating); - select.value = item.CustomRating || ""; + select.value = item.CustomRating || ''; var selectStatus = context.querySelector('#selectStatus'); populateStatus(selectStatus); - selectStatus.value = item.Status || ""; + selectStatus.value = item.Status || ''; - context.querySelector('#select3dFormat', context).value = item.Video3DFormat || ""; + context.querySelector('#select3dFormat', context).value = item.Video3DFormat || ''; Array.prototype.forEach.call(context.querySelectorAll('.chkAirDay', context), function (el) { el.checked = (item.AirDays || []).indexOf(el.getAttribute('data-day')) !== -1; @@ -759,7 +759,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi populateListView(context.querySelector('#listTags'), item.Tags); var lockData = (item.LockData || false); - var chkLockData = context.querySelector("#chkLockData"); + var chkLockData = context.querySelector('#chkLockData'); chkLockData.checked = lockData; if (chkLockData.checked) { hideElement('.providerSettingsContainer', context); @@ -769,33 +769,29 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi fillMetadataSettings(context, item, item.LockedFields); context.querySelector('#txtPath').value = item.Path || ''; - context.querySelector('#txtName').value = item.Name || ""; - context.querySelector('#txtOriginalName').value = item.OriginalTitle || ""; + context.querySelector('#txtName').value = item.Name || ''; + context.querySelector('#txtOriginalName').value = item.OriginalTitle || ''; context.querySelector('#txtOverview').value = item.Overview || ''; context.querySelector('#txtTagline').value = (item.Taglines && item.Taglines.length ? item.Taglines[0] : ''); - context.querySelector('#txtSortName').value = item.ForcedSortName || ""; - context.querySelector('#txtCommunityRating').value = item.CommunityRating || ""; + context.querySelector('#txtSortName').value = item.ForcedSortName || ''; + context.querySelector('#txtCommunityRating').value = item.CommunityRating || ''; - context.querySelector('#txtCriticRating').value = item.CriticRating || ""; + context.querySelector('#txtCriticRating').value = item.CriticRating || ''; context.querySelector('#txtIndexNumber').value = item.IndexNumber == null ? '' : item.IndexNumber; context.querySelector('#txtParentIndexNumber').value = item.ParentIndexNumber == null ? '' : item.ParentIndexNumber; - context.querySelector('#txtAirsBeforeSeason').value = ('AirsBeforeSeasonNumber' in item) ? item.AirsBeforeSeasonNumber : ""; - context.querySelector('#txtAirsAfterSeason').value = ('AirsAfterSeasonNumber' in item) ? item.AirsAfterSeasonNumber : ""; - context.querySelector('#txtAirsBeforeEpisode').value = ('AirsBeforeEpisodeNumber' in item) ? item.AirsBeforeEpisodeNumber : ""; + context.querySelector('#txtAirsBeforeSeason').value = ('AirsBeforeSeasonNumber' in item) ? item.AirsBeforeSeasonNumber : ''; + context.querySelector('#txtAirsAfterSeason').value = ('AirsAfterSeasonNumber' in item) ? item.AirsAfterSeasonNumber : ''; + context.querySelector('#txtAirsBeforeEpisode').value = ('AirsBeforeEpisodeNumber' in item) ? item.AirsBeforeEpisodeNumber : ''; - context.querySelector('#txtAlbum').value = item.Album || ""; + context.querySelector('#txtAlbum').value = item.Album || ''; context.querySelector('#txtAlbumArtist').value = (item.AlbumArtists || []).map(function (a) { return a.Name; }).join(';'); - if (item.Type === 'Series') { - context.querySelector('#selectDisplayOrder').value = item.DisplayOrder || ''; - } else { - context.querySelector('#selectDisplayOrder').value = item.DisplayOrder || ''; - } + context.querySelector('#selectDisplayOrder').value = item.DisplayOrder || ''; context.querySelector('#txtArtist').value = (item.ArtistItems || []).map(function (a) { return a.Name; @@ -839,17 +835,17 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi context.querySelector('#txtEndDate').value = ''; } - context.querySelector('#txtProductionYear').value = item.ProductionYear || ""; + context.querySelector('#txtProductionYear').value = item.ProductionYear || ''; context.querySelector('#txtAirTime').value = item.AirTime || ''; var placeofBirth = item.ProductionLocations && item.ProductionLocations.length ? item.ProductionLocations[0] : ''; context.querySelector('#txtPlaceOfBirth').value = placeofBirth; - context.querySelector('#txtOriginalAspectRatio').value = item.AspectRatio || ""; + context.querySelector('#txtOriginalAspectRatio').value = item.AspectRatio || ''; - context.querySelector('#selectLanguage').value = item.PreferredMetadataLanguage || ""; - context.querySelector('#selectCountry').value = item.PreferredMetadataCountryCode || ""; + context.querySelector('#selectLanguage').value = item.PreferredMetadataLanguage || ''; + context.querySelector('#selectCountry').value = item.PreferredMetadataCountryCode || ''; if (item.RunTimeTicks) { @@ -857,13 +853,13 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi context.querySelector('#txtSeriesRuntime').value = Math.round(minutes); } else { - context.querySelector('#txtSeriesRuntime', context).value = ""; + context.querySelector('#txtSeriesRuntime', context).value = ''; } } function populateRatings(allParentalRatings, select, currentValue) { - var html = ""; + var html = ''; html += ""; @@ -893,18 +889,18 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi rating = ratings[i]; - html += ""; + html += "'; } select.innerHTML = html; } function populateStatus(select) { - var html = ""; + var html = ''; html += ""; - html += ""; - html += ""; + html += "'; + html += "'; select.innerHTML = html; } @@ -922,7 +918,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi for (var i = 0; i < items.length; i++) { html += '
'; - html += ''; + html += ''; html += '
'; @@ -932,7 +928,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi html += '
'; - html += ''; + html += ''; html += '
'; } @@ -953,7 +949,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi html += '
'; - html += 'person'; + html += ''; html += '
'; html += ''; html += '
'; - html += ''; + html += ''; html += '
'; } @@ -999,30 +995,30 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi lockedFields = lockedFields || []; var lockedFieldsList = [ - { name: globalize.translate('Name'), value: "Name" }, - { name: globalize.translate('Overview'), value: "Overview" }, - { name: globalize.translate('Genres'), value: "Genres" }, - { name: globalize.translate('ParentalRating'), value: "OfficialRating" }, - { name: globalize.translate('People'), value: "Cast" } + { name: globalize.translate('Name'), value: 'Name' }, + { name: globalize.translate('Overview'), value: 'Overview' }, + { name: globalize.translate('Genres'), value: 'Genres' }, + { name: globalize.translate('ParentalRating'), value: 'OfficialRating' }, + { name: globalize.translate('People'), value: 'Cast' } ]; - if (item.Type === "Person") { - lockedFieldsList.push({ name: globalize.translate('BirthLocation'), value: "ProductionLocations" }); + if (item.Type === 'Person') { + lockedFieldsList.push({ name: globalize.translate('BirthLocation'), value: 'ProductionLocations' }); } else { - lockedFieldsList.push({ name: globalize.translate('ProductionLocations'), value: "ProductionLocations" }); + lockedFieldsList.push({ name: globalize.translate('ProductionLocations'), value: 'ProductionLocations' }); } - if (item.Type === "Series") { - lockedFieldsList.push({ name: globalize.translate('Runtime'), value: "Runtime" }); + if (item.Type === 'Series') { + lockedFieldsList.push({ name: globalize.translate('Runtime'), value: 'Runtime' }); } - lockedFieldsList.push({ name: globalize.translate('Studios'), value: "Studios" }); - lockedFieldsList.push({ name: globalize.translate('Tags'), value: "Tags" }); + lockedFieldsList.push({ name: globalize.translate('Studios'), value: 'Studios' }); + lockedFieldsList.push({ name: globalize.translate('Tags'), value: 'Tags' }); var html = ''; - html += "

" + globalize.translate('HeaderEnabledFields') + "

"; - html += "

" + globalize.translate('HeaderEnabledFieldsHelp') + "

"; + html += '

' + globalize.translate('HeaderEnabledFields') + '

'; + html += '

' + globalize.translate('HeaderEnabledFieldsHelp') + '

'; html += getLockedFieldsHtml(lockedFieldsList, lockedFields); container.innerHTML = html; } @@ -1051,7 +1047,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi setFieldVisibilities(context, item); fillItemInfo(context, item, metadataEditorInfo.ParentalRatingOptions); - if (item.MediaType === "Video" && item.Type !== "Episode" && item.Type !== "TvChannel") { + if (item.MediaType === 'Video' && item.Type !== 'Episode' && item.Type !== 'TvChannel') { showElement('#fldTagline', context); } else { hideElement('#fldTagline', context); diff --git a/src/components/metadataeditor/metadataeditor.template.html b/src/components/metadataeditor/metadataeditor.template.html index 246757768..39894d4f6 100644 --- a/src/components/metadataeditor/metadataeditor.template.html +++ b/src/components/metadataeditor/metadataeditor.template.html @@ -1,15 +1,15 @@
- +

${Edit}

@@ -184,7 +184,7 @@ ${Genres}
@@ -193,7 +193,7 @@ ${People}
@@ -203,7 +203,7 @@ ${Studios}
@@ -212,7 +212,7 @@ ${Tags}
diff --git a/src/components/metadataeditor/personeditor.template.html b/src/components/metadataeditor/personeditor.template.html index ec76f58c7..40b29767f 100644 --- a/src/components/metadataeditor/personeditor.template.html +++ b/src/components/metadataeditor/personeditor.template.html @@ -1,5 +1,5 @@
- +

${Edit}

diff --git a/src/components/multiselect/multiselect.js b/src/components/multiselect/multiselect.js index 53c3b4cf5..70a0924bc 100644 --- a/src/components/multiselect/multiselect.js +++ b/src/components/multiselect/multiselect.js @@ -1,5 +1,5 @@ -define(["browser", "appStorage", "apphost", "loading", "connectionManager", "globalize", "appRouter", "dom", "css!./multiselect"], function (browser, appStorage, appHost, loading, connectionManager, globalize, appRouter, dom) { - "use strict"; +define(['browser', 'appStorage', 'apphost', 'loading', 'connectionManager', 'globalize', 'appRouter', 'dom', 'css!./multiselect'], function (browser, appStorage, appHost, loading, connectionManager, globalize, appRouter, dom) { + 'use strict'; var selectedItems = []; var selectedElements = []; @@ -15,12 +15,12 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo selectedItems = []; selectedElements = []; - var elems = document.querySelectorAll(".itemSelectionPanel"); + var elems = document.querySelectorAll('.itemSelectionPanel'); for (var i = 0, length = elems.length; i < length; i++) { var parent = elems[i].parentNode; parent.removeChild(elems[i]); - parent.classList.remove("withMultiSelect"); + parent.classList.remove('withMultiSelect'); } } } @@ -28,13 +28,13 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo function onItemSelectionPanelClick(e, itemSelectionPanel) { // toggle the checkbox, if it wasn't clicked on - if (!dom.parentWithClass(e.target, "chkItemSelect")) { - var chkItemSelect = itemSelectionPanel.querySelector(".chkItemSelect"); + if (!dom.parentWithClass(e.target, 'chkItemSelect')) { + var chkItemSelect = itemSelectionPanel.querySelector('.chkItemSelect'); if (chkItemSelect) { - if (chkItemSelect.classList.contains("checkedInitial")) { - chkItemSelect.classList.remove("checkedInitial"); + if (chkItemSelect.classList.contains('checkedInitial')) { + chkItemSelect.classList.remove('checkedInitial'); } else { var newValue = !chkItemSelect.checked; chkItemSelect.checked = newValue; @@ -50,7 +50,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo function updateItemSelection(chkItemSelect, selected) { - var id = dom.parentWithAttribute(chkItemSelect, "data-id").getAttribute("data-id"); + var id = dom.parentWithAttribute(chkItemSelect, 'data-id').getAttribute('data-id'); if (selected) { @@ -73,7 +73,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo } if (selectedItems.length) { - var itemSelectionCount = document.querySelector(".itemSelectionCount"); + var itemSelectionCount = document.querySelector('.itemSelectionCount'); if (itemSelectionCount) { itemSelectionCount.innerHTML = selectedItems.length; } @@ -88,27 +88,27 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo function showSelection(item, isChecked) { - var itemSelectionPanel = item.querySelector(".itemSelectionPanel"); + var itemSelectionPanel = item.querySelector('.itemSelectionPanel'); if (!itemSelectionPanel) { - itemSelectionPanel = document.createElement("div"); - itemSelectionPanel.classList.add("itemSelectionPanel"); + itemSelectionPanel = document.createElement('div'); + itemSelectionPanel.classList.add('itemSelectionPanel'); - var parent = item.querySelector(".cardBox") || item.querySelector(".cardContent"); - parent.classList.add("withMultiSelect"); + var parent = item.querySelector('.cardBox') || item.querySelector('.cardContent'); + parent.classList.add('withMultiSelect'); parent.appendChild(itemSelectionPanel); - var cssClass = "chkItemSelect"; + var cssClass = 'chkItemSelect'; if (isChecked && !browser.firefox) { // In firefox, the initial tap hold doesnt' get treated as a click // In other browsers it does, so we need to make sure that initial click is ignored - cssClass += " checkedInitial"; + cssClass += ' checkedInitial'; } - var checkedAttribute = isChecked ? " checked" : ""; + var checkedAttribute = isChecked ? ' checked' : ''; itemSelectionPanel.innerHTML = ''; - var chkItemSelect = itemSelectionPanel.querySelector(".chkItemSelect"); - chkItemSelect.addEventListener("change", onSelectionChange); + var chkItemSelect = itemSelectionPanel.querySelector('.chkItemSelect'); + chkItemSelect.addEventListener('change', onSelectionChange); } } @@ -118,27 +118,27 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo if (!selectionCommandsPanel) { - selectionCommandsPanel = document.createElement("div"); - selectionCommandsPanel.classList.add("selectionCommandsPanel"); + selectionCommandsPanel = document.createElement('div'); + selectionCommandsPanel.classList.add('selectionCommandsPanel'); document.body.appendChild(selectionCommandsPanel); currentSelectionCommandsPanel = selectionCommandsPanel; - var html = ""; + var html = ''; - html += ''; + html += ''; html += '

'; - var moreIcon = ''; - html += ''; + const moreIcon = 'more_horiz'; + html += ''; selectionCommandsPanel.innerHTML = html; - selectionCommandsPanel.querySelector(".btnCloseSelectionPanel").addEventListener("click", hideSelections); + selectionCommandsPanel.querySelector('.btnCloseSelectionPanel').addEventListener('click', hideSelections); - var btnSelectionPanelOptions = selectionCommandsPanel.querySelector(".btnSelectionPanelOptions"); + var btnSelectionPanelOptions = selectionCommandsPanel.querySelector('.btnSelectionPanelOptions'); - dom.addEventListener(btnSelectionPanelOptions, "click", showMenuForSelectedItems, { passive: true }); + dom.addEventListener(btnSelectionPanelOptions, 'click', showMenuForSelectedItems, { passive: true }); } } @@ -146,7 +146,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo return new Promise(function (resolve, reject) { - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert(options).then(resolve, resolve); }); }); @@ -156,15 +156,15 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo return new Promise(function (resolve, reject) { - var msg = globalize.translate("ConfirmDeleteItem"); - var title = globalize.translate("HeaderDeleteItem"); + var msg = globalize.translate('ConfirmDeleteItem'); + var title = globalize.translate('HeaderDeleteItem'); if (itemIds.length > 1) { - msg = globalize.translate("ConfirmDeleteItems"); - title = globalize.translate("HeaderDeleteItems"); + msg = globalize.translate('ConfirmDeleteItems'); + title = globalize.translate('HeaderDeleteItems'); } - require(["confirm"], function (confirm) { + require(['confirm'], function (confirm) { confirm(msg, title).then(function () { var promises = itemIds.map(function (itemId) { @@ -173,7 +173,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo Promise.all(promises).then(resolve, function () { - alertText(globalize.translate("ErrorDeletingItem")).then(reject, reject); + alertText(globalize.translate('ErrorDeletingItem')).then(reject, reject); }); }, reject); @@ -190,58 +190,58 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo var menuItems = []; menuItems.push({ - name: globalize.translate("AddToCollection"), - id: "addtocollection", - icon: "add" + name: globalize.translate('AddToCollection'), + id: 'addtocollection', + icon: 'add' }); menuItems.push({ - name: globalize.translate("AddToPlaylist"), - id: "playlist", - icon: "playlist_add" + name: globalize.translate('AddToPlaylist'), + id: 'playlist', + icon: 'playlist_add' }); // TODO: Be more dynamic based on what is selected if (user.Policy.EnableContentDeletion) { menuItems.push({ - name: globalize.translate("Delete"), - id: "delete", - icon: "delete" + name: globalize.translate('Delete'), + id: 'delete', + icon: 'delete' }); } - if (user.Policy.EnableContentDownloading && appHost.supports("filedownload")) { + if (user.Policy.EnableContentDownloading && appHost.supports('filedownload')) { menuItems.push({ - name: globalize.translate("ButtonDownload"), - id: "download", - icon: "file_download" + name: globalize.translate('ButtonDownload'), + id: 'download', + icon: 'file_download' }); } if (user.Policy.IsAdministrator) { menuItems.push({ - name: globalize.translate("GroupVersions"), - id: "groupvideos", - icon: "call_merge" + name: globalize.translate('GroupVersions'), + id: 'groupvideos', + icon: 'call_merge' }); } menuItems.push({ - name: globalize.translate("MarkPlayed"), - id: "markplayed", - icon: "check_box" + name: globalize.translate('MarkPlayed'), + id: 'markplayed', + icon: 'check_box' }); menuItems.push({ - name: globalize.translate("MarkUnplayed"), - id: "markunplayed", - icon: "check_box_outline_blank" + name: globalize.translate('MarkUnplayed'), + id: 'markunplayed', + icon: 'check_box_outline_blank' }); menuItems.push({ - name: globalize.translate("RefreshMetadata"), - id: "refresh", - icon: "refresh" + name: globalize.translate('RefreshMetadata'), + id: 'refresh', + icon: 'refresh' }); require(['actionsheet'], function (actionsheet) { @@ -253,8 +253,8 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo var serverId = apiClient.serverInfo().Id; switch (id) { - case "addtocollection": - require(["collectionEditor"], function (collectionEditor) { + case 'addtocollection': + require(['collectionEditor'], function (collectionEditor) { new collectionEditor().show({ items: items, serverId: serverId @@ -263,8 +263,8 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo hideSelections(); dispatchNeedsRefresh(); break; - case "playlist": - require(["playlistEditor"], function (playlistEditor) { + case 'playlist': + require(['playlistEditor'], function (playlistEditor) { new playlistEditor().show({ items: items, serverId: serverId @@ -273,30 +273,30 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo hideSelections(); dispatchNeedsRefresh(); break; - case "delete": + case 'delete': deleteItems(apiClient, items).then(dispatchNeedsRefresh); hideSelections(); dispatchNeedsRefresh(); break; - case "groupvideos": + case 'groupvideos': combineVersions(apiClient, items); break; - case "markplayed": + case 'markplayed': items.forEach(function (itemId) { apiClient.markPlayed(apiClient.getCurrentUserId(), itemId); }); hideSelections(); dispatchNeedsRefresh(); break; - case "markunplayed": + case 'markunplayed': items.forEach(function (itemId) { apiClient.markUnplayed(apiClient.getCurrentUserId(), itemId); }); hideSelections(); dispatchNeedsRefresh(); break; - case "refresh": - require(["refreshDialog"], function (refreshDialog) { + case 'refresh': + require(['refreshDialog'], function (refreshDialog) { new refreshDialog({ itemIds: items, serverId: serverId @@ -321,7 +321,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo [].forEach.call(selectedElements, function (i) { - var container = dom.parentWithAttribute(i, "is", "emby-itemscontainer"); + var container = dom.parentWithAttribute(i, 'is', 'emby-itemscontainer'); if (container && elems.indexOf(container) === -1) { elems.push(container); @@ -337,9 +337,9 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo if (selection.length < 2) { - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert({ - text: globalize.translate("PleaseSelectTwoItems") + text: globalize.translate('PleaseSelectTwoItems') }); }); return; @@ -349,8 +349,8 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo apiClient.ajax({ - type: "POST", - url: apiClient.getUrl("Videos/MergeVersions", { Ids: selection.join(",") }) + type: 'POST', + url: apiClient.getUrl('Videos/MergeVersions', { Ids: selection.join(',') }) }).then(function () { @@ -362,8 +362,8 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo function showSelections(initialCard) { - require(["emby-checkbox"], function () { - var cards = document.querySelectorAll(".card"); + require(['emby-checkbox'], function () { + var cards = document.querySelectorAll('.card'); for (var i = 0, length = cards.length; i < length; i++) { showSelection(cards[i], initialCard === cards[i]); } @@ -379,9 +379,9 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo if (selectedItems.length) { - var card = dom.parentWithClass(target, "card"); + var card = dom.parentWithClass(target, 'card'); if (card) { - var itemSelectionPanel = card.querySelector(".itemSelectionPanel"); + var itemSelectionPanel = card.querySelector('.itemSelectionPanel'); if (itemSelectionPanel) { return onItemSelectionPanelClick(e, itemSelectionPanel); } @@ -393,7 +393,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo } } - document.addEventListener("viewbeforehide", hideSelections); + document.addEventListener('viewbeforehide', hideSelections); return function (options) { @@ -403,7 +403,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo function onTapHold(e) { - var card = dom.parentWithClass(e.target, "card"); + var card = dom.parentWithClass(e.target, 'card'); if (card) { @@ -440,7 +440,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo var element = touch.target; if (element) { - var card = dom.parentWithClass(element, "card"); + var card = dom.parentWithClass(element, 'card'); if (card) { @@ -509,7 +509,7 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo return; } - var card = dom.parentWithClass(touchTarget, "card"); + var card = dom.parentWithClass(touchTarget, 'card'); touchTarget = null; if (card) { @@ -522,27 +522,27 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo // mobile safari doesn't allow contextmenu override if (browser.touch && !browser.safari) { - element.addEventListener("contextmenu", onTapHold); + element.addEventListener('contextmenu', onTapHold); } else { - dom.addEventListener(element, "touchstart", onTouchStart, { + dom.addEventListener(element, 'touchstart', onTouchStart, { passive: true }); - dom.addEventListener(element, "touchmove", onTouchMove, { + dom.addEventListener(element, 'touchmove', onTouchMove, { passive: true }); - dom.addEventListener(element, "touchend", onTouchEnd, { + dom.addEventListener(element, 'touchend', onTouchEnd, { passive: true }); - dom.addEventListener(element, "touchcancel", onTouchEnd, { + dom.addEventListener(element, 'touchcancel', onTouchEnd, { passive: true }); - dom.addEventListener(element, "mousedown", onMouseDown, { + dom.addEventListener(element, 'mousedown', onMouseDown, { passive: true }); - dom.addEventListener(element, "mouseleave", onMouseOut, { + dom.addEventListener(element, 'mouseleave', onMouseOut, { passive: true }); - dom.addEventListener(element, "mouseup", onMouseOut, { + dom.addEventListener(element, 'mouseup', onMouseOut, { passive: true }); } @@ -551,38 +551,38 @@ define(["browser", "appStorage", "apphost", "loading", "connectionManager", "glo initTapHold(container); if (options.bindOnClick !== false) { - container.addEventListener("click", onContainerClick); + container.addEventListener('click', onContainerClick); } self.onContainerClick = onContainerClick; self.destroy = function () { - container.removeEventListener("click", onContainerClick); - container.removeEventListener("contextmenu", onTapHold); + container.removeEventListener('click', onContainerClick); + container.removeEventListener('contextmenu', onTapHold); var element = container; - dom.removeEventListener(element, "touchstart", onTouchStart, { + dom.removeEventListener(element, 'touchstart', onTouchStart, { passive: true }); - dom.removeEventListener(element, "touchmove", onTouchMove, { + dom.removeEventListener(element, 'touchmove', onTouchMove, { passive: true }); - dom.removeEventListener(element, "touchend", onTouchEnd, { + dom.removeEventListener(element, 'touchend', onTouchEnd, { passive: true }); // this fires in safari due to magnifying class //dom.removeEventListener(element, "touchcancel", onTouchEnd, { // passive: true //}); - dom.removeEventListener(element, "mousedown", onMouseDown, { + dom.removeEventListener(element, 'mousedown', onMouseDown, { passive: true }); - dom.removeEventListener(element, "mouseleave", onMouseOut, { + dom.removeEventListener(element, 'mouseleave', onMouseOut, { passive: true }); - dom.removeEventListener(element, "mouseup", onMouseOut, { + dom.removeEventListener(element, 'mouseup', onMouseOut, { passive: true }); }; diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index 8ba870613..3ac891b5e 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -5,7 +5,8 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir document.removeEventListener('click', onOneDocumentClick); document.removeEventListener('keydown', onOneDocumentClick); - if (window.Notification) { + // don't request notification permissions if they're already granted or denied + if (window.Notification && window.Notification.permission === 'default') { /* eslint-disable-next-line compat/compat */ Notification.requestPermission(); } @@ -96,10 +97,10 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir } var notification = { - title: "New " + item.Type, + title: 'New ' + item.Type, body: body, vibrate: true, - tag: "newItem" + item.Id, + tag: 'newItem' + item.Id, data: { //options: { // url: LibraryBrowser.getHref(item) @@ -114,7 +115,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir notification.icon = apiClient.getScaledImageUrl(item.Id, { width: 80, tag: imageTags.Primary, - type: "Primary" + type: 'Primary' }); } @@ -138,11 +139,11 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir Recursive: true, Limit: 3, - Filters: "IsNotFolder", - SortBy: "DateCreated", - SortOrder: "Descending", + Filters: 'IsNotFolder', + SortBy: 'DateCreated', + SortOrder: 'Descending', Ids: newItems.join(','), - MediaTypes: "Audio,Video", + MediaTypes: 'Audio,Video', EnableTotalRecordCount: false }).then(function (result) { @@ -170,7 +171,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir } var notification = { - tag: "install" + installation.Id, + tag: 'install' + installation.Id, data: {} }; @@ -215,25 +216,25 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir }); events.on(serverNotifications, 'PackageInstallationCompleted', function (e, apiClient, data) { - showPackageInstallNotification(apiClient, data, "completed"); + showPackageInstallNotification(apiClient, data, 'completed'); }); events.on(serverNotifications, 'PackageInstallationFailed', function (e, apiClient, data) { - showPackageInstallNotification(apiClient, data, "failed"); + showPackageInstallNotification(apiClient, data, 'failed'); }); events.on(serverNotifications, 'PackageInstallationCancelled', function (e, apiClient, data) { - showPackageInstallNotification(apiClient, data, "cancelled"); + showPackageInstallNotification(apiClient, data, 'cancelled'); }); events.on(serverNotifications, 'PackageInstalling', function (e, apiClient, data) { - showPackageInstallNotification(apiClient, data, "progress"); + showPackageInstallNotification(apiClient, data, 'progress'); }); events.on(serverNotifications, 'ServerShuttingDown', function (e, apiClient, data) { var serverId = apiClient.serverInfo().Id; var notification = { - tag: "restart" + serverId, + tag: 'restart' + serverId, title: globalize.translate('ServerNameIsShuttingDown', apiClient.serverInfo().Name) }; showNotification(notification, 0, apiClient); @@ -242,7 +243,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir events.on(serverNotifications, 'ServerRestarting', function (e, apiClient, data) { var serverId = apiClient.serverInfo().Id; var notification = { - tag: "restart" + serverId, + tag: 'restart' + serverId, title: globalize.translate('ServerNameIsRestarting', apiClient.serverInfo().Name) }; showNotification(notification, 0, apiClient); @@ -252,7 +253,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir var serverId = apiClient.serverInfo().Id; var notification = { - tag: "restart" + serverId, + tag: 'restart' + serverId, title: globalize.translate('PleaseRestartServerName', apiClient.serverInfo().Name) }; diff --git a/src/components/nowplayingbar/nowplayingbar.js b/src/components/nowplayingbar/nowplayingbar.js index a3839a934..546029a98 100644 --- a/src/components/nowplayingbar/nowplayingbar.js +++ b/src/components/nowplayingbar/nowplayingbar.js @@ -42,31 +42,31 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', // The onclicks are needed due to the return false above html += '
'; - html += ''; + html += ''; - html += ''; + html += ''; - html += ''; - html += ''; + html += ''; + html += ''; html += '
'; html += '
'; html += '
'; - html += ''; + html += ''; html += '
'; html += ''; html += '
'; - html += ''; + html += ''; html += '
'; html += '
'; - html += ''; - html += ''; + html += ''; + html += ''; html += '
'; html += '
'; @@ -134,12 +134,10 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', } }); - var i; - var length; playPauseButtons = elem.querySelectorAll('.playPauseButton'); - for (i = 0, length = playPauseButtons.length; i < length; i++) { - playPauseButtons[i].addEventListener('click', onPlayPauseClick); - } + playPauseButtons.forEach((button) => { + button.addEventListener('click', onPlayPauseClick); + }); elem.querySelector('.nextTrackButton').addEventListener('click', function () { @@ -174,7 +172,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', } }); - toggleRepeatButtonIcon = toggleRepeatButton.querySelector('i'); + toggleRepeatButtonIcon = toggleRepeatButton.querySelector('.material-icons'); volumeSlider = elem.querySelector('.nowPlayingBarVolumeSlider'); volumeSliderContainer = elem.querySelector('.nowPlayingBarVolumeSliderContainer'); @@ -281,22 +279,12 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', } function updatePlayPauseState(isPaused) { - var i; - var length; - if (playPauseButtons) { - if (isPaused) { - - for (i = 0, length = playPauseButtons.length; i < length; i++) { - playPauseButtons[i].querySelector('i').innerHTML = ''; - } - - } else { - - for (i = 0, length = playPauseButtons.length; i < length; i++) { - playPauseButtons[i].querySelector('i').innerHTML = 'pause'; - } - } + playPauseButtons.forEach((button) => { + const icon = button.querySelector('.material-icons'); + icon.classList.remove('play_arrow', 'pause'); + icon.classList.add(isPaused ? 'play_arrow' : 'pause'); + }); } } @@ -340,15 +328,16 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', } function updateRepeatModeDisplay(repeatMode) { + toggleRepeatButtonIcon.classList.remove('repeat', 'repeat_one'); if (repeatMode === 'RepeatAll') { - toggleRepeatButtonIcon.innerHTML = "repeat"; + toggleRepeatButtonIcon.classList.add('repeat'); toggleRepeatButton.classList.add('repeatButton-active'); } else if (repeatMode === 'RepeatOne') { - toggleRepeatButtonIcon.innerHTML = "repeat_one"; + toggleRepeatButtonIcon.classList.add('repeat_one'); toggleRepeatButton.classList.add('repeatButton-active'); } else { - toggleRepeatButtonIcon.innerHTML = "repeat"; + toggleRepeatButtonIcon.classList.add('repeat'); toggleRepeatButton.classList.remove('repeatButton-active'); } } @@ -379,7 +368,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', var timeText = positionTicks == null ? '--:--' : datetime.getDisplayRunningTime(positionTicks); if (runtimeTicks) { - timeText += " / " + datetime.getDisplayRunningTime(runtimeTicks); + timeText += ' / ' + datetime.getDisplayRunningTime(runtimeTicks); } currentTimeElement.innerHTML = timeText; @@ -397,11 +386,9 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', showMuteButton = false; } - if (isMuted) { - muteButton.querySelector('i').innerHTML = ''; - } else { - muteButton.querySelector('i').innerHTML = ''; - } + const muteButtonIcon = muteButton.querySelector('.material-icons'); + muteButtonIcon.classList.remove('volume_off', 'volume_up'); + muteButtonIcon.classList.add(isMuted ? 'volume_off' : 'volume_up'); if (supportedCommands.indexOf('SetVolume') === -1) { showVolumeSlider = false; @@ -453,7 +440,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', } options = options || {}; - options.type = options.type || "Primary"; + options.type = options.type || 'Primary'; if (options.type === 'Primary') { @@ -491,7 +478,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', } options = options || {}; - options.type = options.type || "Primary"; + options.type = options.type || 'Primary'; if (item.ImageTags && item.ImageTags[options.type]) { @@ -564,7 +551,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', queue: false, positionTo: contextButton }; - nowPlayingUserData.innerHTML = ''; + nowPlayingUserData.innerHTML = ''; apiClient.getCurrentUser().then(function(user) { contextButton.addEventListener('click', function () { itemContextMenu.show(Object.assign({ diff --git a/src/components/photoplayer/plugin.js b/src/components/photoplayer/plugin.js index 4ebdbbd6d..4dc00809d 100644 --- a/src/components/photoplayer/plugin.js +++ b/src/components/photoplayer/plugin.js @@ -1,5 +1,5 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackManager', 'appRouter', 'appSettings', 'connectionManager'], function (browser, require, events, appHost, loading, dom, playbackManager, appRouter, appSettings, connectionManager) { - "use strict"; + 'use strict'; function PhotoPlayer() { @@ -21,18 +21,24 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var index = options.startIndex || 0; - var newSlideShow = new slideshow({ - showTitle: false, - cover: false, - items: options.items, - startIndex: index, - interval: 11000, - interactive: true + var apiClient = connectionManager.currentApiClient(); + + apiClient.getCurrentUser().then(function(result) { + + var newSlideShow = new slideshow({ + showTitle: false, + cover: false, + items: options.items, + startIndex: index, + interval: 11000, + interactive: true, + user: result + }); + + newSlideShow.show(); + + resolve(); }); - - newSlideShow.show(); - - resolve(); }); }); }; diff --git a/src/components/playback/brightnessosd.js b/src/components/playback/brightnessosd.js index e73fc3968..5ed2b8f81 100644 --- a/src/components/playback/brightnessosd.js +++ b/src/components/playback/brightnessosd.js @@ -11,7 +11,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia function getOsdElementHtml() { var html = ''; - html += ''; + html += ''; html += '
'; @@ -32,7 +32,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia elem.classList.add('brightnessOsd'); elem.innerHTML = getOsdElementHtml(); - iconElement = elem.querySelector('i'); + iconElement = elem.querySelector('.material-icons'); progressElement = elem.querySelector('.iconOsdProgressInner'); document.body.appendChild(elem); diff --git a/src/components/playback/experimentalwarnings.js b/src/components/playback/experimentalwarnings.js index 02a7b82ca..632e38208 100644 --- a/src/components/playback/experimentalwarnings.js +++ b/src/components/playback/experimentalwarnings.js @@ -1,5 +1,5 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function (connectionManager, globalize, userSettings, appHost) { - "use strict"; + 'use strict'; function getRequirePromise(deps) { @@ -44,15 +44,15 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function ( } function showBlurayMessage() { - return showMessage(globalize.translate("UnsupportedPlayback"), 'blurayexpirementalinfo', 'nativeblurayplayback'); + return showMessage(globalize.translate('UnsupportedPlayback'), 'blurayexpirementalinfo', 'nativeblurayplayback'); } function showDvdMessage() { - return showMessage(globalize.translate("UnsupportedPlayback"), 'dvdexpirementalinfo', 'nativedvdplayback'); + return showMessage(globalize.translate('UnsupportedPlayback'), 'dvdexpirementalinfo', 'nativedvdplayback'); } function showIsoMessage() { - return showMessage(globalize.translate("UnsupportedPlayback"), 'isoexpirementalinfo', 'nativeisoplayback'); + return showMessage(globalize.translate('UnsupportedPlayback'), 'isoexpirementalinfo', 'nativeisoplayback'); } function ExpirementalPlaybackWarnings() { diff --git a/src/components/playback/mediasession.js b/src/components/playback/mediasession.js index c03420c85..2dd10b348 100644 --- a/src/components/playback/mediasession.js +++ b/src/components/playback/mediasession.js @@ -1,45 +1,28 @@ -define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], function (playbackManager, nowPlayingHelper, events, connectionManager) { - "use strict"; - - // no support for mediaSession - if (!navigator.mediaSession && !window.NativeShell) { - return; - } +import playbackManager from 'playbackManager'; +import nowPlayingHelper from 'nowPlayingHelper'; +import events from 'events'; +import connectionManager from 'connectionManager'; +/* eslint-disable indent */ // Reports media playback to the device for lock screen control - var currentPlayer; - var lastUpdateTime = 0; + let currentPlayer; - function seriesImageUrl(item, options) { + function seriesImageUrl(item, options = {}) { + options.type = options.type || 'Primary'; if (item.Type !== 'Episode') { return null; - } - - options = options || {}; - options.type = options.type || "Primary"; - - if (options.type === 'Primary') { - - if (item.SeriesPrimaryImageTag) { - - options.tag = item.SeriesPrimaryImageTag; - - return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); - } - } - - if (options.type === 'Thumb') { + } else if (options.type === 'Primary' && item.SeriesPrimaryImageTag) { + options.tag = item.SeriesPrimaryImageTag; + return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); + } else if (options.type === 'Thumb') { if (item.SeriesThumbImageTag) { - options.tag = item.SeriesThumbImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); - } - if (item.ParentThumbImageTag) { - + } else if (item.ParentThumbImageTag) { options.tag = item.ParentThumbImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.ParentThumbItemId, options); @@ -49,122 +32,101 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f return null; } - function imageUrl(item, options) { - - options = options || {}; - options.type = options.type || "Primary"; + function imageUrl(item, options = {}) { + options.type = options.type || 'Primary'; if (item.ImageTags && item.ImageTags[options.type]) { - options.tag = item.ImageTags[options.type]; + return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.Id, options); - } - - if (item.AlbumId && item.AlbumPrimaryImageTag) { - + } else if (item.AlbumId && item.AlbumPrimaryImageTag) { options.tag = item.AlbumPrimaryImageTag; + return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); } return null; } - function pushImageUrl(item, imageOptions, list) { - var url = seriesImageUrl(item, imageOptions) || imageUrl(item, imageOptions); + function getImageUrl(item, imageOptions = {}) { + const url = seriesImageUrl(item, imageOptions) || imageUrl(item, imageOptions); if (url) { - var height = imageOptions.height || imageOptions.maxHeight; + const height = imageOptions.height || imageOptions.maxHeight; - list.push({ + return { src: url, sizes: height + 'x' + height - }); + }; + } else { + return null; } } - function getImageUrls(item) { + function getImageUrls(item, imageSizes = [96, 128, 192, 256, 384, 512]) { + const list = []; - var list = []; - - pushImageUrl(item, {height: 96}, list); - pushImageUrl(item, {height: 128}, list); - pushImageUrl(item, {height: 192}, list); - pushImageUrl(item, {height: 256}, list); - pushImageUrl(item, {height: 384}, list); - pushImageUrl(item, {height: 512}, list); + imageSizes.forEach((size) => { + const url = getImageUrl(item, {height: size}); + if (url !== null) { + list.push(url); + } + }); return list; } function updatePlayerState(player, state, eventName) { // Don't go crazy reporting position changes - if (eventName == 'timeupdate') { + if (eventName === 'timeupdate') { // Only report if this item hasn't been reported yet, or if there's an actual playback change. // Don't report on simple time updates return; } - var item = state.NowPlayingItem; + const item = state.NowPlayingItem; if (!item) { hideMediaControls(); return; } - if (eventName == 'init') { // transform "init" event into "timeupdate" to restraint update rate + if (eventName === 'init') { // transform "init" event into "timeupdate" to restraint update rate eventName = 'timeupdate'; } - var isVideo = item.MediaType === 'Video'; - var isLocalPlayer = player.isLocalPlayer || false; + const isVideo = item.MediaType === 'Video'; + const isLocalPlayer = player.isLocalPlayer || false; // Local players do their own notifications if (isLocalPlayer && isVideo) { return; } - var playState = state.PlayState || {}; - var parts = nowPlayingHelper.getNowPlayingNames(item); - var artist = parts[parts.length - 1].text; - var title = parts.length === 1 ? '' : parts[0].text; - var albumArtist; + const playState = state.PlayState || {}; + const parts = nowPlayingHelper.getNowPlayingNames(item); + const artist = parts[parts.length - 1].text; + const title = parts.length === 1 ? '' : parts[0].text; - if (item.AlbumArtists && item.AlbumArtists[0]) { - albumArtist = item.AlbumArtists[0].Name; - } - - var album = item.Album || ''; - var itemId = item.Id; + const album = item.Album || ''; + const itemId = item.Id; // Convert to ms - var duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0); - var currentTime = parseInt(playState.PositionTicks ? (playState.PositionTicks / 10000) : 0); + const duration = parseInt(item.RunTimeTicks ? (item.RunTimeTicks / 10000) : 0); + const currentTime = parseInt(playState.PositionTicks ? (playState.PositionTicks / 10000) : 0); - var isPaused = playState.IsPaused || false; - var canSeek = playState.CanSeek || false; + const isPaused = playState.IsPaused || false; + const canSeek = playState.CanSeek || false; - if (navigator.mediaSession) { + if ('mediaSession' in navigator) { navigator.mediaSession.metadata = new MediaMetadata({ title: title, artist: artist, album: album, - artwork: getImageUrls(item), - albumArtist: albumArtist, - currentTime: currentTime, - duration: duration, - paused: isPaused, - itemId: itemId, - mediaType: item.MediaType + artwork: getImageUrls(item) }); } else { - var imageUrl = []; - pushImageUrl(item, {maxHeight: 400}, imageUrl); - - if (imageUrl.length) { - imageUrl = imageUrl[0].src; - } else { - imageUrl = null; - } + let itemImageUrl = seriesImageUrl(item, { maxHeight: 3000 }) || imageUrl(item, { maxHeight: 3000 }); window.NativeShell.updateMediaSession({ action: eventName, @@ -175,7 +137,7 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f album: album, duration: duration, position: currentTime, - imageUrl: imageUrl, + imageUrl: itemImageUrl, canSeek: canSeek, isPaused: isPaused }); @@ -183,37 +145,25 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f } function onGeneralEvent(e) { + const state = playbackManager.getPlayerState(this); - var player = this; - var state = playbackManager.getPlayerState(player); - - updatePlayerState(player, state, e.type); + updatePlayerState(this, state, e.type); } function onStateChanged(e, state) { - - var player = this; - updatePlayerState(player, state, 'statechange'); + updatePlayerState(this, state, 'statechange'); } function onPlaybackStart(e, state) { - - var player = this; - - updatePlayerState(player, state, e.type); + updatePlayerState(this, state, e.type); } - function onPlaybackStopped(e, state) { - - var player = this; - + function onPlaybackStopped() { hideMediaControls(); } function releaseCurrentPlayer() { - if (currentPlayer) { - events.off(currentPlayer, 'playbackstart', onPlaybackStart); events.off(currentPlayer, 'playbackstop', onPlaybackStopped); events.off(currentPlayer, 'unpause', onGeneralEvent); @@ -228,9 +178,7 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f } function hideMediaControls() { - lastUpdateTime = 0; - - if (navigator.mediaSession) { + if ('mediaSession' in navigator) { navigator.mediaSession.metadata = null; } else { window.NativeShell.hideMediaSession(); @@ -238,7 +186,6 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f } function bindToPlayer(player) { - releaseCurrentPlayer(); if (!player) { @@ -247,7 +194,7 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f currentPlayer = player; - var state = playbackManager.getPlayerState(player); + const state = playbackManager.getPlayerState(player); updatePlayerState(player, state, 'init'); events.on(currentPlayer, 'playbackstart', onPlaybackStart); @@ -261,8 +208,8 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f function execute(name) { playbackManager[name](currentPlayer); } - if (navigator.mediaSession) { + if ('mediaSession' in navigator) { navigator.mediaSession.setActionHandler('previoustrack', function () { execute('previousTrack'); }); @@ -289,9 +236,9 @@ define(['playbackManager', 'nowPlayingHelper', 'events', 'connectionManager'], f } events.on(playbackManager, 'playerchange', function () { - bindToPlayer(playbackManager.getCurrentPlayer()); }); bindToPlayer(playbackManager.getCurrentPlayer()); -}); + +/* eslint-enable indent */ diff --git a/src/components/playback/nowplayinghelper.js b/src/components/playback/nowplayinghelper.js index b1af977ab..9bba23c29 100644 --- a/src/components/playback/nowplayinghelper.js +++ b/src/components/playback/nowplayinghelper.js @@ -18,10 +18,10 @@ define([], function () { if (nowPlayingItem.MediaType === 'Video') { if (nowPlayingItem.IndexNumber != null) { - topText = nowPlayingItem.IndexNumber + " - " + topText; + topText = nowPlayingItem.IndexNumber + ' - ' + topText; } if (nowPlayingItem.ParentIndexNumber != null) { - topText = nowPlayingItem.ParentIndexNumber + "." + topText; + topText = nowPlayingItem.ParentIndexNumber + '.' + topText; } } diff --git a/src/components/playback/playaccessvalidation.js b/src/components/playback/playaccessvalidation.js index 46a6f7546..5148d2b82 100644 --- a/src/components/playback/playaccessvalidation.js +++ b/src/components/playback/playaccessvalidation.js @@ -1,5 +1,5 @@ define(['connectionManager', 'globalize'], function (connectionManager, globalize) { - "use strict"; + 'use strict'; function getRequirePromise(deps) { return new Promise(function (resolve, reject) { diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 031231285..dea419c8c 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -128,8 +128,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } else { query.Limit = query.Limit || 300; - query.Fields = "Chapters"; - query.ExcludeLocationTypes = "Virtual"; + query.Fields = 'Chapters'; + query.ExcludeLocationTypes = 'Virtual'; query.EnableTotalRecordCount = false; query.CollapseBoxSetItems = false; @@ -164,7 +164,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla function backdropImageUrl(apiClient, item, options) { options = options || {}; - options.type = options.type || "Backdrop"; + options.type = options.type || 'Backdrop'; // If not resizing, get the original image if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) { @@ -221,15 +221,15 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } function getParam(name, url) { - name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); - var regexS = "[\\?&]" + name + "=([^&#]*)"; - var regex = new RegExp(regexS, "i"); + name = name.replace(/[\[]/, '\\\[').replace(/[\]]/, '\\\]'); + var regexS = '[\\?&]' + name + '=([^&#]*)'; + var regex = new RegExp(regexS, 'i'); var results = regex.exec(url); if (results == null) { - return ""; + return ''; } else { - return decodeURIComponent(results[1].replace(/\+/g, " ")); + return decodeURIComponent(results[1].replace(/\+/g, ' ')); } } @@ -309,13 +309,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (codecProfile.Type === 'Audio') { (codecProfile.Conditions || []).map(function (condition) { if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitDepth') { - maxAudioBitDepth = condition.Value; - } - if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioSampleRate') { - maxAudioSampleRate = condition.Value; - } - if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitrate') { - maxAudioBitrate = condition.Value; + return maxAudioBitDepth = condition.Value; + } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioSampleRate') { + return maxAudioSampleRate = condition.Value; + } else if (condition.Condition === 'LessThanEqual' && condition.Property === 'AudioBitrate') { + return maxAudioBitrate = condition.Value; } }); } @@ -616,8 +614,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla url: apiClient.getUrl('LiveStreams/Open', query), type: 'POST', data: JSON.stringify(postData), - contentType: "application/json", - dataType: "json" + contentType: 'application/json', + dataType: 'json' }); } @@ -1129,17 +1127,17 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla var itemType = item.Type; - if (itemType === "PhotoAlbum" || itemType === "MusicGenre" || itemType === "Season" || itemType === "Series" || itemType === "BoxSet" || itemType === "MusicAlbum" || itemType === "MusicArtist" || itemType === "Playlist") { + if (itemType === 'PhotoAlbum' || itemType === 'MusicGenre' || itemType === 'Season' || itemType === 'Series' || itemType === 'BoxSet' || itemType === 'MusicAlbum' || itemType === 'MusicArtist' || itemType === 'Playlist') { return true; } - if (item.LocationType === "Virtual") { - if (itemType !== "Program") { + if (item.LocationType === 'Virtual') { + if (itemType !== 'Program') { return false; } } - if (itemType === "Program") { + if (itemType === 'Program') { if (!item.EndDate || !item.StartDate) { return false; @@ -1877,36 +1875,36 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla var queryOptions = options.queryOptions || {}; - if (firstItem.Type === "Program") { + if (firstItem.Type === 'Program') { promise = getItemsForPlayback(serverId, { Ids: firstItem.ChannelId }); - } else if (firstItem.Type === "Playlist") { + } else if (firstItem.Type === 'Playlist') { promise = getItemsForPlayback(serverId, { ParentId: firstItem.Id, SortBy: options.shuffle ? 'Random' : null }); - } else if (firstItem.Type === "MusicArtist") { + } else if (firstItem.Type === 'MusicArtist') { promise = getItemsForPlayback(serverId, { ArtistIds: firstItem.Id, - Filters: "IsNotFolder", + Filters: 'IsNotFolder', Recursive: true, SortBy: options.shuffle ? 'Random' : 'SortName', - MediaTypes: "Audio" + MediaTypes: 'Audio' }); - } else if (firstItem.MediaType === "Photo") { + } else if (firstItem.MediaType === 'Photo') { promise = getItemsForPlayback(serverId, { ParentId: firstItem.ParentId, - Filters: "IsNotFolder", + Filters: 'IsNotFolder', // Setting this to true may cause some incorrect sorting Recursive: false, SortBy: options.shuffle ? 'Random' : 'SortName', - MediaTypes: "Photo,Video", + MediaTypes: 'Photo,Video', Limit: 500 }).then(function (result) { @@ -1927,40 +1925,40 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return Promise.resolve(result); }); - } else if (firstItem.Type === "PhotoAlbum") { + } else if (firstItem.Type === 'PhotoAlbum') { promise = getItemsForPlayback(serverId, { ParentId: firstItem.Id, - Filters: "IsNotFolder", + Filters: 'IsNotFolder', // Setting this to true may cause some incorrect sorting Recursive: false, SortBy: options.shuffle ? 'Random' : 'SortName', - MediaTypes: "Photo,Video", + MediaTypes: 'Photo,Video', Limit: 1000 }); - } else if (firstItem.Type === "MusicGenre") { + } else if (firstItem.Type === 'MusicGenre') { promise = getItemsForPlayback(serverId, { GenreIds: firstItem.Id, - Filters: "IsNotFolder", + Filters: 'IsNotFolder', Recursive: true, SortBy: options.shuffle ? 'Random' : 'SortName', - MediaTypes: "Audio" + MediaTypes: 'Audio' }); } else if (firstItem.IsFolder) { promise = getItemsForPlayback(serverId, mergePlaybackQueries({ ParentId: firstItem.Id, - Filters: "IsNotFolder", + Filters: 'IsNotFolder', Recursive: true, // These are pre-sorted SortBy: options.shuffle ? 'Random' : (['BoxSet'].indexOf(firstItem.Type) === -1 ? 'SortName' : null), - MediaTypes: "Audio,Video" + MediaTypes: 'Audio,Video' }, queryOptions)); - } else if (firstItem.Type === "Episode" && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) { + } else if (firstItem.Type === 'Episode' && items.length === 1 && getPlayer(firstItem, options).supportsProgress !== false) { promise = new Promise(function (resolve, reject) { var apiClient = connectionManager.getApiClient(firstItem.ServerId); @@ -1976,7 +1974,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla IsVirtualUnaired: false, IsMissing: false, UserId: apiClient.getCurrentUserId(), - Fields: "Chapters" + Fields: 'Chapters' }).then(function (episodesResult) { @@ -2213,7 +2211,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return Promise.reject(); } - if (firstItem.MediaType === "Photo") { + if (firstItem.MediaType === 'Photo') { return playPhotos(items, options, user); } @@ -3851,23 +3849,23 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (player.isLocalPlayer) { var list = [ - "GoHome", - "GoToSettings", - "VolumeUp", - "VolumeDown", - "Mute", - "Unmute", - "ToggleMute", - "SetVolume", - "SetAudioStreamIndex", - "SetSubtitleStreamIndex", - "SetMaxStreamingBitrate", - "DisplayContent", - "GoToSearch", - "DisplayMessage", - "SetRepeatMode", - "PlayMediaSource", - "PlayTrailers" + 'GoHome', + 'GoToSettings', + 'VolumeUp', + 'VolumeDown', + 'Mute', + 'Unmute', + 'ToggleMute', + 'SetVolume', + 'SetAudioStreamIndex', + 'SetSubtitleStreamIndex', + 'SetMaxStreamingBitrate', + 'DisplayContent', + 'GoToSearch', + 'DisplayMessage', + 'SetRepeatMode', + 'PlayMediaSource', + 'PlayTrailers' ]; if (apphost.supports('fullscreenchange')) { diff --git a/src/components/playback/playbackorientation.js b/src/components/playback/playbackorientation.js index 5836298ea..654ac2984 100644 --- a/src/components/playback/playbackorientation.js +++ b/src/components/playback/playbackorientation.js @@ -1,5 +1,5 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager, layoutManager, events) { - "use strict"; + 'use strict'; var orientationLocked; diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 97e6e4623..329cc11f9 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -99,7 +99,7 @@ define(['appSettings', 'events', 'browser', 'loading', 'playbackManager', 'appRo var name = t.name; if (t.appName && t.appName !== t.name) { - name += " - " + t.appName; + name += ' - ' + t.appName; } return { diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js index 086f98c2d..b89631f63 100644 --- a/src/components/playback/playersettingsmenu.js +++ b/src/components/playback/playersettingsmenu.js @@ -4,7 +4,7 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob function showQualityMenu(player, btn) { var videoStream = playbackManager.currentMediaSource(player).MediaStreams.filter(function (stream) { - return stream.Type === "Video"; + return stream.Type === 'Video'; })[0]; var videoWidth = videoStream ? videoStream.Width : null; @@ -87,7 +87,7 @@ define(['connectionManager', 'actionsheet', 'datetime', 'playbackManager', 'glob var currentMaxBitrate = playbackManager.getMaxStreamingBitrate(player); var videoStream = playbackManager.currentMediaSource(player).MediaStreams.filter(function (stream) { - return stream.Type === "Video"; + return stream.Type === 'Video'; })[0]; var videoWidth = videoStream ? videoStream.Width : null; diff --git a/src/components/playback/playqueuemanager.js b/src/components/playback/playqueuemanager.js index 429c4027f..565cb6993 100644 --- a/src/components/playback/playqueuemanager.js +++ b/src/components/playback/playqueuemanager.js @@ -6,7 +6,7 @@ define([], function () { if (!item.PlaylistItemId) { - item.PlaylistItemId = "playlistItem" + currentId; + item.PlaylistItemId = 'playlistItem' + currentId; currentId++; } } diff --git a/src/components/playback/volumeosd.js b/src/components/playback/volumeosd.js index 5d2c90ddb..95a13d769 100644 --- a/src/components/playback/volumeosd.js +++ b/src/components/playback/volumeosd.js @@ -11,7 +11,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia function getOsdElementHtml() { var html = ''; - html += ''; + html += ''; html += '
'; @@ -32,7 +32,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia elem.classList.add('volumeOsd'); elem.innerHTML = getOsdElementHtml(); - iconElement = elem.querySelector('i'); + iconElement = elem.querySelector('.material-icons'); progressElement = elem.querySelector('.iconOsdProgressInner'); document.body.appendChild(elem); @@ -101,7 +101,8 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia function updatePlayerVolumeState(isMuted, volume) { if (iconElement) { - iconElement.innerHTML = isMuted ? '' : ''; + iconElement.classList.remove('volume_off', 'volume_up'); + iconElement.classList.add(isMuted ? 'volume_off' : 'volume_up'); } if (progressElement) { progressElement.style.width = (volume || 0) + '%'; diff --git a/src/components/playbacksettings/playbacksettings.js b/src/components/playbacksettings/playbacksettings.js index d249b5b98..259386397 100644 --- a/src/components/playbacksettings/playbacksettings.js +++ b/src/components/playbacksettings/playbacksettings.js @@ -1,5 +1,5 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'qualityoptions', 'globalize', 'loading', 'connectionManager', 'dom', 'events', 'emby-select', 'emby-checkbox'], function (require, browser, appSettings, appHost, focusManager, qualityoptions, globalize, loading, connectionManager, dom, events) { - "use strict"; + 'use strict'; function fillSkipLengths(select) { @@ -17,15 +17,15 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality function populateLanguages(select, languages) { - var html = ""; + var html = ''; - html += ""; + html += "'; for (var i = 0, length = languages.length; i < length; i++) { var culture = languages[i]; - html += ""; + html += "'; } select.innerHTML = html; @@ -154,12 +154,12 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality populateLanguages(context.querySelector('#selectAudioLanguage'), allCultures); - context.querySelector('#selectAudioLanguage', context).value = user.Configuration.AudioLanguagePreference || ""; + context.querySelector('#selectAudioLanguage', context).value = user.Configuration.AudioLanguagePreference || ''; context.querySelector('.chkEpisodeAutoPlay').checked = user.Configuration.EnableNextEpisodeAutoPlay || false; }); // hide cinema mode options if disabled at server level - apiClient.getNamedConfiguration("cinemamode").then(function (cinemaConfig) { + apiClient.getNamedConfiguration('cinemamode').then(function (cinemaConfig) { if (cinemaConfig.EnableIntrosForMovies || cinemaConfig.EnableIntrosForEpisodes) { context.querySelector('.cinemaModeOptions').classList.remove('hide'); diff --git a/src/components/playerstats/playerstats.js b/src/components/playerstats/playerstats.js index 89adf2262..c0fb369c6 100644 --- a/src/components/playerstats/playerstats.js +++ b/src/components/playerstats/playerstats.js @@ -18,7 +18,7 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth if (layoutManager.tv) { button = ''; } else { - button = ''; + button = ''; } var contentClass = layoutManager.tv ? 'playerStats-content playerStats-content-tv' : 'playerStats-content'; @@ -132,7 +132,7 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth if (videoCodec) { sessionStats.push({ - label: globalize.translate("LabelVideoCodec"), + label: globalize.translate('LabelVideoCodec'), value: session.TranscodingInfo.IsVideoDirect ? (videoCodec.toUpperCase() + ' (direct)') : videoCodec.toUpperCase() }); } @@ -140,7 +140,7 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth if (audioCodec) { sessionStats.push({ - label: globalize.translate("LabelAudioCodec"), + label: globalize.translate('LabelAudioCodec'), value: session.TranscodingInfo.IsAudioDirect ? (audioCodec.toUpperCase() + ' (direct)') : audioCodec.toUpperCase() }); } @@ -157,28 +157,28 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth if (totalBitrate) { sessionStats.push({ - label: globalize.translate("LabelBitrate"), + label: globalize.translate('LabelBitrate'), value: getDisplayBitrate(totalBitrate) }); } if (session.TranscodingInfo.CompletionPercentage) { sessionStats.push({ - label: globalize.translate("LabelTranscodingProgress"), + label: globalize.translate('LabelTranscodingProgress'), value: session.TranscodingInfo.CompletionPercentage.toFixed(1) + '%' }); } if (session.TranscodingInfo.Framerate) { sessionStats.push({ - label: globalize.translate("LabelTranscodingFramerate"), + label: globalize.translate('LabelTranscodingFramerate'), value: session.TranscodingInfo.Framerate + ' fps' }); } if (session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { sessionStats.push({ - label: globalize.translate("LabelReasonForTranscoding"), + label: globalize.translate('LabelReasonForTranscoding'), value: session.TranscodingInfo.TranscodeReasons.map(translateReason).join('
') }); } @@ -216,14 +216,14 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth if (mediaSource.Container) { sessionStats.push({ - label: globalize.translate("LabelProfileContainer"), + label: globalize.translate('LabelProfileContainer'), value: mediaSource.Container }); } if (mediaFileSize) { sessionStats.push({ - label: globalize.translate("LabelSize"), + label: globalize.translate('LabelSize'), value: getReadableSize(mediaFileSize) }); } @@ -231,7 +231,7 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth if (totalBitrate) { sessionStats.push({ - label: globalize.translate("LabelBitrate"), + label: globalize.translate('LabelBitrate'), value: getDisplayBitrate(totalBitrate) }); } @@ -267,14 +267,14 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth if (videoInfos.length) { sessionStats.push({ - label: globalize.translate("LabelVideoCodec"), + label: globalize.translate('LabelVideoCodec'), value: videoInfos.join(' ') }); } if (videoStream.BitRate) { sessionStats.push({ - label: globalize.translate("LabelVideoBitrate"), + label: globalize.translate('LabelVideoBitrate'), value: getDisplayBitrate(videoStream.BitRate) }); } @@ -291,35 +291,35 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth if (audioInfos.length) { sessionStats.push({ - label: globalize.translate("LabelAudioCodec"), + label: globalize.translate('LabelAudioCodec'), value: audioInfos.join(' ') }); } if (audioStream.BitRate) { sessionStats.push({ - label: globalize.translate("LabelAudioBitrate"), + label: globalize.translate('LabelAudioBitrate'), value: getDisplayBitrate(audioStream.BitRate) }); } if (audioChannels) { sessionStats.push({ - label: globalize.translate("LabelAudioChannels"), + label: globalize.translate('LabelAudioChannels'), value: audioChannels }); } if (audioStream.SampleRate) { sessionStats.push({ - label: globalize.translate("LabelAudioSampleRate"), + label: globalize.translate('LabelAudioSampleRate'), value: audioStream.SampleRate + ' Hz' }); } if (audioStream.BitDepth) { sessionStats.push({ - label: globalize.translate("LabelAudioBitDepth"), + label: globalize.translate('LabelAudioBitDepth'), value: audioStream.BitDepth }); } @@ -346,12 +346,12 @@ define(['events', 'globalize', 'playbackManager', 'connectionManager', 'playMeth }; baseCategory.stats.unshift({ - label: globalize.translate("LabelPlayMethod"), + label: globalize.translate('LabelPlayMethod'), value: displayPlayMethod }); baseCategory.stats.unshift({ - label: globalize.translate("LabelPlayer"), + label: globalize.translate('LabelPlayer'), value: player.name }); diff --git a/src/components/playlisteditor/playlisteditor.js b/src/components/playlisteditor/playlisteditor.js index 69356a38c..56d7142ad 100644 --- a/src/components/playlisteditor/playlisteditor.js +++ b/src/components/playlisteditor/playlisteditor.js @@ -23,7 +23,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan function createPlaylist(apiClient, dlg) { loading.show(); - var url = apiClient.getUrl("Playlists", { + var url = apiClient.getUrl('Playlists', { Name: dlg.querySelector('#txtNewPlaylistName').value, Ids: dlg.querySelector('.fldSelectedItemIds').value || '', userId: apiClient.getCurrentUserId() @@ -31,9 +31,9 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan }); apiClient.ajax({ - type: "POST", + type: 'POST', url: url, - dataType: "json" + dataType: 'json' }).then(function (result) { loading.hide(); @@ -63,13 +63,13 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan loading.show(); - var url = apiClient.getUrl("Playlists/" + id + "/Items", { + var url = apiClient.getUrl('Playlists/' + id + '/Items', { Ids: itemIds, userId: apiClient.getCurrentUserId() }); apiClient.ajax({ - type: "POST", + type: 'POST', url: url }).then(function () { @@ -93,7 +93,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan var options = { Recursive: true, - IncludeItemTypes: "Playlist", + IncludeItemTypes: 'Playlist', SortBy: 'SortName', EnableTotalRecordCount: false }; @@ -228,7 +228,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'playbackMan var title = globalize.translate('HeaderAddToPlaylist'); html += '
'; - html += ''; + html += ''; html += '

'; html += title; html += '

'; diff --git a/src/components/playmenu.js b/src/components/playmenu.js index a410da698..50c2a7b31 100644 --- a/src/components/playmenu.js +++ b/src/components/playmenu.js @@ -1,75 +1,71 @@ -define(['actionsheet', 'datetime', 'playbackManager', 'globalize', 'appSettings'], function (actionsheet, datetime, playbackManager, globalize, appSettings) { - 'use strict'; +import actionsheet from 'actionsheet'; +import datetime from 'datetime'; +import playbackManager from 'playbackManager'; +import globalize from 'globalize'; - function show(options) { +export function show(options) { - var item = options.item; + var item = options.item; - var itemType = item.Type; - var isFolder = item.IsFolder; - var itemId = item.Id; - var channelId = item.ChannelId; - var serverId = item.ServerId; - var resumePositionTicks = item.UserData ? item.UserData.PlaybackPositionTicks : null; + var resumePositionTicks = item.UserData ? item.UserData.PlaybackPositionTicks : null; - var playableItemId = itemType === 'Program' ? channelId : itemId; + var playableItemId = item.Type === 'Program' ? item.ChannelId : item.Id; - if (!resumePositionTicks || isFolder) { - playbackManager.play({ - ids: [playableItemId], - serverId: serverId - }); - return; - } - - var menuItems = []; - - menuItems.push({ - name: globalize.translate('ResumeAt', datetime.getDisplayRunningTime(resumePositionTicks)), - id: 'resume' - }); - - menuItems.push({ - name: globalize.translate('PlayFromBeginning'), - id: 'play' - }); - - actionsheet.show({ - - items: menuItems, - positionTo: options.positionTo - - }).then(function (id) { - switch (id) { - - case 'play': - playbackManager.play({ - ids: [playableItemId], - serverId: serverId - }); - break; - case 'resume': - playbackManager.play({ - ids: [playableItemId], - startPositionTicks: resumePositionTicks, - serverId: serverId - }); - break; - case 'queue': - playbackManager.queue({ - items: [item] - }); - break; - case 'shuffle': - playbackManager.shuffle(item); - break; - default: - break; - } + if (!resumePositionTicks || item.IsFolder) { + playbackManager.play({ + ids: [playableItemId], + serverId: item.ServerId }); + return; } - return { - show: show - }; -}); + var menuItems = []; + + menuItems.push({ + name: globalize.translate('ResumeAt', datetime.getDisplayRunningTime(resumePositionTicks)), + id: 'resume' + }); + + menuItems.push({ + name: globalize.translate('PlayFromBeginning'), + id: 'play' + }); + + actionsheet.show({ + + items: menuItems, + positionTo: options.positionTo + + }).then(function (id) { + switch (id) { + + case 'play': + playbackManager.play({ + ids: [playableItemId], + serverId: item.ServerId + }); + break; + case 'resume': + playbackManager.play({ + ids: [playableItemId], + startPositionTicks: resumePositionTicks, + serverId: item.ServerId + }); + break; + case 'queue': + playbackManager.queue({ + items: [item] + }); + break; + case 'shuffle': + playbackManager.shuffle(item); + break; + default: + break; + } + }); +} + +export default { + show: show +}; diff --git a/src/components/prompt/prompt.js b/src/components/prompt/prompt.js index 41d40c4a4..a76083cf0 100644 --- a/src/components/prompt/prompt.js +++ b/src/components/prompt/prompt.js @@ -1,4 +1,4 @@ -define(["browser", 'dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function(browser, dialogHelper, layoutManager, scrollHelper, globalize, dom, require) { +define(['browser', 'dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function(browser, dialogHelper, layoutManager, scrollHelper, globalize, dom, require) { 'use strict'; function replaceAll(str, find, replace) { diff --git a/src/components/prompt/prompt.template.html b/src/components/prompt/prompt.template.html index 23b918a1f..981fa9f10 100644 --- a/src/components/prompt/prompt.template.html +++ b/src/components/prompt/prompt.template.html @@ -1,6 +1,6 @@

diff --git a/src/components/recordingcreator/recordingbutton.js b/src/components/recordingcreator/recordingbutton.js index e9c174bfd..c4bfc4301 100644 --- a/src/components/recordingcreator/recordingbutton.js +++ b/src/components/recordingcreator/recordingbutton.js @@ -22,7 +22,7 @@ define(['globalize', 'connectionManager', 'require', 'loading', 'apphost', 'dom' } function setButtonIcon(button, icon) { - var inner = button.querySelector('i'); + var inner = button.querySelector('.material-icons'); inner.classList.remove('fiber_smart_record'); inner.classList.remove('fiber_manual_record'); inner.classList.add(icon); diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js index a51fac430..ae26d0deb 100644 --- a/src/components/recordingcreator/recordingcreator.js +++ b/src/components/recordingcreator/recordingcreator.js @@ -36,14 +36,14 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c if (imageTags.Primary) { return apiClient.getScaledImageUrl(item.Id, { - type: "Primary", + type: 'Primary', maxHeight: imageHeight, tag: item.ImageTags.Primary }); } else if (imageTags.Thumb) { return apiClient.getScaledImageUrl(item.Id, { - type: "Thumb", + type: 'Thumb', maxHeight: imageHeight, tag: item.ImageTags.Thumb }); diff --git a/src/components/recordingcreator/recordingcreator.template.html b/src/components/recordingcreator/recordingcreator.template.html index b99ead300..8d7d75c8f 100644 --- a/src/components/recordingcreator/recordingcreator.template.html +++ b/src/components/recordingcreator/recordingcreator.template.html @@ -1,5 +1,5 @@
- +

diff --git a/src/components/recordingcreator/recordingeditor.template.html b/src/components/recordingcreator/recordingeditor.template.html index 48256da0a..f7a9f98ee 100644 --- a/src/components/recordingcreator/recordingeditor.template.html +++ b/src/components/recordingcreator/recordingeditor.template.html @@ -1,5 +1,5 @@
- +

${HeaderRecordingOptions}

diff --git a/src/components/recordingcreator/recordingfields.js b/src/components/recordingcreator/recordingfields.js index 106fec36b..b4cbdfab0 100644 --- a/src/components/recordingcreator/recordingfields.js +++ b/src/components/recordingcreator/recordingfields.js @@ -151,7 +151,7 @@ define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loa var apiClient = connectionManager.getApiClient(options.serverId); var button = dom.parentWithTag(e.target, 'BUTTON'); - var isChecked = !button.querySelector('i').classList.contains('recordingIcon-active'); + var isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active'); var hasEnabledTimer = this.TimerId && this.Status !== 'Cancelled'; @@ -191,7 +191,7 @@ define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loa var apiClient = connectionManager.getApiClient(options.serverId); var button = dom.parentWithTag(e.target, 'BUTTON'); - var isChecked = !button.querySelector('i').classList.contains('recordingIcon-active'); + var isChecked = !button.querySelector('.material-icons').classList.contains('recordingIcon-active'); if (isChecked) { options.parent.querySelector('.recordSeriesContainer').classList.remove('hide'); diff --git a/src/components/recordingcreator/recordingfields.template.html b/src/components/recordingcreator/recordingfields.template.html index ce3596071..25a0c3c30 100644 --- a/src/components/recordingcreator/recordingfields.template.html +++ b/src/components/recordingcreator/recordingfields.template.html @@ -2,7 +2,7 @@
@@ -14,7 +14,7 @@
diff --git a/src/components/recordingcreator/seriesrecordingeditor.template.html b/src/components/recordingcreator/seriesrecordingeditor.template.html index fa9f16561..582c1a633 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.template.html +++ b/src/components/recordingcreator/seriesrecordingeditor.template.html @@ -1,5 +1,5 @@
- +

${HeaderSeriesOptions}

diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js index 1e54d9837..3edb725c4 100644 --- a/src/components/refreshdialog/refreshdialog.js +++ b/src/components/refreshdialog/refreshdialog.js @@ -110,7 +110,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionM var title = globalize.translate('RefreshMetadata'); html += '
'; - html += ''; + html += ''; html += '

'; html += title; html += '

'; diff --git a/src/components/remotecontrol/remotecontrol.css b/src/components/remotecontrol/remotecontrol.css index 9cdfcde15..073c92533 100644 --- a/src/components/remotecontrol/remotecontrol.css +++ b/src/components/remotecontrol/remotecontrol.css @@ -152,7 +152,7 @@ color: inherit !important; } -.contextMenuList i.listItemIcon { +.contextMenuList .material-icons.listItemIcon { font-size: x-large; } @@ -643,7 +643,7 @@ display: none !important; } - .navigationSection .collapseContent i { + .navigationSection .collapseContent .material-icons { font-size: 4em; } } diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 327cd1dcf..a4f25a774 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -1,5 +1,5 @@ -define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageLoader", "playbackManager", "nowPlayingHelper", "events", "connectionManager", "apphost", "globalize", "layoutManager", "userSettings", "cardBuilder", "cardStyle", "emby-itemscontainer", "css!./remotecontrol.css", "emby-ratingbutton"], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings, cardBuilder) { - "use strict"; +define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageLoader', 'playbackManager', 'nowPlayingHelper', 'events', 'connectionManager', 'apphost', 'globalize', 'layoutManager', 'userSettings', 'cardBuilder', 'cardStyle', 'emby-itemscontainer', 'css!./remotecontrol.css', 'emby-ratingbutton'], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings, cardBuilder) { + 'use strict'; function showAudioMenu(context, player, button, item) { var currentIndex = playbackManager.getAudioStreamIndex(player); @@ -17,7 +17,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL return menuItem; }); - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: menuItems, positionTo: button, @@ -45,11 +45,11 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL }); menuItems.unshift({ id: -1, - name: globalize.translate("ButtonOff"), + name: globalize.translate('ButtonOff'), selected: null == currentIndex }); - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: menuItems, positionTo: button, @@ -63,22 +63,22 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function getNowPlayingNameHtml(nowPlayingItem, includeNonNameInfo) { return nowPlayingHelper.getNowPlayingNames(nowPlayingItem, includeNonNameInfo).map(function (i) { return i.text; - }).join("
"); + }).join('
'); } function seriesImageUrl(item, options) { - if ("Episode" !== item.Type) { + if ('Episode' !== item.Type) { return null; } options = options || {}; - options.type = options.type || "Primary"; - if ("Primary" === options.type && item.SeriesPrimaryImageTag) { + options.type = options.type || 'Primary'; + if ('Primary' === options.type && item.SeriesPrimaryImageTag) { options.tag = item.SeriesPrimaryImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } - if ("Thumb" === options.type) { + if ('Thumb' === options.type) { if (item.SeriesThumbImageTag) { options.tag = item.SeriesThumbImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); @@ -95,7 +95,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function imageUrl(item, options) { options = options || {}; - options.type = options.type || "Primary"; + options.type = options.type || 'Primary'; if (item.ImageTags && item.ImageTags[options.type]) { options.tag = item.ImageTags[options.type]; @@ -112,49 +112,49 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function updateNowPlayingInfo(context, state, serverId) { var item = state.NowPlayingItem; - var displayName = item ? getNowPlayingNameHtml(item).replace("
", " - ") : ""; + var displayName = item ? getNowPlayingNameHtml(item).replace('
', ' - ') : ''; if (typeof item !== 'undefined') { var nowPlayingServerId = (item.ServerId || serverId); - if (item.Type == "Audio" || item.MediaStreams[0].Type == "Audio") { + if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') { var songName = item.Name; if (item.Album != null && item.Artists != null) { var albumName = item.Album; var artistName; if (item.ArtistItems != null) { artistName = item.ArtistItems[0].Name; - context.querySelector(".nowPlayingAlbum").innerHTML = '${albumName}`; - context.querySelector(".nowPlayingArtist").innerHTML = '${artistName}`; - context.querySelector(".contextMenuAlbum").innerHTML = ' ` + globalize.translate("ViewAlbum") + ''; - context.querySelector(".contextMenuArtist").innerHTML = ' ` + globalize.translate("ViewArtist") + ''; + context.querySelector('.nowPlayingAlbum').innerHTML = '${albumName}`; + context.querySelector('.nowPlayingArtist').innerHTML = '${artistName}`; + context.querySelector('.contextMenuAlbum').innerHTML = ' ` + globalize.translate('ViewAlbum') + ''; + context.querySelector('.contextMenuArtist').innerHTML = ' ` + globalize.translate('ViewArtist') + ''; } else { artistName = item.Artists; - context.querySelector(".nowPlayingAlbum").innerHTML = albumName; - context.querySelector(".nowPlayingArtist").innerHTML = artistName; + context.querySelector('.nowPlayingAlbum').innerHTML = albumName; + context.querySelector('.nowPlayingArtist').innerHTML = artistName; } } - context.querySelector(".nowPlayingSongName").innerHTML = songName; - } else if (item.Type == "Episode") { + context.querySelector('.nowPlayingSongName').innerHTML = songName; + } else if (item.Type == 'Episode') { if (item.SeasonName != null) { var seasonName = item.SeasonName; - context.querySelector(".nowPlayingSeason").innerHTML = '${seasonName}`; + context.querySelector('.nowPlayingSeason').innerHTML = '${seasonName}`; } if (item.SeriesName != null) { var seriesName = item.SeriesName; if (item.SeriesId !=null) { - context.querySelector(".nowPlayingSerie").innerHTML = '${seriesName}`; + context.querySelector('.nowPlayingSerie').innerHTML = '${seriesName}`; } else { - context.querySelector(".nowPlayingSerie").innerHTML = seriesName; + context.querySelector('.nowPlayingSerie').innerHTML = seriesName; } } - context.querySelector(".nowPlayingEpisode").innerHTML = item.Name; + context.querySelector('.nowPlayingEpisode').innerHTML = item.Name; } else { - context.querySelector(".nowPlayingPageTitle").innerHTML = displayName; + context.querySelector('.nowPlayingPageTitle').innerHTML = displayName; } - if (displayName.length > 0 && item.Type != "Audio" && item.Type != "Episode") { - context.querySelector(".nowPlayingPageTitle").classList.remove("hide"); + if (displayName.length > 0 && item.Type != 'Audio' && item.Type != 'Episode') { + context.querySelector('.nowPlayingPageTitle').classList.remove('hide'); } else { - context.querySelector(".nowPlayingPageTitle").classList.add("hide"); + context.querySelector('.nowPlayingPageTitle').classList.add('hide'); } var url = item ? seriesImageUrl(item, { @@ -163,20 +163,20 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL maxHeight: 300 * 2 }) : null; - console.debug("updateNowPlayingInfo"); + console.debug('updateNowPlayingInfo'); setImageUrl(context, state, url); if (item) { backdrop.setBackdrops([item]); var apiClient = connectionManager.getApiClient(item.ServerId); apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) { var userData = fullItem.UserData || {}; - var likes = null == userData.Likes ? "" : userData.Likes; - context.querySelector(".nowPlayingPageUserDataButtonsTitle").innerHTML = ''; - context.querySelector(".nowPlayingPageUserDataButtons").innerHTML = ''; + var likes = null == userData.Likes ? '' : userData.Likes; + context.querySelector('.nowPlayingPageUserDataButtonsTitle').innerHTML = ''; + context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = ''; }); } else { backdrop.clear(); - context.querySelector(".nowPlayingPageUserDataButtons").innerHTML = ""; + context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = ''; } } } @@ -184,35 +184,35 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function setImageUrl(context, state, url) { currentImgUrl = url; var item = state.NowPlayingItem; - var imgContainer = context.querySelector(".nowPlayingPageImageContainer"); + var imgContainer = context.querySelector('.nowPlayingPageImageContainer'); if (url) { imgContainer.innerHTML = ''; - if (item.Type == "Audio") { - context.querySelector(".nowPlayingPageImage").classList.add("nowPlayingPageImageAudio"); - context.querySelector(".nowPlayingPageImageContainer").classList.remove("nowPlayingPageImageAudio"); + if (item.Type == 'Audio') { + context.querySelector('.nowPlayingPageImage').classList.add('nowPlayingPageImageAudio'); + context.querySelector('.nowPlayingPageImageContainer').classList.remove('nowPlayingPageImageAudio'); } else { - context.querySelector(".nowPlayingPageImageContainer").classList.add("nowPlayingPageImagePoster"); - context.querySelector(".nowPlayingPageImage").classList.remove("nowPlayingPageImageAudio"); + context.querySelector('.nowPlayingPageImageContainer').classList.add('nowPlayingPageImagePoster'); + context.querySelector('.nowPlayingPageImage').classList.remove('nowPlayingPageImageAudio'); } } else { - imgContainer.innerHTML = '
'; + imgContainer.innerHTML = '
'; } } function buttonVisible(btn, enabled) { if (enabled) { - btn.classList.remove("hide"); + btn.classList.remove('hide'); } else { - btn.classList.add("hide"); + btn.classList.add('hide'); } } function updateSupportedCommands(context, commands) { - var all = context.querySelectorAll(".btnCommand"); + var all = context.querySelectorAll('.btnCommand'); for (var i = 0, length = all.length; i < length; i++) { - var enableButton = -1 !== commands.indexOf(all[i].getAttribute("data-command")); + var enableButton = -1 !== commands.indexOf(all[i].getAttribute('data-command')); all[i].disabled = !enableButton; } } @@ -222,16 +222,16 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function toggleRepeat(player) { if (player) { switch (playbackManager.getRepeatMode(player)) { - case "RepeatNone": - playbackManager.setRepeatMode("RepeatAll", player); + case 'RepeatNone': + playbackManager.setRepeatMode('RepeatAll', player); break; - case "RepeatAll": - playbackManager.setRepeatMode("RepeatOne", player); + case 'RepeatAll': + playbackManager.setRepeatMode('RepeatOne', player); break; - case "RepeatOne": - playbackManager.setRepeatMode("RepeatNone", player); + case 'RepeatOne': + playbackManager.setRepeatMode('RepeatNone', player); } } } @@ -243,41 +243,41 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL var supportedCommands = playerInfo.supportedCommands; currentPlayerSupportedCommands = supportedCommands; var playState = state.PlayState || {}; - var isSupportedCommands = supportedCommands.includes("DisplayMessage") || supportedCommands.includes("SendString") || supportedCommands.includes("Select"); - buttonVisible(context.querySelector(".btnToggleFullscreen"), item && "Video" == item.MediaType && supportedCommands.includes("ToggleFullscreen")); + var isSupportedCommands = supportedCommands.includes('DisplayMessage') || supportedCommands.includes('SendString') || supportedCommands.includes('Select'); + buttonVisible(context.querySelector('.btnToggleFullscreen'), item && 'Video' == item.MediaType && supportedCommands.includes('ToggleFullscreen')); updateAudioTracksDisplay(player, context); updateSubtitleTracksDisplay(player, context); - if (supportedCommands.includes("DisplayMessage") && !currentPlayer.isLocalPlayer) { - context.querySelector(".sendMessageSection").classList.remove("hide"); + if (supportedCommands.includes('DisplayMessage') && !currentPlayer.isLocalPlayer) { + context.querySelector('.sendMessageSection').classList.remove('hide'); } else { - context.querySelector(".sendMessageSection").classList.add("hide"); + context.querySelector('.sendMessageSection').classList.add('hide'); } - if (supportedCommands.includes("SendString") && !currentPlayer.isLocalPlayer) { - context.querySelector(".sendTextSection").classList.remove("hide"); + if (supportedCommands.includes('SendString') && !currentPlayer.isLocalPlayer) { + context.querySelector('.sendTextSection').classList.remove('hide'); } else { - context.querySelector(".sendTextSection").classList.add("hide"); + context.querySelector('.sendTextSection').classList.add('hide'); } - if (supportedCommands.includes("Select") && !currentPlayer.isLocalPlayer) { - context.querySelector(".navigationSection").classList.remove("hide"); + if (supportedCommands.includes('Select') && !currentPlayer.isLocalPlayer) { + context.querySelector('.navigationSection').classList.remove('hide'); } else { - context.querySelector(".navigationSection").classList.add("hide"); + context.querySelector('.navigationSection').classList.add('hide'); } if (isSupportedCommands && !currentPlayer.isLocalPlayer) { - context.querySelector(".remoteControlSection").classList.remove("hide"); + context.querySelector('.remoteControlSection').classList.remove('hide'); } else { - context.querySelector(".remoteControlSection").classList.add("hide"); + context.querySelector('.remoteControlSection').classList.add('hide'); } - buttonVisible(context.querySelector(".btnStop"), null != item); - buttonVisible(context.querySelector(".btnNextTrack"), null != item); - buttonVisible(context.querySelector(".btnPreviousTrack"), null != item); - buttonVisible(context.querySelector(".btnRewind"), null != item); - buttonVisible(context.querySelector(".btnFastForward"), null != item); - var positionSlider = context.querySelector(".nowPlayingPositionSlider"); + buttonVisible(context.querySelector('.btnStop'), null != item); + buttonVisible(context.querySelector('.btnNextTrack'), null != item); + buttonVisible(context.querySelector('.btnPreviousTrack'), null != item); + buttonVisible(context.querySelector('.btnRewind'), null != item); + buttonVisible(context.querySelector('.btnFastForward'), null != item); + var positionSlider = context.querySelector('.nowPlayingPositionSlider'); if (positionSlider && item && item.RunTimeTicks) { positionSlider.setKeyboardSteps(userSettings.skipBackLength() * 1000000 / item.RunTimeTicks, @@ -294,10 +294,10 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL updateTimeDisplay(playState.PositionTicks, item ? item.RunTimeTicks : null); updatePlayerVolumeState(context, playState.IsMuted, playState.VolumeLevel); - if (item && "Video" == item.MediaType) { - context.classList.remove("hideVideoButtons"); + if (item && 'Video' == item.MediaType) { + context.classList.remove('hideVideoButtons'); } else { - context.classList.add("hideVideoButtons"); + context.classList.add('hideVideoButtons'); } updateRepeatModeDisplay(playState.RepeatMode); @@ -306,27 +306,27 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function updateAudioTracksDisplay(player, context) { var supportedCommands = currentPlayerSupportedCommands; - buttonVisible(context.querySelector(".btnAudioTracks"), playbackManager.audioTracks(player).length > 1 && -1 != supportedCommands.indexOf("SetAudioStreamIndex")); + buttonVisible(context.querySelector('.btnAudioTracks'), playbackManager.audioTracks(player).length > 1 && -1 != supportedCommands.indexOf('SetAudioStreamIndex')); } function updateSubtitleTracksDisplay(player, context) { var supportedCommands = currentPlayerSupportedCommands; - buttonVisible(context.querySelector(".btnSubtitles"), playbackManager.subtitleTracks(player).length && -1 != supportedCommands.indexOf("SetSubtitleStreamIndex")); + buttonVisible(context.querySelector('.btnSubtitles'), playbackManager.subtitleTracks(player).length && -1 != supportedCommands.indexOf('SetSubtitleStreamIndex')); } function updateRepeatModeDisplay(repeatMode) { var context = dlg; - var toggleRepeatButton = context.querySelector(".repeatToggleButton"); + var toggleRepeatButton = context.querySelector('.repeatToggleButton'); - if ("RepeatAll" == repeatMode) { - toggleRepeatButton.innerHTML = "repeat"; - toggleRepeatButton.classList.add("repeatButton-active"); - } else if ("RepeatOne" == repeatMode) { - toggleRepeatButton.innerHTML = ""; - toggleRepeatButton.classList.add("repeatButton-active"); + if ('RepeatAll' == repeatMode) { + toggleRepeatButton.innerHTML = ""; + toggleRepeatButton.classList.add('repeatButton-active'); + } else if ('RepeatOne' == repeatMode) { + toggleRepeatButton.innerHTML = ""; + toggleRepeatButton.classList.add('repeatButton-active'); } else { - toggleRepeatButton.innerHTML = "repeat"; - toggleRepeatButton.classList.remove("repeatButton-active"); + toggleRepeatButton.innerHTML = ""; + toggleRepeatButton.classList.remove('repeatButton-active'); } } @@ -336,41 +336,46 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL var showMuteButton = true; var showVolumeSlider = true; - if (-1 === supportedCommands.indexOf("Mute")) { + if (-1 === supportedCommands.indexOf('Mute')) { showMuteButton = false; } - if (-1 === supportedCommands.indexOf("SetVolume")) { + if (-1 === supportedCommands.indexOf('SetVolume')) { showVolumeSlider = false; } - if (currentPlayer.isLocalPlayer && appHost.supports("physicalvolumecontrol")) { + if (currentPlayer.isLocalPlayer && appHost.supports('physicalvolumecontrol')) { showMuteButton = false; showVolumeSlider = false; } + const buttonMute = view.querySelector('.buttonMute'); + const buttonMuteIcon = buttonMute.querySelector('.material-icons'); + + buttonMuteIcon.classList.remove('volume_off', 'volume_up'); + if (isMuted) { - view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Unmute")); - view.querySelector(".buttonMute i").innerHTML = ""; + buttonMute.setAttribute('title', globalize.translate('Unmute')); + buttonMuteIcon.classList.add('volume_off'); } else { - view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Mute")); - view.querySelector(".buttonMute i").innerHTML = ""; + buttonMute.setAttribute('title', globalize.translate('Mute')); + buttonMuteIcon.classList.add('volume_up'); } if (showMuteButton) { - view.querySelector(".buttonMute").classList.remove("hide"); + buttonMute.classList.remove('hide'); } else { - view.querySelector(".buttonMute").classList.add("hide"); + buttonMute.classList.add('hide'); } - var nowPlayingVolumeSlider = context.querySelector(".nowPlayingVolumeSlider"); - var nowPlayingVolumeSliderContainer = context.querySelector(".nowPlayingVolumeSliderContainer"); + var nowPlayingVolumeSlider = context.querySelector('.nowPlayingVolumeSlider'); + var nowPlayingVolumeSliderContainer = context.querySelector('.nowPlayingVolumeSliderContainer'); if (nowPlayingVolumeSlider) { if (showVolumeSlider) { - nowPlayingVolumeSliderContainer.classList.remove("hide"); + nowPlayingVolumeSliderContainer.classList.remove('hide'); } else { - nowPlayingVolumeSliderContainer.classList.add("hide"); + nowPlayingVolumeSliderContainer.classList.add('hide'); } if (!nowPlayingVolumeSlider.dragging) { @@ -381,14 +386,18 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function updatePlayPauseState(isPaused, isActive) { var context = dlg; - var btnPlayPause = context.querySelector(".btnPlayPause"); - btnPlayPause.querySelector("i").innerHTML = isPaused ? "" : ""; + var btnPlayPause = context.querySelector('.btnPlayPause'); + const btnPlayPauseIcon = btnPlayPause.querySelector('.material-icons'); + + btnPlayPauseIcon.classList.remove('play_circle_filled', 'pause_circle_filled'); + btnPlayPauseIcon.classList.add(isPaused ? 'play_circle_filled' : 'pause_circle_filled'); + buttonVisible(btnPlayPause, isActive); } function updateTimeDisplay(positionTicks, runtimeTicks) { var context = dlg; - var positionSlider = context.querySelector(".nowPlayingPositionSlider"); + var positionSlider = context.querySelector('.nowPlayingPositionSlider'); if (positionSlider && !positionSlider.dragging) { if (runtimeTicks) { @@ -400,8 +409,8 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } } - context.querySelector(".positionTime").innerHTML = null == positionTicks ? "--:--" : datetime.getDisplayRunningTime(positionTicks); - context.querySelector(".runtime").innerHTML = null != runtimeTicks ? datetime.getDisplayRunningTime(runtimeTicks) : "--:--"; + context.querySelector('.positionTime').innerHTML = null == positionTicks ? '--:--' : datetime.getDisplayRunningTime(positionTicks); + context.querySelector('.runtime').innerHTML = null != runtimeTicks ? datetime.getDisplayRunningTime(runtimeTicks) : '--:--'; } function getPlaylistItems(player) { @@ -410,27 +419,27 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function loadPlaylist(context, player) { getPlaylistItems(player).then(function (items) { - var html = ""; + var html = ''; html += listView.getListViewHtml({ items: items, smallIcon: true, - action: "setplaylistindex", + action: 'setplaylistindex', enableUserDataButtons: false, rightButtons: [{ - icon: "", - title: globalize.translate("ButtonRemove"), - id: "remove" + icon: 'remove_circle_outline', + title: globalize.translate('ButtonRemove'), + id: 'remove' }], dragHandle: true }); if (items.length) { - context.querySelector(".btnTogglePlaylist").classList.remove("hide"); + context.querySelector('.btnTogglePlaylist').classList.remove('hide'); } else { - context.querySelector(".btnTogglePlaylist").classList.add("hide"); + context.querySelector('.btnTogglePlaylist').classList.add('hide'); } - var itemsContainer = context.querySelector(".playlist"); + var itemsContainer = context.querySelector('.playlist'); itemsContainer.innerHTML = html; var playlistItemId = playbackManager.getCurrentPlaylistItemId(player); @@ -438,20 +447,20 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL var img = itemsContainer.querySelector('.listItem[data-playlistItemId="' + playlistItemId + '"] .listItemImage'); if (img) { - img.classList.remove("lazy"); - img.classList.add("playlistIndexIndicatorImage"); + img.classList.remove('lazy'); + img.classList.add('playlistIndexIndicatorImage'); } } imageLoader.lazyChildren(itemsContainer); - context.querySelector(".playlist").classList.add("hide"); - context.querySelector(".contextMenu").classList.add("hide"); - context.querySelector(".btnSavePlaylist").classList.add("hide"); + context.querySelector('.playlist').classList.add('hide'); + context.querySelector('.contextMenu').classList.add('hide'); + context.querySelector('.btnSavePlaylist').classList.add('hide'); }); } function onPlaybackStart(e, state) { - console.debug("remotecontrol event: " + e.type); + console.debug('remotecontrol event: ' + e.type); var player = this; onStateChanged.call(player, e, state); } @@ -479,7 +488,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } function onPlaybackStopped(e, state) { - console.debug("remotecontrol event: " + e.type); + console.debug('remotecontrol event: ' + e.type); var player = this; if (!state.NextMediaType) { @@ -519,16 +528,16 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL var player = currentPlayer; if (player) { - events.off(player, "playbackstart", onPlaybackStart); - events.off(player, "statechange", onStateChanged); - events.off(player, "repeatmodechange", onRepeatModeChange); - events.off(player, "playlistitemremove", onPlaylistUpdate); - events.off(player, "playlistitemmove", onPlaylistUpdate); - events.off(player, "playbackstop", onPlaybackStopped); - events.off(player, "volumechange", onVolumeChanged); - events.off(player, "pause", onPlayPauseStateChanged); - events.off(player, "unpause", onPlayPauseStateChanged); - events.off(player, "timeupdate", onTimeUpdate); + events.off(player, 'playbackstart', onPlaybackStart); + events.off(player, 'statechange', onStateChanged); + events.off(player, 'repeatmodechange', onRepeatModeChange); + events.off(player, 'playlistitemremove', onPlaylistUpdate); + events.off(player, 'playlistitemmove', onPlaylistUpdate); + events.off(player, 'playbackstop', onPlaybackStopped); + events.off(player, 'volumechange', onVolumeChanged); + events.off(player, 'pause', onPlayPauseStateChanged); + events.off(player, 'unpause', onPlayPauseStateChanged); + events.off(player, 'timeupdate', onTimeUpdate); currentPlayer = null; } } @@ -537,18 +546,18 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL if (releaseCurrentPlayer(), currentPlayer = player, player) { var state = playbackManager.getPlayerState(player); onStateChanged.call(player, { - type: "init" + type: 'init' }, state); - events.on(player, "playbackstart", onPlaybackStart); - events.on(player, "statechange", onStateChanged); - events.on(player, "repeatmodechange", onRepeatModeChange); - events.on(player, "playlistitemremove", onPlaylistItemRemoved); - events.on(player, "playlistitemmove", onPlaylistUpdate); - events.on(player, "playbackstop", onPlaybackStopped); - events.on(player, "volumechange", onVolumeChanged); - events.on(player, "pause", onPlayPauseStateChanged); - events.on(player, "unpause", onPlayPauseStateChanged); - events.on(player, "timeupdate", onTimeUpdate); + events.on(player, 'playbackstart', onPlaybackStart); + events.on(player, 'statechange', onStateChanged); + events.on(player, 'repeatmodechange', onRepeatModeChange); + events.on(player, 'playlistitemremove', onPlaylistItemRemoved); + events.on(player, 'playlistitemmove', onPlaylistUpdate); + events.on(player, 'playbackstop', onPlaybackStopped); + events.on(player, 'volumechange', onVolumeChanged); + events.on(player, 'pause', onPlayPauseStateChanged); + events.on(player, 'unpause', onPlayPauseStateChanged); + events.on(player, 'timeupdate', onTimeUpdate); var playerInfo = playbackManager.getPlayerInfo(); var supportedCommands = playerInfo.supportedCommands; currentPlayerSupportedCommands = supportedCommands; @@ -558,11 +567,11 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function onBtnCommandClick() { if (currentPlayer) { - if (this.classList.contains("repeatToggleButton")) { + if (this.classList.contains('repeatToggleButton')) { toggleRepeat(currentPlayer); } else { playbackManager.sendCommand({ - Name: this.getAttribute("data-command") + Name: this.getAttribute('data-command') }, currentPlayer); } } @@ -577,7 +586,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } function savePlaylist() { - require(["playlistEditor"], function (playlistEditor) { + require(['playlistEditor'], function (playlistEditor) { getSaveablePlaylistItems().then(function (items) { var serverId = items.length ? items[0].ServerId : ApiClient.serverId(); new playlistEditor().show({ @@ -586,67 +595,67 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL }), serverId: serverId, enableAddToPlayQueue: false, - defaultValue: "new" + defaultValue: 'new' }); }); }); } function bindEvents(context) { - var btnCommand = context.querySelectorAll(".btnCommand"); + var btnCommand = context.querySelectorAll('.btnCommand'); for (var i = 0, length = btnCommand.length; i < length; i++) { - btnCommand[i].addEventListener("click", onBtnCommandClick); + btnCommand[i].addEventListener('click', onBtnCommandClick); } - context.querySelector(".btnToggleFullscreen").addEventListener("click", function (e) { + context.querySelector('.btnToggleFullscreen').addEventListener('click', function (e) { if (currentPlayer) { playbackManager.sendCommand({ - Name: e.target.getAttribute("data-command") + Name: e.target.getAttribute('data-command') }, currentPlayer); } }); - context.querySelector(".btnAudioTracks").addEventListener("click", function (e) { + context.querySelector('.btnAudioTracks').addEventListener('click', function (e) { if (currentPlayer && lastPlayerState && lastPlayerState.NowPlayingItem) { showAudioMenu(context, currentPlayer, e.target, lastPlayerState.NowPlayingItem); } }); - context.querySelector(".btnSubtitles").addEventListener("click", function (e) { + context.querySelector('.btnSubtitles').addEventListener('click', function (e) { if (currentPlayer && lastPlayerState && lastPlayerState.NowPlayingItem) { showSubtitleMenu(context, currentPlayer, e.target, lastPlayerState.NowPlayingItem); } }); - context.querySelector(".btnStop").addEventListener("click", function () { + context.querySelector('.btnStop').addEventListener('click', function () { if (currentPlayer) { playbackManager.stop(currentPlayer); } }); - context.querySelector(".btnPlayPause").addEventListener("click", function () { + context.querySelector('.btnPlayPause').addEventListener('click', function () { if (currentPlayer) { playbackManager.playPause(currentPlayer); } }); - context.querySelector(".btnNextTrack").addEventListener("click", function () { + context.querySelector('.btnNextTrack').addEventListener('click', function () { if (currentPlayer) { playbackManager.nextTrack(currentPlayer); } }); - context.querySelector(".btnRewind").addEventListener("click", function () { + context.querySelector('.btnRewind').addEventListener('click', function () { if (currentPlayer) { playbackManager.rewind(currentPlayer); } }); - context.querySelector(".btnFastForward").addEventListener("click", function () { + context.querySelector('.btnFastForward').addEventListener('click', function () { if (currentPlayer) { playbackManager.fastForward(currentPlayer); } }); - context.querySelector(".btnPreviousTrack").addEventListener("click", function () { + context.querySelector('.btnPreviousTrack').addEventListener('click', function () { if (currentPlayer) { playbackManager.previousTrack(currentPlayer); } }); - context.querySelector(".nowPlayingPositionSlider").addEventListener("change", function () { + context.querySelector('.nowPlayingPositionSlider').addEventListener('change', function () { var value = this.value; if (currentPlayer) { @@ -655,11 +664,11 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } }); - context.querySelector(".nowPlayingPositionSlider").getBubbleText = function (value) { + context.querySelector('.nowPlayingPositionSlider').getBubbleText = function (value) { var state = lastPlayerState; if (!state || !state.NowPlayingItem || !currentRuntimeTicks) { - return "--:--"; + return '--:--'; } var ticks = currentRuntimeTicks; @@ -672,41 +681,41 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL playbackManager.setVolume(this.value, currentPlayer); } - context.querySelector(".nowPlayingVolumeSlider").addEventListener("change", setVolume); - context.querySelector(".nowPlayingVolumeSlider").addEventListener("mousemove", setVolume); - context.querySelector(".nowPlayingVolumeSlider").addEventListener("touchmove", setVolume); - context.querySelector(".buttonMute").addEventListener("click", function () { + context.querySelector('.nowPlayingVolumeSlider').addEventListener('change', setVolume); + context.querySelector('.nowPlayingVolumeSlider').addEventListener('mousemove', setVolume); + context.querySelector('.nowPlayingVolumeSlider').addEventListener('touchmove', setVolume); + context.querySelector('.buttonMute').addEventListener('click', function () { playbackManager.toggleMute(currentPlayer); }); - var playlistContainer = context.querySelector(".playlist"); - playlistContainer.addEventListener("action-remove", function (e) { + var playlistContainer = context.querySelector('.playlist'); + playlistContainer.addEventListener('action-remove', function (e) { playbackManager.removeFromPlaylist([e.detail.playlistItemId], currentPlayer); }); - playlistContainer.addEventListener("itemdrop", function (e) { + playlistContainer.addEventListener('itemdrop', function (e) { var newIndex = e.detail.newIndex; var playlistItemId = e.detail.playlistItemId; playbackManager.movePlaylistItem(playlistItemId, newIndex, currentPlayer); }); - context.querySelector(".btnSavePlaylist").addEventListener("click", savePlaylist); - context.querySelector(".btnTogglePlaylist").addEventListener("click", function () { - if (context.querySelector(".playlist").classList.contains("hide")) { - context.querySelector(".playlist").classList.remove("hide"); - context.querySelector(".btnSavePlaylist").classList.remove("hide"); - context.querySelector(".contextMenu").classList.add("hide"); - context.querySelector(".volumecontrol").classList.add("hide"); + context.querySelector('.btnSavePlaylist').addEventListener('click', savePlaylist); + context.querySelector('.btnTogglePlaylist').addEventListener('click', function () { + if (context.querySelector('.playlist').classList.contains('hide')) { + context.querySelector('.playlist').classList.remove('hide'); + context.querySelector('.btnSavePlaylist').classList.remove('hide'); + context.querySelector('.contextMenu').classList.add('hide'); + context.querySelector('.volumecontrol').classList.add('hide'); } else { - context.querySelector(".playlist").classList.add("hide"); - context.querySelector(".btnSavePlaylist").classList.add("hide"); - context.querySelector(".volumecontrol").classList.remove("hide"); + context.querySelector('.playlist').classList.add('hide'); + context.querySelector('.btnSavePlaylist').classList.add('hide'); + context.querySelector('.volumecontrol').classList.remove('hide'); } }); - context.querySelector(".btnToggleContextMenu").addEventListener("click", function () { - if (context.querySelector(".contextMenu").classList.contains("hide")) { - context.querySelector(".contextMenu").classList.remove("hide"); - context.querySelector(".btnSavePlaylist").classList.add("hide"); - context.querySelector(".playlist").classList.add("hide"); + context.querySelector('.btnToggleContextMenu').addEventListener('click', function () { + if (context.querySelector('.contextMenu').classList.contains('hide')) { + context.querySelector('.contextMenu').classList.remove('hide'); + context.querySelector('.btnSavePlaylist').classList.add('hide'); + context.querySelector('.playlist').classList.add('hide'); } else { - context.querySelector(".contextMenu").classList.add("hide"); + context.querySelector('.contextMenu').classList.add('hide'); } }); } @@ -718,16 +727,16 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function onMessageSubmit(e) { var form = e.target; playbackManager.sendCommand({ - Name: "DisplayMessage", + Name: 'DisplayMessage', Arguments: { - Header: form.querySelector("#txtMessageTitle").value, - Text: form.querySelector("#txtMessageText", form).value + Header: form.querySelector('#txtMessageTitle').value, + Text: form.querySelector('#txtMessageText', form).value } }, currentPlayer); - form.querySelector("input").value = ""; + form.querySelector('input').value = ''; - require(["toast"], function (toast) { - toast("Message sent."); + require(['toast'], function (toast) { + toast('Message sent.'); }); e.preventDefault(); @@ -738,15 +747,15 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL function onSendStringSubmit(e) { var form = e.target; playbackManager.sendCommand({ - Name: "SendString", + Name: 'SendString', Arguments: { - String: form.querySelector("#txtTypeText", form).value + String: form.querySelector('#txtTypeText', form).value } }, currentPlayer); - form.querySelector("input").value = ""; + form.querySelector('input').value = ''; - require(["toast"], function (toast) { - toast("Text sent."); + require(['toast'], function (toast) { + toast('Text sent.'); }); e.preventDefault(); @@ -755,9 +764,9 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } function init(ownerView, context) { - let contextmenuHtml = ``; + let contextmenuHtml = ``; let volumecontrolHtml = '
'; - volumecontrolHtml += ``; + volumecontrolHtml += ``; volumecontrolHtml += '
'; volumecontrolHtml += '
'; if (!layoutManager.mobile) { @@ -768,20 +777,20 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } bindEvents(context); - context.querySelector(".sendMessageForm").addEventListener("submit", onMessageSubmit); - context.querySelector(".typeTextForm").addEventListener("submit", onSendStringSubmit); - events.on(playbackManager, "playerchange", onPlayerChange); + context.querySelector('.sendMessageForm').addEventListener('submit', onMessageSubmit); + context.querySelector('.typeTextForm').addEventListener('submit', onSendStringSubmit); + events.on(playbackManager, 'playerchange', onPlayerChange); if (layoutManager.tv) { - var positionSlider = context.querySelector(".nowPlayingPositionSlider"); - positionSlider.classList.add("focusable"); + var positionSlider = context.querySelector('.nowPlayingPositionSlider'); + positionSlider.classList.add('focusable'); positionSlider.enableKeyboardDragging(); } } function onDialogClosed(e) { releaseCurrentPlayer(); - events.off(playbackManager, "playerchange", onPlayerChange); + events.off(playbackManager, 'playerchange', onPlayerChange); lastPlayerState = null; } diff --git a/src/components/sanitizefilename.js b/src/components/sanitizefilename.js index adfb852e1..de7b1a078 100644 --- a/src/components/sanitizefilename.js +++ b/src/components/sanitizefilename.js @@ -16,8 +16,8 @@ function isLowSurrogate(codePoint) { } function getByteLength(string) { - if (typeof string !== "string") { - throw new Error("Input must be string"); + if (typeof string !== 'string') { + throw new Error('Input must be string'); } const charLength = string.length; @@ -49,8 +49,8 @@ function getByteLength(string) { } function truncate(string, byteLength) { - if (typeof string !== "string") { - throw new Error("Input must be string"); + if (typeof string !== 'string') { + throw new Error('Input must be string'); } const charLength = string.length; diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 6a626cd25..f7bd41ff8 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -5,9 +5,9 @@ * @module components/scrollManager */ -import dom from "dom"; -import browser from "browser"; -import layoutManager from "layoutManager"; +import dom from 'dom'; +import browser from 'browser'; +import layoutManager from 'layoutManager'; /** * Scroll time in ms. @@ -27,20 +27,20 @@ import layoutManager from "layoutManager"; * @return {number} Minimum vertical scroll. */ function minimumScrollY() { - const topMenu = document.querySelector(".headerTop"); + const topMenu = document.querySelector('.headerTop'); if (topMenu) { return topMenu.clientHeight; } return 0; } - const supportsSmoothScroll = "scrollBehavior" in document.documentElement.style; + const supportsSmoothScroll = 'scrollBehavior' in document.documentElement.style; let supportsScrollToOptions = false; try { - const elem = document.createElement("div"); + const elem = document.createElement('div'); - const opts = Object.defineProperty({}, "behavior", { + const opts = Object.defineProperty({}, 'behavior', { // eslint-disable-next-line getter-return get: function () { supportsScrollToOptions = true; @@ -49,7 +49,7 @@ import layoutManager from "layoutManager"; elem.scrollTo(opts); } catch (e) { - console.error("error checking ScrollToOptions support"); + console.error('error checking ScrollToOptions support'); } /** @@ -210,21 +210,21 @@ import layoutManager from "layoutManager"; */ function getScrollableParent(element, vertical) { if (element) { - let nameScroll = "scrollWidth"; - let nameClient = "clientWidth"; - let nameClass = "scrollX"; + let nameScroll = 'scrollWidth'; + let nameClient = 'clientWidth'; + let nameClass = 'scrollX'; if (vertical) { - nameScroll = "scrollHeight"; - nameClient = "clientHeight"; - nameClass = "scrollY"; + nameScroll = 'scrollHeight'; + nameClient = 'clientHeight'; + nameClass = 'scrollY'; } let parent = element.parentElement; while (parent) { // Skip 'emby-scroller' because it scrolls by itself - if (!parent.classList.contains("emby-scroller") && + if (!parent.classList.contains('emby-scroller') && parent[nameScroll] > parent[nameClient] && parent.classList.contains(nameClass)) { return parent; } @@ -316,7 +316,7 @@ import layoutManager from "layoutManager"; * @param {ScrollToOptions} options - Scroll options. */ function scrollToHelper(scroller, options) { - if ("scrollTo" in scroller) { + if ('scrollTo' in scroller) { if (!supportsScrollToOptions) { const scrollX = (options.left !== undefined ? options.left : scroller.scrollLeft); const scrollY = (options.top !== undefined ? options.top : scroller.scrollTop); @@ -324,7 +324,7 @@ import layoutManager from "layoutManager"; } else { scroller.scrollTo(options); } - } else if ("scrollLeft" in scroller) { + } else if ('scrollLeft' in scroller) { if (options.left !== undefined) { scroller.scrollLeft = options.left; } @@ -344,7 +344,7 @@ import layoutManager from "layoutManager"; * @param {boolean} smooth - Smooth scrolling. */ function builtinScroll(xScroller, scrollX, yScroller, scrollY, smooth) { - const scrollBehavior = smooth ? "smooth" : "instant"; + const scrollBehavior = smooth ? 'smooth' : 'instant'; if (xScroller !== yScroller) { scrollToHelper(xScroller, {left: scrollX, behavior: scrollBehavior}); @@ -500,7 +500,7 @@ import layoutManager from "layoutManager"; const offsetParent = element.offsetParent; // In Firefox offsetParent.offsetParent is BODY - const isFixed = offsetParent && (!offsetParent.offsetParent || window.getComputedStyle(offsetParent).position === "fixed"); + const isFixed = offsetParent && (!offsetParent.offsetParent || window.getComputedStyle(offsetParent).position === 'fixed'); // Scroll fixed elements to nearest edge (or do not scroll at all) if (isFixed) { @@ -537,7 +537,7 @@ import layoutManager from "layoutManager"; } if (isEnabled()) { - dom.addEventListener(window, "focusin", function(e) { + dom.addEventListener(window, 'focusin', function(e) { setTimeout(function() { scrollToElement(e.target, useSmoothScroll()); }, 0); diff --git a/src/components/search/searchfields.template.html b/src/components/search/searchfields.template.html index c1e9c6434..7da5e240c 100644 --- a/src/components/search/searchfields.template.html +++ b/src/components/search/searchfields.template.html @@ -1,5 +1,5 @@
- search +
diff --git a/src/components/search/searchresults.js b/src/components/search/searchresults.js index 02f1feefe..d4de2349a 100644 --- a/src/components/search/searchresults.js +++ b/src/components/search/searchresults.js @@ -5,8 +5,8 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', var options = { - SortBy: "IsFavoriteOrLiked,Random", - IncludeItemTypes: "Movie,Series,MusicArtist", + SortBy: 'IsFavoriteOrLiked,Random', + IncludeItemTypes: 'Movie,Series,MusicArtist', Limit: 20, Recursive: true, ImageTypeLimit: 0, @@ -165,7 +165,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "LiveTvProgram", + IncludeItemTypes: 'LiveTvProgram', IsMovie: true, IsKids: false, IsNews: false @@ -194,7 +194,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "Movie" + IncludeItemTypes: 'Movie' }, context, '.movieResults', { @@ -212,7 +212,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "Series" + IncludeItemTypes: 'Series' }, context, '.seriesResults', { @@ -231,7 +231,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "LiveTvProgram", + IncludeItemTypes: 'LiveTvProgram', IsSeries: true, IsSports: false, IsKids: false, @@ -262,7 +262,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "Episode" + IncludeItemTypes: 'Episode' }, context, '.episodeResults', { @@ -363,7 +363,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "LiveTvProgram", + IncludeItemTypes: 'LiveTvProgram', IsMovie: instance.options.collectionType === 'livetv' ? false : null, IsSeries: instance.options.collectionType === 'livetv' ? false : null, IsSports: instance.options.collectionType === 'livetv' ? false : null, @@ -394,8 +394,8 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - MediaTypes: "Video", - ExcludeItemTypes: "Movie,Episode" + MediaTypes: 'Video', + ExcludeItemTypes: 'Movie,Episode' }, context, '.videoResults', { @@ -439,7 +439,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "MusicAlbum" + IncludeItemTypes: 'MusicAlbum' }, context, '.albumResults', { @@ -456,7 +456,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "Audio" + IncludeItemTypes: 'Audio' }, context, '.songResults', { @@ -475,7 +475,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - MediaTypes: "Photo" + MediaTypes: 'Photo' }, context, '.photoResults', { @@ -492,7 +492,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "PhotoAlbum" + IncludeItemTypes: 'PhotoAlbum' }, context, '.photoAlbumResults', { @@ -508,7 +508,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "Book" + IncludeItemTypes: 'Book' }, context, '.bookResults', { @@ -525,7 +525,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "AudioBook" + IncludeItemTypes: 'AudioBook' }, context, '.audioBookResults', { @@ -541,7 +541,7 @@ define(['layoutManager', 'globalize', 'require', 'events', 'connectionManager', IncludeGenres: false, IncludeStudios: false, IncludeArtists: false, - IncludeItemTypes: "Playlist" + IncludeItemTypes: 'Playlist' }, context, '.playlistResults', { diff --git a/src/components/serverNotifications.js b/src/components/serverNotifications.js index 555492527..e60f98475 100644 --- a/src/components/serverNotifications.js +++ b/src/components/serverNotifications.js @@ -142,12 +142,12 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus function onMessageReceived(e, msg) { var apiClient = this; - if (msg.MessageType === "Play") { + if (msg.MessageType === 'Play') { notifyApp(); var serverId = apiClient.serverInfo().Id; - if (msg.Data.PlayCommand === "PlayNext") { + if (msg.Data.PlayCommand === 'PlayNext') { playbackManager.queueNext({ ids: msg.Data.ItemIds, serverId: serverId }); - } else if (msg.Data.PlayCommand === "PlayLast") { + } else if (msg.Data.PlayCommand === 'PlayLast') { playbackManager.queue({ ids: msg.Data.ItemIds, serverId: serverId }); } else { playbackManager.play({ @@ -160,7 +160,7 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus serverId: serverId }); } - } else if (msg.MessageType === "Playstate") { + } else if (msg.MessageType === 'Playstate') { if (msg.Data.Command === 'Stop') { inputManager.trigger('stop'); } else if (msg.Data.Command === 'Pause') { @@ -178,10 +178,10 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus } else { notifyApp(); } - } else if (msg.MessageType === "GeneralCommand") { + } else if (msg.MessageType === 'GeneralCommand') { var cmd = msg.Data; processGeneralCommand(cmd, apiClient); - } else if (msg.MessageType === "UserDataChanged") { + } else if (msg.MessageType === 'UserDataChanged') { if (msg.Data.UserId === apiClient.getCurrentUserId()) { for (var i = 0, length = msg.Data.UserDataList.length; i < length; i++) { events.trigger(serverNotifications, 'UserDataChanged', [apiClient, msg.Data.UserDataList[i]]); @@ -192,8 +192,8 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus } } function bindEvents(apiClient) { - events.off(apiClient, "message", onMessageReceived); - events.on(apiClient, "message", onMessageReceived); + events.off(apiClient, 'message', onMessageReceived); + events.on(apiClient, 'message', onMessageReceived); } connectionManager.getApiClients().forEach(bindEvents); diff --git a/src/components/serverRestartDialog.js b/src/components/serverRestartDialog.js index ef012fe44..4c52d5f01 100644 --- a/src/components/serverRestartDialog.js +++ b/src/components/serverRestartDialog.js @@ -12,7 +12,7 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp } // Don't use apiclient method because we don't want it reporting authentication under the old version - apiClient.getJSON(apiClient.getUrl("System/Info")).then(function (info) { + apiClient.getJSON(apiClient.getUrl('System/Info')).then(function (info) { // If this is back to false, the restart completed if (!info.IsShuttingDown) { diff --git a/src/components/serviceworker/notifications.js b/src/components/serviceworker/notifications.js index 33f54bb64..5f96d01a4 100644 --- a/src/components/serviceworker/notifications.js +++ b/src/components/serviceworker/notifications.js @@ -20,7 +20,7 @@ case 'restart': return apiClient.restartServer(); default: - clients.openWindow("/"); + clients.openWindow('/'); return Promise.resolve(); } }); @@ -35,7 +35,7 @@ var action = event.action; if (!action) { - clients.openWindow("/"); + clients.openWindow('/'); event.waitUntil(Promise.resolve()); return; } diff --git a/src/components/sessionplayer.js b/src/components/sessionplayer.js index bbb22a965..489b57493 100644 --- a/src/components/sessionplayer.js +++ b/src/components/sessionplayer.js @@ -79,7 +79,7 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] instance.isUpdating = true; var apiClient = getCurrentApiClient(instance); - apiClient.sendMessage("SessionsStop"); + apiClient.sendMessage('SessionsStop'); if (instance.pollInterval) { clearInterval(instance.pollInterval); instance.pollInterval = null; @@ -158,7 +158,7 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] instance.isUpdating = true; var apiClient = getCurrentApiClient(instance); - apiClient.sendMessage("SessionsStart", "100,800"); + apiClient.sendMessage('SessionsStart', '100,800'); if (instance.pollInterval) { clearInterval(instance.pollInterval); instance.pollInterval = null; diff --git a/src/components/skinManager.js b/src/components/skinManager.js index d5b045c44..871b6d999 100644 --- a/src/components/skinManager.js +++ b/src/components/skinManager.js @@ -24,25 +24,25 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr function getThemes() { return [{ - name: "Apple TV", - id: "appletv" + name: 'Apple TV', + id: 'appletv' }, { - name: "Blue Radiance", - id: "blueradiance" + name: 'Blue Radiance', + id: 'blueradiance' }, { - name: "Dark", - id: "dark", + name: 'Dark', + id: 'dark', isDefault: true, isDefaultServerDashboard: true }, { - name: "Light", - id: "light" + name: 'Light', + id: 'light' }, { - name: "Purple Haze", - id: "purplehaze" + name: 'Purple Haze', + id: 'purplehaze' }, { - name: "Windows Media Center", - id: "wmc" + name: 'Windows Media Center', + id: 'wmc' }]; } @@ -91,7 +91,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr function onThemeLoaded() { document.documentElement.classList.remove('preload'); try { - var color = getComputedStyle(document.querySelector('.skinHeader')).getPropertyValue("background-color"); + var color = getComputedStyle(document.querySelector('.skinHeader')).getPropertyValue('background-color'); if (color) { appHost.setThemeColor(color); } diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 48ccee21c..4716135ce 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -14,7 +14,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f */ function getImageUrl(item, options, apiClient) { options = options || {}; - options.type = options.type || "Primary"; + options.type = options.type || 'Primary'; if (typeof (item) === 'string') { return apiClient.getScaledImageUrl(item, options); @@ -45,7 +45,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f */ function getBackdropImageUrl(item, options, apiClient) { options = options || {}; - options.type = options.type || "Backdrop"; + options.type = options.type || 'Backdrop'; // If not resizing, get the original image if (!options.maxWidth && !options.width && !options.maxHeight && !options.height) { @@ -66,17 +66,17 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f * @param {object} item - Item used to generate the image URL. * @returns {string} URL of the item's image. */ - function getImgUrl(item) { + function getImgUrl(item, user) { var apiClient = connectionManager.getApiClient(item.ServerId); var imageOptions = {}; if (item.BackdropImageTags && item.BackdropImageTags.length) { return getBackdropImageUrl(item, imageOptions, apiClient); } else { - if (item.MediaType === 'Photo') { + if (item.MediaType === 'Photo' && user && user.Policy.EnableContentDownloading) { return apiClient.getItemDownloadUrl(item.Id); } - imageOptions.type = "Primary"; + imageOptions.type = 'Primary'; return getImageUrl(item, imageOptions, apiClient); } } @@ -92,7 +92,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f function getIcon(icon, cssClass, canFocus, autoFocus) { var tabIndex = canFocus ? '' : ' tabindex="-1"'; autoFocus = autoFocus ? ' autofocus' : ''; - return ''; + return ''; } /** @@ -123,7 +123,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f var _osdOpen = false; // Use autoplay on Chromecast since it is non-interactive. - options.interactive = !browser.chromecast; + if (browser.chromecast) options.interactive = false; /** * Creates the HTML markup for the dialog and the OSD. @@ -155,7 +155,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f html += '
'; if (actionButtonsOnTop) { - if (appHost.supports('filedownload')) { + if (appHost.supports('filedownload') && options.user && options.user.Policy.EnableContentDownloading) { html += getIcon('file_download', 'btnDownload slideshowButton', true); } if (appHost.supports('sharing')) { @@ -169,7 +169,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f html += '
'; html += getIcon('play_arrow', 'btnSlideshowPause slideshowButton', true, true); - if (appHost.supports('filedownload')) { + if (appHost.supports('filedownload') && options.user && options.user.Policy.EnableContentDownloading) { html += getIcon('file_download', 'btnDownload slideshowButton', true); } if (appHost.supports('sharing')) { @@ -224,9 +224,9 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f * Handles OSD changes when the autoplay is started. */ function onAutoplayStart() { - var btnSlideshowPause = dialog.querySelector('.btnSlideshowPause i'); + var btnSlideshowPause = dialog.querySelector('.btnSlideshowPause .material-icons'); if (btnSlideshowPause) { - btnSlideshowPause.classList.replace("play_arrow", "pause"); + btnSlideshowPause.classList.replace('play_arrow', 'pause'); } } @@ -234,9 +234,9 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f * Handles OSD changes when the autoplay is stopped. */ function onAutoplayStop() { - var btnSlideshowPause = dialog.querySelector('.btnSlideshowPause i'); + var btnSlideshowPause = dialog.querySelector('.btnSlideshowPause .material-icons'); if (btnSlideshowPause) { - btnSlideshowPause.classList.replace("pause", "play_arrow"); + btnSlideshowPause.classList.replace('pause', 'play_arrow'); } } @@ -312,7 +312,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f */ function getSwiperSlideHtmlFromItem(item) { return getSwiperSlideHtmlFromSlide({ - originalImage: getImgUrl(item), + originalImage: getImgUrl(item, currentOptions.user), //title: item.Name, //description: item.Overview Id: item.Id, @@ -418,7 +418,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f * Toggles the autoplay feature of the Swiper instance. */ function playPause() { - var paused = !dialog.querySelector('.btnSlideshowPause i').classList.contains("pause"); + var paused = !dialog.querySelector('.btnSlideshowPause .material-icons').classList.contains('pause'); if (paused) { play(); } else { @@ -609,7 +609,6 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f * Hides the slideshow element. */ self.hide = function () { - var dialog = dialog; if (dialog) { dialogHelper.close(dialog); } diff --git a/src/components/slideshow/style.css b/src/components/slideshow/style.css index fc747cf37..f1fea508d 100644 --- a/src/components/slideshow/style.css +++ b/src/components/slideshow/style.css @@ -41,12 +41,13 @@ } .swiper-slide-img { - width: 100%; - height: 100%; + max-height: 100%; + max-width: 100%; display: flex; justify-content: center; align-items: center; text-align: center; + margin: auto; } .slideshowButtonIcon { @@ -141,4 +142,6 @@ .slider-zoom-container { margin: auto; + max-height: 100%; + max-width: 100%; } diff --git a/src/components/sortmenu/sortmenu.js b/src/components/sortmenu/sortmenu.js index a0b40acaf..9950afb89 100644 --- a/src/components/sortmenu/sortmenu.js +++ b/src/components/sortmenu/sortmenu.js @@ -66,7 +66,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutMana var html = ''; html += '
'; - html += ''; + html += ''; html += '

${Sort}

'; html += '
'; diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 123b4ba20..e9bcc0bfc 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -48,7 +48,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', var apiClient = connectionManager.getApiClient(currentItem.ServerId); apiClient.ajax({ - type: "POST", + type: 'POST', url: apiClient.getUrl(url) }).then(function () { @@ -87,7 +87,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', apiClient.ajax({ - type: "DELETE", + type: 'DELETE', url: apiClient.getUrl(url) }).then(function () { @@ -132,7 +132,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', itemHtml += '<' + tagName + ' class="' + className + '" data-index="' + s.Index + '">'; - itemHtml += ''; + itemHtml += ''; itemHtml += '
'; @@ -149,7 +149,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', if (!layoutManager.tv) { if (s.Path) { - itemHtml += ''; + itemHtml += ''; } } @@ -232,11 +232,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', html += '
'; } html += '

' + provider + '

'; - if (layoutManager.tv) { - html += '
'; - } else { - html += '
'; - } + html += '
'; lastProvider = provider; } @@ -248,7 +244,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', html += '<' + tagName + ' class="' + className + '" data-subid="' + result.Id + '">'; - html += ''; + html += ''; var bodyClass = result.Comment || result.IsHashMatch ? 'three-line' : 'two-line'; @@ -281,7 +277,7 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', html += '
'; if (!layoutManager.tv) { - html += ''; + html += ''; } html += ''; diff --git a/src/components/subtitleeditor/subtitleeditor.template.html b/src/components/subtitleeditor/subtitleeditor.template.html index 8719cc930..7471972f5 100644 --- a/src/components/subtitleeditor/subtitleeditor.template.html +++ b/src/components/subtitleeditor/subtitleeditor.template.html @@ -1,9 +1,8 @@
- +

${Subtitles}

- info${Help} - + ${Help}
@@ -18,7 +17,7 @@
- +
diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index fdc64f0df..bec8156ac 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -1,5 +1,5 @@ define([], function () { - "use strict"; + 'use strict'; function getTextStyles(settings, isCue) { diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 2c8692919..d728360d0 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -1,13 +1,13 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loading', 'connectionManager', 'subtitleAppearanceHelper', 'dom', 'events', 'listViewStyle', 'emby-select', 'emby-input', 'emby-checkbox', 'flexStyles'], function (require, globalize, appSettings, appHost, focusManager, loading, connectionManager, subtitleAppearanceHelper, dom, events) { - "use strict"; + 'use strict'; function populateLanguages(select, languages) { - var html = ""; + var html = ''; - html += ""; + html += "'; for (var i = 0, length = languages.length; i < length; i++) { var culture = languages[i]; - html += ""; + html += "'; } select.innerHTML = html; @@ -37,8 +37,8 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi populateLanguages(selectSubtitleLanguage, allCultures); - selectSubtitleLanguage.value = user.Configuration.SubtitleLanguagePreference || ""; - context.querySelector('#selectSubtitlePlaybackMode').value = user.Configuration.SubtitleMode || ""; + selectSubtitleLanguage.value = user.Configuration.SubtitleLanguagePreference || ''; + context.querySelector('#selectSubtitlePlaybackMode').value = user.Configuration.SubtitleMode || ''; context.querySelector('#selectSubtitlePlaybackMode').dispatchEvent(new CustomEvent('change', {})); diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js index 29d110f12..fb986ec34 100644 --- a/src/components/subtitlesync/subtitlesync.js +++ b/src/components/subtitlesync/subtitlesync.js @@ -1,5 +1,5 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, layoutManager, template, css) { - "use strict"; + 'use strict'; var player; var subtitleSyncSlider; @@ -13,35 +13,39 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', document.body.appendChild(parent); parent.innerHTML = template; - subtitleSyncSlider = parent.querySelector(".subtitleSyncSlider"); - subtitleSyncTextField = parent.querySelector(".subtitleSyncTextField"); - subtitleSyncCloseButton = parent.querySelector(".subtitleSync-closeButton"); - subtitleSyncContainer = parent.querySelector(".subtitleSyncContainer"); + subtitleSyncSlider = parent.querySelector('.subtitleSyncSlider'); + subtitleSyncTextField = parent.querySelector('.subtitleSyncTextField'); + subtitleSyncCloseButton = parent.querySelector('.subtitleSync-closeButton'); + subtitleSyncContainer = parent.querySelector('.subtitleSyncContainer'); if (layoutManager.tv) { - subtitleSyncSlider.classList.add("focusable"); + subtitleSyncSlider.classList.add('focusable'); // HACK: Delay to give time for registered element attach (Firefox) setTimeout(function () { subtitleSyncSlider.enableKeyboardDragging(); }, 0); } - subtitleSyncContainer.classList.add("hide"); + subtitleSyncContainer.classList.add('hide'); subtitleSyncTextField.updateOffset = function(offset) { - this.textContent = offset + "s"; + this.textContent = offset + 's'; }; - subtitleSyncTextField.addEventListener("keypress", function(event) { + subtitleSyncTextField.addEventListener('click', function () { + // keep focus to prevent fade with osd + this.hasFocus = true; + }); - if (event.key === "Enter") { + subtitleSyncTextField.addEventListener('keydown', function(event) { + if (event.key === 'Enter') { // if input key is enter search for float pattern var inputOffset = /[-+]?\d+\.?\d*/g.exec(this.textContent); if (inputOffset) { inputOffset = inputOffset[0]; // replace current text by considered offset - this.textContent = inputOffset + "s"; + this.textContent = inputOffset + 's'; inputOffset = parseFloat(inputOffset); // set new offset @@ -50,12 +54,12 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', subtitleSyncSlider.updateOffset( getPercentageFromOffset(inputOffset)); } else { - this.textContent = (playbackManager.getPlayerSubtitleOffset(player) || 0) + "s"; + this.textContent = (playbackManager.getPlayerSubtitleOffset(player) || 0) + 's'; } this.hasFocus = false; event.preventDefault(); } else { - // keep focus to prevent fade with bottom layout + // keep focus to prevent fade with osd this.hasFocus = true; if (event.key.match(/[+-\d.s]/) === null) { event.preventDefault(); @@ -63,12 +67,19 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', } }); + subtitleSyncTextField.blur = function() { + // prevent textfield to blur while element has focus + if (!this.hasFocus && this.prototype) { + this.prototype.blur(); + } + }; + subtitleSyncSlider.updateOffset = function(percent) { // default value is 0s = 50% this.value = percent === undefined ? 50 : percent; }; - subtitleSyncSlider.addEventListener("change", function () { + subtitleSyncSlider.addEventListener('change', function () { // set new offset playbackManager.setSubtitleOffset(getOffsetFromPercentage(this.value), player); // synchronize with textField value @@ -76,7 +87,7 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', getOffsetFromPercentage(this.value)); }); - subtitleSyncSlider.addEventListener("touchmove", function () { + subtitleSyncSlider.addEventListener('touchmove', function () { // set new offset playbackManager.setSubtitleOffset(getOffsetFromPercentage(this.value), player); // synchronize with textField value @@ -87,13 +98,13 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', subtitleSyncSlider.getBubbleHtml = function (value) { var newOffset = getOffsetFromPercentage(value); return '

' + - (newOffset > 0 ? "+" : "") + parseFloat(newOffset) + "s" + - "

"; + (newOffset > 0 ? '+' : '') + parseFloat(newOffset) + 's' + + ''; }; - subtitleSyncCloseButton.addEventListener("click", function() { + subtitleSyncCloseButton.addEventListener('click', function() { playbackManager.disableShowingSubtitleOffset(player); - SubtitleSync.prototype.toggle("forceToHide"); + SubtitleSync.prototype.toggle('forceToHide'); }); instance.element = parent; @@ -122,7 +133,7 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', } SubtitleSync.prototype.destroy = function() { - SubtitleSync.prototype.toggle("forceToHide"); + SubtitleSync.prototype.toggle('forceToHide'); if (player) { playbackManager.disableShowingSubtitleOffset(player); playbackManager.setSubtitleOffset(0, player); @@ -140,28 +151,26 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', /* eslint-disable no-fallthrough */ switch (action) { case undefined: - // if showing subtitle sync is enabled - if (playbackManager.isShowingSubtitleOffsetEnabled(player) && - // if there is an external subtitle stream enabled - playbackManager.canHandleOffsetOnCurrentSubtitle(player)) { - // if no subtitle offset is defined - if (!playbackManager.getPlayerSubtitleOffset(player)) { + // if showing subtitle sync is enabled and if there is an external subtitle stream enabled + if (playbackManager.isShowingSubtitleOffsetEnabled(player) && playbackManager.canHandleOffsetOnCurrentSubtitle(player)) { + // if no subtitle offset is defined or element has focus (offset being defined) + if (!(playbackManager.getPlayerSubtitleOffset(player) || subtitleSyncTextField.hasFocus)) { // set default offset to '0' = 50% - subtitleSyncSlider.value = "50"; - subtitleSyncTextField.textContent = "0s"; + subtitleSyncSlider.value = '50'; + subtitleSyncTextField.textContent = '0s'; playbackManager.setSubtitleOffset(0, player); } // show subtitle sync - subtitleSyncContainer.classList.remove("hide"); + subtitleSyncContainer.classList.remove('hide'); break; // stop here } // else continue and hide - case "hide": + case 'hide': // only break if element has focus if (subtitleSyncTextField.hasFocus) { break; } - case "forceToHide": - subtitleSyncContainer.classList.add("hide"); + case 'forceToHide': + subtitleSyncContainer.classList.add('hide'); break; } /* eslint-enable no-fallthrough */ diff --git a/src/components/subtitlesync/subtitlesync.template.html b/src/components/subtitlesync/subtitlesync.template.html index 999e4d0bb..4ca039aa0 100644 --- a/src/components/subtitlesync/subtitlesync.template.html +++ b/src/components/subtitlesync/subtitlesync.template.html @@ -1,5 +1,5 @@
- +
0s
diff --git a/src/components/tabbedview/itemstab.js b/src/components/tabbedview/itemstab.js index 6cfd40842..884cfa201 100644 --- a/src/components/tabbedview/itemstab.js +++ b/src/components/tabbedview/itemstab.js @@ -181,7 +181,8 @@ define(['playbackManager', 'userSettings', 'alphaPicker', 'alphaNumericShortcuts return; } - btnSortIcon.innerHTML = values.sortOrder === 'Descending' ? '' : ''; + btnSortIcon.classList.remove('arrow_downward', 'arrow_upward'); + btnSortIcon.classList.add(values.sortOrder === 'Descending' ? 'arrow_downward' : 'arrow_upward'); } function bindAll(elems, eventName, fn) { diff --git a/src/components/toast/toast.js b/src/components/toast/toast.js index 22eb53396..7b8e49e4d 100644 --- a/src/components/toast/toast.js +++ b/src/components/toast/toast.js @@ -26,7 +26,7 @@ define(['css!./toast'], function () { }; } - var elem = document.createElement("div"); + var elem = document.createElement('div'); elem.classList.add('toast'); elem.innerHTML = options.text; diff --git a/src/components/tunerpicker.js b/src/components/tunerpicker.js index 4dd5ecd3d..e7c92851a 100644 --- a/src/components/tunerpicker.js +++ b/src/components/tunerpicker.js @@ -1,38 +1,38 @@ -define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize", "loading", "browser", "focusManager", "scrollHelper", "material-icons", "formDialogStyle", "emby-button", "emby-itemscontainer", "cardStyle"], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser, focusManager, scrollHelper) { - "use strict"; +define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize', 'loading', 'browser', 'focusManager', 'scrollHelper', 'material-icons', 'formDialogStyle', 'emby-button', 'emby-itemscontainer', 'cardStyle'], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser, focusManager, scrollHelper) { + 'use strict'; var enableFocusTransform = !browser.slow && !browser.edge; function getEditorHtml() { - var html = ""; + var html = ''; html += '
'; html += '
'; html += '
'; - html += "

" + globalize.translate("DetectingDevices") + "...

"; - html += "

" + globalize.translate("MessagePleaseWait") + "

"; - html += "
"; - html += '

' + globalize.translate("HeaderNewDevices") + "

"; + html += '

' + globalize.translate('DetectingDevices') + '...

'; + html += '

' + globalize.translate('MessagePleaseWait') + '

'; + html += '
'; + html += '

' + globalize.translate('HeaderNewDevices') + '

'; html += '
'; - html += "
"; - html += "
"; - return html += "
"; + html += '
'; + html += '
'; + return html += '
'; } function getDeviceHtml(device) { var padderClass; - var html = ""; - var cssClass = "card scalableCard"; - var cardBoxCssClass = "cardBox visualCardBox"; - cssClass += " backdropCard backdropCard-scalable"; - padderClass = "cardPadder-backdrop"; + var html = ''; + var cssClass = 'card scalableCard'; + var cardBoxCssClass = 'cardBox visualCardBox'; + cssClass += ' backdropCard backdropCard-scalable'; + padderClass = 'cardPadder-backdrop'; // TODO move card creation code to Card component if (layoutManager.tv) { - cssClass += " show-focus"; + cssClass += ' show-focus'; if (enableFocusTransform) { - cssClass += " show-animation"; + cssClass += ' show-animation'; } } @@ -41,56 +41,56 @@ define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize" html += '
'; html += '
'; html += '
'; - html += '
dvr
'; - html += "
"; - html += "
"; + html += '
'; + html += '
'; + html += '
'; html += '
'; - html += '
' + getTunerName(device.Type) + "
"; - html += '
' + device.FriendlyName + "
"; + html += '
' + getTunerName(device.Type) + '
'; + html += '
' + device.FriendlyName + '
'; html += '
'; - html += device.Url || " "; - html += "
"; - html += "
"; - html += "
"; - return html += ""; + html += device.Url || ' '; + html += '
'; + html += '
'; + html += '
'; + return html += ''; } function getTunerName(providerId) { switch (providerId = providerId.toLowerCase()) { - case "m3u": - return "M3U"; + case 'm3u': + return 'M3U'; - case "hdhomerun": - return "HDHomerun"; + case 'hdhomerun': + return 'HDHomerun'; - case "hauppauge": - return "Hauppauge"; + case 'hauppauge': + return 'Hauppauge'; - case "satip": - return "DVB"; + case 'satip': + return 'DVB'; default: - return "Unknown"; + return 'Unknown'; } } function renderDevices(view, devices) { var i; var length; - var html = ""; + var html = ''; for (i = 0, length = devices.length; i < length; i++) { html += getDeviceHtml(devices[i]); } if (devices.length) { - view.querySelector(".devicesHeader").classList.remove("hide"); + view.querySelector('.devicesHeader').classList.remove('hide'); } else { - html = "


" + globalize.translate("NoNewDevicesFound") + "

"; - view.querySelector(".devicesHeader").classList.add("hide"); + html = '


' + globalize.translate('NoNewDevicesFound') + '

'; + view.querySelector('.devicesHeader').classList.add('hide'); } - var elem = view.querySelector(".results"); + var elem = view.querySelector('.results'); elem.innerHTML = html; if (layoutManager.tv) { @@ -100,13 +100,13 @@ define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize" function discoverDevices(view, apiClient) { loading.show(); - view.querySelector(".loadingContent").classList.remove("hide"); - return ApiClient.getJSON(ApiClient.getUrl("LiveTv/Tuners/Discvover", { + view.querySelector('.loadingContent').classList.remove('hide'); + return ApiClient.getJSON(ApiClient.getUrl('LiveTv/Tuners/Discvover', { NewDevicesOnly: true })).then(function (devices) { currentDevices = devices; renderDevices(view, devices); - view.querySelector(".loadingContent").classList.add("hide"); + view.querySelector('.loadingContent').classList.add('hide'); loading.hide(); }); } @@ -119,31 +119,31 @@ define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize" }; if (layoutManager.tv) { - dialogOptions.size = "fullscreen"; + dialogOptions.size = 'fullscreen'; } else { - dialogOptions.size = "small"; + dialogOptions.size = 'small'; } var dlg = dialogHelper.createDialog(dialogOptions); - dlg.classList.add("formDialog"); - var html = ""; + dlg.classList.add('formDialog'); + var html = ''; html += '
'; - html += ''; + html += ''; html += '

'; - html += globalize.translate("HeaderLiveTvTunerSetup"); - html += "

"; - html += "
"; + html += globalize.translate('HeaderLiveTvTunerSetup'); + html += ''; + html += '
'; html += getEditorHtml(); dlg.innerHTML = html; - dlg.querySelector(".btnCancel").addEventListener("click", function () { + dlg.querySelector('.btnCancel').addEventListener('click', function () { dialogHelper.close(dlg); }); var deviceResult; - dlg.querySelector(".results").addEventListener("click", function (e) { - var tunerCard = dom.parentWithClass(e.target, "card"); + dlg.querySelector('.results').addEventListener('click', function (e) { + var tunerCard = dom.parentWithClass(e.target, 'card'); if (tunerCard) { - var deviceId = tunerCard.getAttribute("data-id"); + var deviceId = tunerCard.getAttribute('data-id'); deviceResult = currentDevices.filter(function (d) { return d.DeviceId === deviceId; })[0]; @@ -152,14 +152,14 @@ define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize" }); if (layoutManager.tv) { - scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false); + scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false); } var apiClient = connectionManager.getApiClient(options.serverId); discoverDevices(dlg, apiClient); if (layoutManager.tv) { - scrollHelper.centerFocus.off(dlg.querySelector(".formDialogContent"), false); + scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false); } return dialogHelper.open(dlg).then(function () { diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js index 649ac5017..be1cdf575 100644 --- a/src/components/tvproviders/schedulesdirect.js +++ b/src/components/tvproviders/schedulesdirect.js @@ -1,31 +1,31 @@ -define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emby-input", "emby-select", "emby-button", "flexStyles"], function ($, loading, globalize) { - "use strict"; +define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emby-input', 'emby-select', 'emby-button', 'flexStyles'], function ($, loading, globalize) { + 'use strict'; return function (page, providerId, options) { function reload() { loading.show(); - ApiClient.getNamedConfiguration("livetv").then(function (config) { + ApiClient.getNamedConfiguration('livetv').then(function (config) { var info = config.ListingProviders.filter(function (i) { return i.Id === providerId; })[0] || {}; listingsId = info.ListingsId; - $("#selectListing", page).val(info.ListingsId || ""); - page.querySelector(".txtUser").value = info.Username || ""; - page.querySelector(".txtPass").value = ""; - page.querySelector(".txtZipCode").value = info.ZipCode || ""; + $('#selectListing', page).val(info.ListingsId || ''); + page.querySelector('.txtUser').value = info.Username || ''; + page.querySelector('.txtPass').value = ''; + page.querySelector('.txtZipCode').value = info.ZipCode || ''; if (info.Username && info.Password) { - page.querySelector(".listingsSection").classList.remove("hide"); + page.querySelector('.listingsSection').classList.remove('hide'); } else { - page.querySelector(".listingsSection").classList.add("hide"); + page.querySelector('.listingsSection').classList.add('hide'); } - page.querySelector(".chkAllTuners").checked = info.EnableAllTuners; + page.querySelector('.chkAllTuners').checked = info.EnableAllTuners; if (info.EnableAllTuners) { - page.querySelector(".selectTunersSection").classList.add("hide"); + page.querySelector('.selectTunersSection').classList.add('hide'); } else { - page.querySelector(".selectTunersSection").classList.remove("hide"); + page.querySelector('.selectTunersSection').classList.remove('hide'); } setCountry(info); @@ -34,7 +34,7 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emb } function setCountry(info) { - ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/SchedulesDirect/Countries")).then(function (result) { + ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/SchedulesDirect/Countries')).then(function (result) { var i; var length; var countryList = []; @@ -42,7 +42,7 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emb for (var region in result) { var countries = result[region]; - if (countries.length && "ZZZ" !== region) { + if (countries.length && 'ZZZ' !== region) { for (i = 0, length = countries.length; i < length; i++) { countryList.push({ name: countries[i].fullName, @@ -63,13 +63,13 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emb return 0; }); - $("#selectCountry", page).html(countryList.map(function (c) { - return '"; - }).join("")).val(info.Country || ""); - $(page.querySelector(".txtZipCode")).trigger("change"); + $('#selectCountry', page).html(countryList.map(function (c) { + return ''; + }).join('')).val(info.Country || ''); + $(page.querySelector('.txtZipCode')).trigger('change'); }, function () { // ApiClient.getJSON() error handler Dashboard.alert({ - message: globalize.translate("ErrorGettingTvLineups") + message: globalize.translate('ErrorGettingTvLineups') }); }); loading.hide(); @@ -77,11 +77,11 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emb function sha256(str) { if (!self.TextEncoder) { - return Promise.resolve(""); + return Promise.resolve(''); } - var buffer = new TextEncoder("utf-8").encode(str); - return crypto.subtle.digest("SHA-256", buffer).then(function (hash) { + var buffer = new TextEncoder('utf-8').encode(str); + return crypto.subtle.digest('SHA-256', buffer).then(function (hash) { return hex(hash); }); } @@ -93,22 +93,22 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emb for (var i = 0; i < view.byteLength; i += 4) { var value = view.getUint32(i); var stringValue = value.toString(16); - var paddedValue = ("00000000" + stringValue).slice(-"00000000".length); + var paddedValue = ('00000000' + stringValue).slice(-'00000000'.length); hexCodes.push(paddedValue); } - return hexCodes.join(""); + return hexCodes.join(''); } function submitLoginForm() { loading.show(); - sha256(page.querySelector(".txtPass").value).then(function (passwordHash) { + sha256(page.querySelector('.txtPass').value).then(function (passwordHash) { var info = { - Type: "SchedulesDirect", - Username: page.querySelector(".txtUser").value, + Type: 'SchedulesDirect', + Username: page.querySelector('.txtUser').value, EnableAllTuners: true, Password: passwordHash, - Pw: page.querySelector(".txtPass").value + Pw: page.querySelector('.txtPass').value }; var id = providerId; @@ -117,56 +117,56 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emb } ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("LiveTv/ListingProviders", { + type: 'POST', + url: ApiClient.getUrl('LiveTv/ListingProviders', { ValidateLogin: true }), data: JSON.stringify(info), - contentType: "application/json", - dataType: "json" + contentType: 'application/json', + dataType: 'json' }).then(function (result) { Dashboard.processServerConfigurationUpdateResult(); providerId = result.Id; reload(); }, function () { Dashboard.alert({ // ApiClient.ajax() error handler - message: globalize.translate("ErrorSavingTvProvider") + message: globalize.translate('ErrorSavingTvProvider') }); }); }); } function submitListingsForm() { - var selectedListingsId = $("#selectListing", page).val(); + var selectedListingsId = $('#selectListing', page).val(); if (!selectedListingsId) { return void Dashboard.alert({ - message: globalize.translate("ErrorPleaseSelectLineup") + message: globalize.translate('ErrorPleaseSelectLineup') }); } loading.show(); var id = providerId; - ApiClient.getNamedConfiguration("livetv").then(function (config) { + ApiClient.getNamedConfiguration('livetv').then(function (config) { var info = config.ListingProviders.filter(function (i) { return i.Id === id; })[0]; - info.ZipCode = page.querySelector(".txtZipCode").value; - info.Country = $("#selectCountry", page).val(); + info.ZipCode = page.querySelector('.txtZipCode').value; + info.Country = $('#selectCountry', page).val(); info.ListingsId = selectedListingsId; - info.EnableAllTuners = page.querySelector(".chkAllTuners").checked; - info.EnabledTuners = info.EnableAllTuners ? [] : $(".chkTuner", page).get().filter(function (i) { + info.EnableAllTuners = page.querySelector('.chkAllTuners').checked; + info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (i) { return i.checked; }).map(function (i) { - return i.getAttribute("data-id"); + return i.getAttribute('data-id'); }); ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("LiveTv/ListingProviders", { + type: 'POST', + url: ApiClient.getUrl('LiveTv/ListingProviders', { ValidateListings: true }), data: JSON.stringify(info), - contentType: "application/json" + contentType: 'application/json' }).then(function (result) { loading.hide(); @@ -174,11 +174,11 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emb Dashboard.processServerConfigurationUpdateResult(); } - Events.trigger(self, "submitted"); + Events.trigger(self, 'submitted'); }, function () { loading.hide(); Dashboard.alert({ - message: globalize.translate("ErrorAddingListingsToSchedulesDirect") + message: globalize.translate('ErrorAddingListingsToSchedulesDirect') }); }); }); @@ -186,79 +186,79 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emb function refreshListings(value) { if (!value) { - return void $("#selectListing", page).html(""); + return void $('#selectListing', page).html(''); } loading.show(); ApiClient.ajax({ - type: "GET", - url: ApiClient.getUrl("LiveTv/ListingProviders/Lineups", { + type: 'GET', + url: ApiClient.getUrl('LiveTv/ListingProviders/Lineups', { Id: providerId, Location: value, - Country: $("#selectCountry", page).val() + Country: $('#selectCountry', page).val() }), - dataType: "json" + dataType: 'json' }).then(function (result) { - $("#selectListing", page).html(result.map(function (o) { - return '"; + $('#selectListing', page).html(result.map(function (o) { + return ''; })); if (listingsId) { - $("#selectListing", page).val(listingsId); + $('#selectListing', page).val(listingsId); } loading.hide(); }, function (result) { Dashboard.alert({ - message: globalize.translate("ErrorGettingTvLineups") + message: globalize.translate('ErrorGettingTvLineups') }); - refreshListings(""); + refreshListings(''); loading.hide(); }); } function getTunerName(providerId) { switch (providerId = providerId.toLowerCase()) { - case "m3u": - return "M3U Playlist"; - case "hdhomerun": - return "HDHomerun"; - case "satip": - return "DVB"; + case 'm3u': + return 'M3U Playlist'; + case 'hdhomerun': + return 'HDHomerun'; + case 'satip': + return 'DVB'; default: - return "Unknown"; + return 'Unknown'; } } function refreshTunerDevices(page, providerInfo, devices) { - var html = ""; + var html = ''; for (var i = 0, length = devices.length; i < length; i++) { var device = devices[i]; html += '
'; var enabledTuners = providerInfo.EnabledTuners || []; var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id); - var checkedAttribute = isChecked ? " checked" : ""; - html += '"; + var checkedAttribute = isChecked ? ' checked' : ''; + html += ''; html += '
'; html += '
'; html += device.FriendlyName || getTunerName(device.Type); - html += "
"; + html += '
'; html += '
'; html += device.Url; - html += "
"; - html += "
"; - html += "
"; + html += '
'; + html += '
'; + html += '
'; } - page.querySelector(".tunerList").innerHTML = html; + page.querySelector('.tunerList').innerHTML = html; } var listingsId; var self = this; self.submit = function () { - page.querySelector(".btnSubmitListingsContainer").click(); + page.querySelector('.btnSubmitListingsContainer').click(); }; self.init = function () { @@ -267,30 +267,30 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "listViewStyle", "emb // Only hide the buttons if explicitly set to false; default to showing if undefined or null // FIXME: rename this option to clarify logic var hideCancelButton = options.showCancelButton === false; - page.querySelector(".btnCancel").classList.toggle("hide", hideCancelButton); + page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton); var hideSubmitButton = options.showSubmitButton === false; - page.querySelector(".btnSubmitListings").classList.toggle("hide", hideSubmitButton); + page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton); - $(".formLogin", page).on("submit", function () { + $('.formLogin', page).on('submit', function () { submitLoginForm(); return false; }); - $(".formListings", page).on("submit", function () { + $('.formListings', page).on('submit', function () { submitListingsForm(); return false; }); - $(".txtZipCode", page).on("change", function () { + $('.txtZipCode', page).on('change', function () { refreshListings(this.value); }); - page.querySelector(".chkAllTuners").addEventListener("change", function (e) { + page.querySelector('.chkAllTuners').addEventListener('change', function (e) { if (e.target.checked) { - page.querySelector(".selectTunersSection").classList.add("hide"); + page.querySelector('.selectTunersSection').classList.add('hide'); } else { - page.querySelector(".selectTunersSection").classList.remove("hide"); + page.querySelector('.selectTunersSection').classList.remove('hide'); } }); - $(".createAccountHelp", page).html(globalize.translate("MessageCreateAccountAt", 'http://www.schedulesdirect.org')); + $('.createAccountHelp', page).html(globalize.translate('MessageCreateAccountAt', 'http://www.schedulesdirect.org')); reload(); }; }; diff --git a/src/components/tvproviders/schedulesdirect.template.html b/src/components/tvproviders/schedulesdirect.template.html index 3cfba06fe..abe19b50f 100644 --- a/src/components/tvproviders/schedulesdirect.template.html +++ b/src/components/tvproviders/schedulesdirect.template.html @@ -1,7 +1,7 @@

Schedules Direct

- ${Help} + ${Help}

diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index 991ed49a4..4c39b1443 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -1,5 +1,5 @@ -define(["jQuery", "loading", "globalize", "emby-checkbox", "emby-input", "listViewStyle", "paper-icon-button-light"], function ($, loading, globalize) { - "use strict"; +define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listViewStyle', 'paper-icon-button-light'], function ($, loading, globalize) { + 'use strict'; return function (page, providerId, options) { function getListingProvider(config, id) { @@ -15,26 +15,26 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "emby-input", "listVi return getListingProvider(); } - return ApiClient.getJSON(ApiClient.getUrl("LiveTv/ListingProviders/Default")); + return ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/Default')); } function reload() { loading.show(); - ApiClient.getNamedConfiguration("livetv").then(function (config) { + ApiClient.getNamedConfiguration('livetv').then(function (config) { getListingProvider(config, providerId).then(function (info) { - page.querySelector(".txtPath").value = info.Path || ""; - page.querySelector(".txtKids").value = (info.KidsCategories || []).join("|"); - page.querySelector(".txtNews").value = (info.NewsCategories || []).join("|"); - page.querySelector(".txtSports").value = (info.SportsCategories || []).join("|"); - page.querySelector(".txtMovies").value = (info.MovieCategories || []).join("|"); - page.querySelector(".txtMoviePrefix").value = info.MoviePrefix || ""; - page.querySelector(".txtUserAgent").value = info.UserAgent || ""; - page.querySelector(".chkAllTuners").checked = info.EnableAllTuners; + page.querySelector('.txtPath').value = info.Path || ''; + page.querySelector('.txtKids').value = (info.KidsCategories || []).join('|'); + page.querySelector('.txtNews').value = (info.NewsCategories || []).join('|'); + page.querySelector('.txtSports').value = (info.SportsCategories || []).join('|'); + page.querySelector('.txtMovies').value = (info.MovieCategories || []).join('|'); + page.querySelector('.txtMoviePrefix').value = info.MoviePrefix || ''; + page.querySelector('.txtUserAgent').value = info.UserAgent || ''; + page.querySelector('.chkAllTuners').checked = info.EnableAllTuners; - if (page.querySelector(".chkAllTuners").checked) { - page.querySelector(".selectTunersSection").classList.add("hide"); + if (page.querySelector('.chkAllTuners').checked) { + page.querySelector('.selectTunersSection').classList.add('hide'); } else { - page.querySelector(".selectTunersSection").classList.remove("hide"); + page.querySelector('.selectTunersSection').classList.remove('hide'); } refreshTunerDevices(page, info, config.TunerHosts); @@ -47,7 +47,7 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "emby-input", "listVi var value = txtInput.value; if (value) { - return value.split("|"); + return value.split('|'); } return []; @@ -56,31 +56,31 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "emby-input", "listVi function submitListingsForm() { loading.show(); var id = providerId; - ApiClient.getNamedConfiguration("livetv").then(function (config) { + ApiClient.getNamedConfiguration('livetv').then(function (config) { var info = config.ListingProviders.filter(function (provider) { return provider.Id === id; })[0] || {}; - info.Type = "xmltv"; - info.Path = page.querySelector(".txtPath").value; - info.MoviePrefix = page.querySelector(".txtMoviePrefix").value || null; - info.UserAgent = page.querySelector(".txtUserAgent").value || null; - info.MovieCategories = getCategories(page.querySelector(".txtMovies")); - info.KidsCategories = getCategories(page.querySelector(".txtKids")); - info.NewsCategories = getCategories(page.querySelector(".txtNews")); - info.SportsCategories = getCategories(page.querySelector(".txtSports")); - info.EnableAllTuners = page.querySelector(".chkAllTuners").checked; - info.EnabledTuners = info.EnableAllTuners ? [] : $(".chkTuner", page).get().filter(function (tuner) { + info.Type = 'xmltv'; + info.Path = page.querySelector('.txtPath').value; + info.MoviePrefix = page.querySelector('.txtMoviePrefix').value || null; + info.UserAgent = page.querySelector('.txtUserAgent').value || null; + info.MovieCategories = getCategories(page.querySelector('.txtMovies')); + info.KidsCategories = getCategories(page.querySelector('.txtKids')); + info.NewsCategories = getCategories(page.querySelector('.txtNews')); + info.SportsCategories = getCategories(page.querySelector('.txtSports')); + info.EnableAllTuners = page.querySelector('.chkAllTuners').checked; + info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (tuner) { return tuner.checked; }).map(function (tuner) { - return tuner.getAttribute("data-id"); + return tuner.getAttribute('data-id'); }); ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("LiveTv/ListingProviders", { + type: 'POST', + url: ApiClient.getUrl('LiveTv/ListingProviders', { ValidateListings: true }), data: JSON.stringify(info), - contentType: "application/json" + contentType: 'application/json' }).then(function (result) { loading.hide(); @@ -88,11 +88,11 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "emby-input", "listVi Dashboard.processServerConfigurationUpdateResult(); } - Events.trigger(self, "submitted"); + Events.trigger(self, 'submitted'); }, function () { loading.hide(); Dashboard.alert({ - message: globalize.translate("ErrorAddingXmlTvFile") + message: globalize.translate('ErrorAddingXmlTvFile') }); }); }); @@ -100,51 +100,51 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "emby-input", "listVi function getTunerName(providerId) { switch (providerId = providerId.toLowerCase()) { - case "m3u": - return "M3U Playlist"; - case "hdhomerun": - return "HDHomerun"; - case "satip": - return "DVB"; + case 'm3u': + return 'M3U Playlist'; + case 'hdhomerun': + return 'HDHomerun'; + case 'satip': + return 'DVB'; default: - return "Unknown"; + return 'Unknown'; } } function refreshTunerDevices(page, providerInfo, devices) { - var html = ""; + var html = ''; for (var i = 0, length = devices.length; i < length; i++) { var device = devices[i]; html += '
'; var enabledTuners = providerInfo.EnabledTuners || []; var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id); - var checkedAttribute = isChecked ? " checked" : ""; - html += '"; + var checkedAttribute = isChecked ? ' checked' : ''; + html += ''; html += '
'; html += '
'; html += device.FriendlyName || getTunerName(device.Type); - html += "
"; + html += '
'; html += '
'; html += device.Url; - html += "
"; - html += "
"; - html += ""; + html += ''; + html += ''; + html += ''; } - page.querySelector(".tunerList").innerHTML = html; + page.querySelector('.tunerList').innerHTML = html; } function onSelectPathClick(e) { - var page = $(e.target).parents(".xmltvForm")[0]; + var page = $(e.target).parents('.xmltvForm')[0]; - require(["directorybrowser"], function (directoryBrowser) { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ includeFiles: true, callback: function (path) { if (path) { - var txtPath = page.querySelector(".txtPath"); + var txtPath = page.querySelector('.txtPath'); txtPath.value = path; txtPath.focus(); } @@ -157,7 +157,7 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "emby-input", "listVi var self = this; self.submit = function () { - page.querySelector(".btnSubmitListings").click(); + page.querySelector('.btnSubmitListings').click(); }; self.init = function () { @@ -166,21 +166,21 @@ define(["jQuery", "loading", "globalize", "emby-checkbox", "emby-input", "listVi // Only hide the buttons if explicitly set to false; default to showing if undefined or null // FIXME: rename this option to clarify logic var hideCancelButton = options.showCancelButton === false; - page.querySelector(".btnCancel").classList.toggle("hide", hideCancelButton); + page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton); var hideSubmitButton = options.showSubmitButton === false; - page.querySelector(".btnSubmitListings").classList.toggle("hide", hideSubmitButton); + page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton); - $("form", page).on("submit", function () { + $('form', page).on('submit', function () { submitListingsForm(); return false; }); - page.querySelector("#btnSelectPath").addEventListener("click", onSelectPathClick); - page.querySelector(".chkAllTuners").addEventListener("change", function (evt) { + page.querySelector('#btnSelectPath').addEventListener('click', onSelectPathClick); + page.querySelector('.chkAllTuners').addEventListener('change', function (evt) { if (evt.target.checked) { - page.querySelector(".selectTunersSection").classList.add("hide"); + page.querySelector('.selectTunersSection').classList.add('hide'); } else { - page.querySelector(".selectTunersSection").classList.remove("hide"); + page.querySelector('.selectTunersSection').classList.remove('hide'); } }); reload(); diff --git a/src/components/tvproviders/xmltv.template.html b/src/components/tvproviders/xmltv.template.html index 7f6490e62..72c29904b 100644 --- a/src/components/tvproviders/xmltv.template.html +++ b/src/components/tvproviders/xmltv.template.html @@ -1,7 +1,7 @@

Xml TV

- ${Help} + ${Help}
@@ -12,7 +12,7 @@
- +
${XmlTvPathHelp}
diff --git a/src/components/upnextdialog/upnextdialog.css b/src/components/upnextdialog/upnextdialog.css index 15f91b29d..05e3b10f5 100644 --- a/src/components/upnextdialog/upnextdialog.css +++ b/src/components/upnextdialog/upnextdialog.css @@ -63,8 +63,8 @@ height: auto; width: 100%; box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); - border: 0; user-drag: none; + border: 0; user-select: none; -moz-user-select: none; -webkit-user-drag: none; diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js index 225859e0b..3e9c9f9c5 100644 --- a/src/components/upnextdialog/upnextdialog.js +++ b/src/components/upnextdialog/upnextdialog.js @@ -10,7 +10,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l } options = options || {}; - options.type = options.type || "Primary"; + options.type = options.type || 'Primary'; if (options.type === 'Primary') { @@ -44,7 +44,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l function imageUrl(item, options) { options = options || {}; - options.type = options.type || "Primary"; + options.type = options.type || 'Primary'; if (item.ImageTags && item.ImageTags[options.type]) { diff --git a/src/components/userdatabuttons/userdatabuttons.js b/src/components/userdatabuttons/userdatabuttons.js index 2636be1e1..86b990213 100644 --- a/src/components/userdatabuttons/userdatabuttons.js +++ b/src/components/userdatabuttons/userdatabuttons.js @@ -30,7 +30,7 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto iconCssClass += 'material-icons'; - return ''; + return ''; } function onContainerClick(e) { @@ -90,10 +90,10 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto return html; } - var btnCssClass = "btnUserData"; + var btnCssClass = 'btnUserData'; if (cssClass) { - btnCssClass += " " + cssClass; + btnCssClass += ' ' + cssClass; } var iconCssClass = options.iconCssClass; diff --git a/src/components/viewContainer.js b/src/components/viewContainer.js index 607e7029d..6c83e4a3b 100644 --- a/src/components/viewContainer.js +++ b/src/components/viewContainer.js @@ -1,16 +1,16 @@ -define(["browser", "dom", "layoutManager", "css!components/viewManager/viewContainer"], function (browser, dom, layoutManager) { - "use strict"; +define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewContainer'], function (browser, dom, layoutManager) { + 'use strict'; function setControllerClass(view, options) { if (options.controllerFactory) { return Promise.resolve(); } - var controllerUrl = view.getAttribute("data-controller"); + var controllerUrl = view.getAttribute('data-controller'); if (controllerUrl) { - if (0 === controllerUrl.indexOf("__plugin/")) { - controllerUrl = controllerUrl.substring("__plugin/".length); + if (0 === controllerUrl.indexOf('__plugin/')) { + controllerUrl = controllerUrl.substring('__plugin/'.length); } controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl); @@ -38,21 +38,21 @@ define(["browser", "dom", "layoutManager", "css!components/viewManager/viewConta pageIndex = 0; } - var isPluginpage = -1 !== options.url.toLowerCase().indexOf("/configurationpage"); + var isPluginpage = -1 !== options.url.toLowerCase().indexOf('/configurationpage'); var newViewInfo = normalizeNewView(options, isPluginpage); var newView = newViewInfo.elem; var modulesToLoad = []; if (isPluginpage) { - modulesToLoad.push("legacyDashboard"); + modulesToLoad.push('legacyDashboard'); } if (newViewInfo.hasjQuerySelect) { - modulesToLoad.push("legacySelectMenu"); + modulesToLoad.push('legacySelectMenu'); } if (newViewInfo.hasjQueryChecked) { - modulesToLoad.push("fnchecked"); + modulesToLoad.push('fnchecked'); } return new Promise(function (resolve) { @@ -65,12 +65,12 @@ define(["browser", "dom", "layoutManager", "css!components/viewManager/viewConta var view = newView; - if ("string" == typeof view) { - view = document.createElement("div"); + if ('string' == typeof view) { + view = document.createElement('div'); view.innerHTML = newView; } - view.classList.add("mainAnimatedPage"); + view.classList.add('mainAnimatedPage'); if (currentPage) { if (newViewInfo.hasScript && window.$) { @@ -88,17 +88,17 @@ define(["browser", "dom", "layoutManager", "css!components/viewManager/viewConta } if (options.type) { - view.setAttribute("data-type", options.type); + view.setAttribute('data-type', options.type); } var properties = []; if (options.fullscreen) { - properties.push("fullscreen"); + properties.push('fullscreen'); } if (properties.length) { - view.setAttribute("data-properties", properties.join(",")); + view.setAttribute('data-properties', properties.join(',')); } allPages[pageIndex] = view; @@ -133,11 +133,11 @@ define(["browser", "dom", "layoutManager", "css!components/viewManager/viewConta function parseHtml(html, hasScript) { if (hasScript) { - html = replaceAll(html, "\x3c!----\x3e", "<\/script>"); + html = replaceAll(html, '\x3c!----\x3e', '<\/script>'); } - var wrapper = document.createElement("div"); + var wrapper = document.createElement('div'); wrapper.innerHTML = html; return wrapper.querySelector('div[data-role="page"]'); } @@ -149,11 +149,11 @@ define(["browser", "dom", "layoutManager", "css!components/viewManager/viewConta return viewHtml; } - var hasScript = -1 !== viewHtml.indexOf("https://github.com/jellyfin/jellyfin') + message: globalize.translate('ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') }); break; - case "Unavailable": + case 'Unavailable': Dashboard.alert({ - message: globalize.translate("MessageUnableToConnectToServer"), - title: globalize.translate("HeaderConnectionFailure") + message: globalize.translate('MessageUnableToConnectToServer'), + title: globalize.translate('HeaderConnectionFailure') }); } } function submitServer(page) { loading.show(); - var host = page.querySelector("#txtServerHost").value; + var host = page.querySelector('#txtServerHost').value; ConnectionManager.connectToAddress(host, { enableAutoLogin: appSettings.enableAutoLogin() }).then(function(result) { handleConnectionResult(page, result); }, function() { handleConnectionResult(page, { - State: "Unavailable" + State: 'Unavailable' }); }); } return function(view, params) { - view.querySelector(".addServerForm").addEventListener("submit", onServerSubmit); - view.querySelector(".btnCancel").addEventListener("click", goBack); + view.querySelector('.addServerForm').addEventListener('submit', onServerSubmit); + view.querySelector('.btnCancel').addEventListener('click', goBack); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(view); }); @@ -57,7 +57,7 @@ define(["appSettings", "loading", "browser", "globalize", "emby-button"], functi } function goBack() { - require(["appRouter"], function(appRouter) { + require(['appRouter'], function(appRouter) { appRouter.back(); }); } diff --git a/src/controllers/auth/forgotpassword.js b/src/controllers/auth/forgotpassword.js index 32052d1f7..3756bf814 100644 --- a/src/controllers/auth/forgotpassword.js +++ b/src/controllers/auth/forgotpassword.js @@ -1,34 +1,34 @@ -define(["globalize"], function (globalize) { - "use strict"; +define(['globalize'], function (globalize) { + 'use strict'; function processForgotPasswordResult(result) { - if ("ContactAdmin" == result.Action) { + if ('ContactAdmin' == result.Action) { return void Dashboard.alert({ - message: globalize.translate("MessageContactAdminToResetPassword"), - title: globalize.translate("HeaderForgotPassword") + message: globalize.translate('MessageContactAdminToResetPassword'), + title: globalize.translate('HeaderForgotPassword') }); } - if ("InNetworkRequired" == result.Action) { + if ('InNetworkRequired' == result.Action) { return void Dashboard.alert({ - message: globalize.translate("MessageForgotPasswordInNetworkRequired"), - title: globalize.translate("HeaderForgotPassword") + message: globalize.translate('MessageForgotPasswordInNetworkRequired'), + title: globalize.translate('HeaderForgotPassword') }); } - if ("PinCode" == result.Action) { - var msg = globalize.translate("MessageForgotPasswordFileCreated"); - msg += "
"; - msg += "
"; - msg += "Enter PIN here to finish Password Reset
"; - msg += "
"; + if ('PinCode' == result.Action) { + var msg = globalize.translate('MessageForgotPasswordFileCreated'); + msg += '
'; + msg += '
'; + msg += 'Enter PIN here to finish Password Reset
'; + msg += '
'; msg += result.PinFile; - msg += "
"; + msg += '
'; return void Dashboard.alert({ message: msg, - title: globalize.translate("HeaderForgotPassword"), + title: globalize.translate('HeaderForgotPassword'), callback: function () { - Dashboard.navigate("forgotpasswordpin.html"); + Dashboard.navigate('forgotpasswordpin.html'); } }); } @@ -37,17 +37,17 @@ define(["globalize"], function (globalize) { return function (view, params) { function onSubmit(e) { ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("Users/ForgotPassword"), - dataType: "json", + type: 'POST', + url: ApiClient.getUrl('Users/ForgotPassword'), + dataType: 'json', data: { - EnteredUsername: view.querySelector("#txtName").value + EnteredUsername: view.querySelector('#txtName').value } }).then(processForgotPasswordResult); e.preventDefault(); return false; } - view.querySelector("form").addEventListener("submit", onSubmit); + view.querySelector('form').addEventListener('submit', onSubmit); }; }); diff --git a/src/controllers/auth/forgotpasswordpin.js b/src/controllers/auth/forgotpasswordpin.js index f88f57ad7..2a51890d2 100644 --- a/src/controllers/auth/forgotpasswordpin.js +++ b/src/controllers/auth/forgotpasswordpin.js @@ -1,41 +1,41 @@ -define(["globalize"], function (globalize) { - "use strict"; +define(['globalize'], function (globalize) { + 'use strict'; function processForgotPasswordResult(result) { if (result.Success) { - var msg = globalize.translate("MessagePasswordResetForUsers"); - msg += "
"; - msg += "
"; - msg += result.UsersReset.join("
"); + var msg = globalize.translate('MessagePasswordResetForUsers'); + msg += '
'; + msg += '
'; + msg += result.UsersReset.join('
'); return void Dashboard.alert({ message: msg, - title: globalize.translate("HeaderPasswordReset"), + title: globalize.translate('HeaderPasswordReset'), callback: function () { - window.location.href = "index.html"; + window.location.href = 'index.html'; } }); } Dashboard.alert({ - message: globalize.translate("MessageInvalidForgotPasswordPin"), - title: globalize.translate("HeaderPasswordReset") + message: globalize.translate('MessageInvalidForgotPasswordPin'), + title: globalize.translate('HeaderPasswordReset') }); } return function (view, params) { function onSubmit(e) { ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("Users/ForgotPassword/Pin"), - dataType: "json", + type: 'POST', + url: ApiClient.getUrl('Users/ForgotPassword/Pin'), + dataType: 'json', data: { - Pin: view.querySelector("#txtPin").value + Pin: view.querySelector('#txtPin').value } }).then(processForgotPasswordResult); e.preventDefault(); return false; } - view.querySelector("form").addEventListener("submit", onSubmit); + view.querySelector('form').addEventListener('submit', onSubmit); }; }); diff --git a/src/controllers/auth/login.js b/src/controllers/auth/login.js index 05075efe5..c0c37e27d 100644 --- a/src/controllers/auth/login.js +++ b/src/controllers/auth/login.js @@ -1,5 +1,5 @@ -define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layoutManager", "browser", "globalize", "cardStyle", "emby-checkbox"], function (appHost, appSettings, dom, connectionManager, loading, layoutManager, browser, globalize) { - "use strict"; +define(['apphost', 'appSettings', 'dom', 'connectionManager', 'loading', 'layoutManager', 'browser', 'globalize', 'cardStyle', 'emby-checkbox'], function (appHost, appSettings, dom, connectionManager, loading, layoutManager, browser, globalize) { + 'use strict'; var enableFocusTransform = !browser.slow && !browser.edge; @@ -7,58 +7,58 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layout loading.show(); apiClient.authenticateUserByName(username, password).then(function (result) { var user = result.User; - var serverId = getParameterByName("serverid"); + var serverId = getParameterByName('serverid'); var newUrl; if (user.Policy.IsAdministrator && !serverId) { - newUrl = "dashboard.html"; + newUrl = 'dashboard.html'; } else { - newUrl = "home.html"; + newUrl = 'home.html'; } loading.hide(); Dashboard.onServerChanged(user.Id, result.AccessToken, apiClient); Dashboard.navigate(newUrl); }, function (response) { - page.querySelector("#txtManualName").value = ""; - page.querySelector("#txtManualPassword").value = ""; + page.querySelector('#txtManualName').value = ''; + page.querySelector('#txtManualPassword').value = ''; loading.hide(); const UnauthorizedOrForbidden = [401, 403]; if (UnauthorizedOrForbidden.includes(response.status)) { - require(["toast"], function (toast) { - const messageKey = response.status === 401 ? "MessageInvalidUser" : "MessageUnauthorizedUser"; + require(['toast'], function (toast) { + const messageKey = response.status === 401 ? 'MessageInvalidUser' : 'MessageUnauthorizedUser'; toast(globalize.translate(messageKey)); }); } else { Dashboard.alert({ - message: globalize.translate("MessageUnableToConnectToServer"), - title: globalize.translate("HeaderConnectionFailure") + message: globalize.translate('MessageUnableToConnectToServer'), + title: globalize.translate('HeaderConnectionFailure') }); } }); } function showManualForm(context, showCancel, focusPassword) { - context.querySelector(".chkRememberLogin").checked = appSettings.enableAutoLogin(); - context.querySelector(".manualLoginForm").classList.remove("hide"); - context.querySelector(".visualLoginForm").classList.add("hide"); - context.querySelector(".btnManual").classList.add("hide"); + context.querySelector('.chkRememberLogin').checked = appSettings.enableAutoLogin(); + context.querySelector('.manualLoginForm').classList.remove('hide'); + context.querySelector('.visualLoginForm').classList.add('hide'); + context.querySelector('.btnManual').classList.add('hide'); if (focusPassword) { - context.querySelector("#txtManualPassword").focus(); + context.querySelector('#txtManualPassword').focus(); } else { - context.querySelector("#txtManualName").focus(); + context.querySelector('#txtManualName').focus(); } if (showCancel) { - context.querySelector(".btnCancel").classList.remove("hide"); + context.querySelector('.btnCancel').classList.remove('hide'); } else { - context.querySelector(".btnCancel").classList.add("hide"); + context.querySelector('.btnCancel').classList.add('hide'); } } - var metroColors = ["#6FBD45", "#4BB3DD", "#4164A5", "#E12026", "#800080", "#E1B222", "#008040", "#0094FF", "#FF00C7", "#FF870F", "#7F0037"]; + var metroColors = ['#6FBD45', '#4BB3DD', '#4164A5', '#E12026', '#800080', '#E1B222', '#008040', '#0094FF', '#FF00C7', '#FF870F', '#7F0037']; function getRandomMetroColor() { var index = Math.floor(Math.random() * (metroColors.length - 1)); @@ -82,23 +82,23 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layout } function loadUserList(context, apiClient, users) { - var html = ""; + var html = ''; for (var i = 0; i < users.length; i++) { var user = users[i]; // TODO move card creation code to Card component - var cssClass = "card squareCard scalableCard squareCard-scalable"; + var cssClass = 'card squareCard scalableCard squareCard-scalable'; if (layoutManager.tv) { - cssClass += " show-focus"; + cssClass += ' show-focus'; if (enableFocusTransform) { - cssClass += " show-animation"; + cssClass += ' show-animation'; } } - var cardBoxCssClass = "cardBox cardBox-bottompadded"; + var cardBoxCssClass = 'cardBox cardBox-bottompadded'; html += '"; + html += '
' + user.Name + '
'; + html += ''; + html += ''; + html += ''; } - context.querySelector("#divUsers").innerHTML = html; + context.querySelector('#divUsers').innerHTML = html; } return function (view, params) { @@ -143,60 +143,60 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layout } function showVisualForm() { - view.querySelector(".visualLoginForm").classList.remove("hide"); - view.querySelector(".manualLoginForm").classList.add("hide"); - view.querySelector(".btnManual").classList.remove("hide"); + view.querySelector('.visualLoginForm').classList.remove('hide'); + view.querySelector('.manualLoginForm').classList.add('hide'); + view.querySelector('.btnManual').classList.remove('hide'); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(view); }); } - view.querySelector("#divUsers").addEventListener("click", function (e) { - var card = dom.parentWithClass(e.target, "card"); - var cardContent = card ? card.querySelector(".cardContent") : null; + view.querySelector('#divUsers').addEventListener('click', function (e) { + var card = dom.parentWithClass(e.target, 'card'); + var cardContent = card ? card.querySelector('.cardContent') : null; if (cardContent) { var context = view; - var id = cardContent.getAttribute("data-userid"); - var name = cardContent.getAttribute("data-username"); - var haspw = cardContent.getAttribute("data-haspw"); + var id = cardContent.getAttribute('data-userid'); + var name = cardContent.getAttribute('data-username'); + var haspw = cardContent.getAttribute('data-haspw'); if (id === 'manual') { - context.querySelector("#txtManualName").value = ""; + context.querySelector('#txtManualName').value = ''; showManualForm(context, true); } else if (haspw == 'false') { - authenticateUserByName(context, getApiClient(), name, ""); + authenticateUserByName(context, getApiClient(), name, ''); } else { - context.querySelector("#txtManualName").value = name; - context.querySelector("#txtManualPassword").value = ""; + context.querySelector('#txtManualName').value = name; + context.querySelector('#txtManualPassword').value = ''; showManualForm(context, true, true); } } }); - view.querySelector(".manualLoginForm").addEventListener("submit", function (e) { - appSettings.enableAutoLogin(view.querySelector(".chkRememberLogin").checked); + view.querySelector('.manualLoginForm').addEventListener('submit', function (e) { + appSettings.enableAutoLogin(view.querySelector('.chkRememberLogin').checked); var apiClient = getApiClient(); - authenticateUserByName(view, apiClient, view.querySelector("#txtManualName").value, view.querySelector("#txtManualPassword").value); + authenticateUserByName(view, apiClient, view.querySelector('#txtManualName').value, view.querySelector('#txtManualPassword').value); e.preventDefault(); return false; }); - view.querySelector(".btnForgotPassword").addEventListener("click", function () { - Dashboard.navigate("forgotpassword.html"); + view.querySelector('.btnForgotPassword').addEventListener('click', function () { + Dashboard.navigate('forgotpassword.html'); }); - view.querySelector(".btnCancel").addEventListener("click", showVisualForm); - view.querySelector(".btnManual").addEventListener("click", function () { - view.querySelector("#txtManualName").value = ""; + view.querySelector('.btnCancel').addEventListener('click', showVisualForm); + view.querySelector('.btnManual').addEventListener('click', function () { + view.querySelector('#txtManualName').value = ''; showManualForm(view, true); }); - view.querySelector(".btnSelectServer").addEventListener("click", function () { + view.querySelector('.btnSelectServer').addEventListener('click', function () { Dashboard.selectServer(); }); - view.addEventListener("viewshow", function (e) { + view.addEventListener('viewshow', function (e) { loading.show(); if (!appHost.supports('multiserver')) { - view.querySelector(".btnSelectServer").classList.add("hide"); + view.querySelector('.btnSelectServer').classList.add('hide'); } var apiClient = getApiClient(); @@ -205,14 +205,14 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layout showVisualForm(); loadUserList(view, apiClient, users); } else { - view.querySelector("#txtManualName").value = ""; + view.querySelector('#txtManualName').value = ''; showManualForm(view, false, false); } }).catch().then(function () { loading.hide(); }); - apiClient.getJSON(apiClient.getUrl("Branding/Configuration")).then(function (options) { - view.querySelector(".disclaimer").textContent = options.LoginDisclaimer || ""; + apiClient.getJSON(apiClient.getUrl('Branding/Configuration')).then(function (options) { + view.querySelector('.disclaimer').textContent = options.LoginDisclaimer || ''; }); }); }; diff --git a/src/controllers/auth/selectserver.js b/src/controllers/auth/selectserver.js index 2d2774211..ba8831348 100644 --- a/src/controllers/auth/selectserver.js +++ b/src/controllers/auth/selectserver.js @@ -1,5 +1,5 @@ -define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focusManager", "connectionManager", "globalize", "actionsheet", "dom", "browser", "material-icons", "flexStyles", "emby-scroller", "emby-itemscontainer", "cardStyle", "emby-button"], function (loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom, browser) { - "use strict"; +define(['loading', 'appRouter', 'layoutManager', 'appSettings', 'apphost', 'focusManager', 'connectionManager', 'globalize', 'actionsheet', 'dom', 'browser', 'material-icons', 'flexStyles', 'emby-scroller', 'emby-itemscontainer', 'cardStyle', 'emby-button'], function (loading, appRouter, layoutManager, appSettings, appHost, focusManager, connectionManager, globalize, actionSheet, dom, browser) { + 'use strict'; var enableFocusTransform = !browser.slow && !browser.edge; @@ -8,8 +8,8 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu return { name: server.Name, showIcon: true, - icon: "cast", - cardType: "", + icon: 'cast', + cardType: '', id: server.Id, server: server }; @@ -18,28 +18,28 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu var cardImageContainer; if (item.showIcon) { - cardImageContainer = '' + item.icon + ""; + cardImageContainer = ''; } else { cardImageContainer = '
'; } // TODO move card creation code to Card component - var cssClass = "card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable"; + var cssClass = 'card overflowSquareCard loginSquareCard scalableCard overflowSquareCard-scalable'; if (layoutManager.tv) { - cssClass += " show-focus"; + cssClass += ' show-focus'; if (enableFocusTransform) { - cssClass += " show-animation"; + cssClass += ' show-animation'; } } - var cardBoxCssClass = "cardBox"; + var cardBoxCssClass = 'cardBox'; var innerOpening = '
'; var cardContainer = ''; - cardContainer += ''; return cardContainer; - }).join(""); - var itemsContainer = view.querySelector(".servers"); + }).join(''); + var itemsContainer = view.querySelector('.servers'); if (!items.length) { - html = '

' + globalize.translate("MessageNoServersAvailable") + "

"; + html = '

' + globalize.translate('MessageNoServersAvailable') + '

'; } itemsContainer.innerHTML = html; @@ -66,20 +66,20 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu } function updatePageStyle(view, params) { - if (params.showuser == "1") { - view.classList.add("libraryPage"); - view.classList.remove("standalonePage"); - view.classList.add("noSecondaryNavPage"); + if (params.showuser == '1') { + view.classList.add('libraryPage'); + view.classList.remove('standalonePage'); + view.classList.add('noSecondaryNavPage'); } else { - view.classList.add("standalonePage"); - view.classList.remove("libraryPage"); - view.classList.remove("noSecondaryNavPage"); + view.classList.add('standalonePage'); + view.classList.remove('libraryPage'); + view.classList.remove('noSecondaryNavPage'); } } function showGeneralError() { loading.hide(); - alertText(globalize.translate("DefaultErrorMessage")); + alertText(globalize.translate('DefaultErrorMessage')); } function alertText(text) { @@ -89,13 +89,13 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu } function alertTextWithOptions(options) { - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert(options); }); } function showServerConnectionFailure() { - alertText(globalize.translate("MessageUnableToConnectToServer")); + alertText(globalize.translate('MessageUnableToConnectToServer')); } return function (view, params) { @@ -108,20 +108,20 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu var apiClient = result.ApiClient; switch (result.State) { - case "SignedIn": + case 'SignedIn': Dashboard.onServerChanged(apiClient.getCurrentUserId(), apiClient.accessToken(), apiClient); - Dashboard.navigate("home.html"); + Dashboard.navigate('home.html'); break; - case "ServerSignIn": + case 'ServerSignIn': Dashboard.onServerChanged(null, null, apiClient); - Dashboard.navigate("login.html?serverid=" + result.Servers[0].Id); + Dashboard.navigate('login.html?serverid=' + result.Servers[0].Id); break; - case "ServerUpdateNeeded": + case 'ServerUpdateNeeded': alertTextWithOptions({ - text: globalize.translate("core#ServerUpdateNeeded", "https://github.com/jellyfin/jellyfin"), - html: globalize.translate("core#ServerUpdateNeeded", 'https://github.com/jellyfin/jellyfin') + text: globalize.translate('core#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin'), + html: globalize.translate('core#ServerUpdateNeeded', 'https://github.com/jellyfin/jellyfin') }); break; @@ -142,23 +142,23 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu function onServerClick(server) { var menuItems = []; menuItems.push({ - name: globalize.translate("Connect"), - id: "connect" + name: globalize.translate('Connect'), + id: 'connect' }); menuItems.push({ - name: globalize.translate("Delete"), - id: "delete" + name: globalize.translate('Delete'), + id: 'delete' }); actionSheet.show({ items: menuItems, title: server.Name }).then(function (id) { switch (id) { - case "connect": + case 'connect': connectToServer(server); break; - case "delete": + case 'delete': deleteServer(server); } }); @@ -180,7 +180,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu var servers; updatePageStyle(view, params); - view.addEventListener("viewshow", function (e) { + view.addEventListener('viewshow', function (e) { var isRestored = e.detail.isRestored; appRouter.setTitle(null); @@ -188,16 +188,16 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu loadServers(); } }); - view.querySelector(".servers").addEventListener("click", function (e) { - var card = dom.parentWithClass(e.target, "card"); + view.querySelector('.servers').addEventListener('click', function (e) { + var card = dom.parentWithClass(e.target, 'card'); if (card) { - var url = card.getAttribute("data-url"); + var url = card.getAttribute('data-url'); if (url) { appRouter.show(url); } else { - var id = card.getAttribute("data-id"); + var id = card.getAttribute('data-id'); onServerClick(servers.filter(function (s) { return s.Id === id; })[0]); diff --git a/src/controllers/dashboard/apikeys.js b/src/controllers/dashboard/apikeys.js index 448ffa29a..f43bfd032 100644 --- a/src/controllers/dashboard/apikeys.js +++ b/src/controllers/dashboard/apikeys.js @@ -1,13 +1,13 @@ -define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"], function (datetime, loading, libraryMenu, dom, globalize) { - "use strict"; +define(['datetime', 'loading', 'libraryMenu', 'dom', 'globalize', 'emby-button'], function (datetime, loading, libraryMenu, dom, globalize) { + 'use strict'; function revoke(page, key) { - require(["confirm"], function (confirm) { - confirm(globalize.translate("MessageConfirmRevokeApiKey"), globalize.translate("HeaderConfirmRevokeApiKey")).then(function () { + require(['confirm'], function (confirm) { + confirm(globalize.translate('MessageConfirmRevokeApiKey'), globalize.translate('HeaderConfirmRevokeApiKey')).then(function () { loading.show(); ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl("Auth/Keys/" + key) + type: 'DELETE', + url: ApiClient.getUrl('Auth/Keys/' + key) }).then(function () { loadData(page); }); @@ -17,44 +17,44 @@ define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"] function renderKeys(page, keys) { var rows = keys.map(function (item) { - var html = ""; + var html = ''; html += '
'; html += '"; + html += ''; + html += ''; html += '"; + html += ''; html += '"; + html += item.AppName || ''; + html += ''; html += '"; - return html += ""; - }).join(""); - page.querySelector(".resultBody").innerHTML = rows; + html += datetime.toLocaleDateString(date) + ' ' + datetime.getDisplayTime(date); + html += ''; + return html += ''; + }).join(''); + page.querySelector('.resultBody').innerHTML = rows; loading.hide(); } function loadData(page) { loading.show(); - ApiClient.getJSON(ApiClient.getUrl("Auth/Keys")).then(function (result) { + ApiClient.getJSON(ApiClient.getUrl('Auth/Keys')).then(function (result) { renderKeys(page, result.Items); }); } function showNewKeyPrompt(page) { - require(["prompt"], function (prompt) { + require(['prompt'], function (prompt) { prompt({ - title: globalize.translate("HeaderNewApiKey"), - label: globalize.translate("LabelAppName"), - description: globalize.translate("LabelAppNameExample") + title: globalize.translate('HeaderNewApiKey'), + label: globalize.translate('LabelAppName'), + description: globalize.translate('LabelAppNameExample') }).then(function (value) { ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("Auth/Keys", { + type: 'POST', + url: ApiClient.getUrl('Auth/Keys', { App: value }) }).then(function () { @@ -64,20 +64,20 @@ define(["datetime", "loading", "libraryMenu", "dom", "globalize", "emby-button"] }); } - pageIdOn("pageinit", "apiKeysPage", function () { + pageIdOn('pageinit', 'apiKeysPage', function () { var page = this; - page.querySelector(".btnNewKey").addEventListener("click", function () { + page.querySelector('.btnNewKey').addEventListener('click', function () { showNewKeyPrompt(page); }); - page.querySelector(".tblApiKeys").addEventListener("click", function (e) { - var btnRevoke = dom.parentWithClass(e.target, "btnRevoke"); + page.querySelector('.tblApiKeys').addEventListener('click', function (e) { + var btnRevoke = dom.parentWithClass(e.target, 'btnRevoke'); if (btnRevoke) { - revoke(page, btnRevoke.getAttribute("data-token")); + revoke(page, btnRevoke.getAttribute('data-token')); } }); }); - pageIdOn("pagebeforeshow", "apiKeysPage", function () { + pageIdOn('pagebeforeshow', 'apiKeysPage', function () { loadData(this); }); }); diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 78f5cdca0..1256f6007 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -1,24 +1,24 @@ -define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globalize", "date-fns", "dfnshelper", "loading", "connectionManager", "playMethodHelper", "cardBuilder", "imageLoader", "components/activitylog", "scripts/imagehelper", "indicators", "listViewStyle", "emby-button", "flexStyles", "emby-button", "emby-itemscontainer"], function (datetime, events, itemHelper, serverNotifications, dom, globalize, datefns, dfnshelper, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper, indicators) { - "use strict"; +define(['datetime', 'events', 'itemHelper', 'serverNotifications', 'dom', 'globalize', 'date-fns', 'dfnshelper', 'loading', 'connectionManager', 'playMethodHelper', 'cardBuilder', 'imageLoader', 'components/activitylog', 'scripts/imagehelper', 'indicators', 'listViewStyle', 'emby-button', 'flexStyles', 'emby-button', 'emby-itemscontainer'], function (datetime, events, itemHelper, serverNotifications, dom, globalize, datefns, dfnshelper, loading, connectionManager, playMethodHelper, cardBuilder, imageLoader, ActivityLog, imageHelper, indicators) { + 'use strict'; function showPlaybackInfo(btn, session) { - require(["alert"], function (alert) { + require(['alert'], function (alert) { var title; var text = []; var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); - if (displayPlayMethod === "DirectStream") { - title = globalize.translate("DirectStreaming"); - text.push(globalize.translate("DirectStreamHelp1")); - text.push("
"); - text.push(globalize.translate("DirectStreamHelp2")); - } else if (displayPlayMethod === "Transcode") { - title = globalize.translate("Transcoding"); - text.push(globalize.translate("MediaIsBeingConverted")); + if (displayPlayMethod === 'DirectStream') { + title = globalize.translate('DirectStreaming'); + text.push(globalize.translate('DirectStreamHelp1')); + text.push('
'); + text.push(globalize.translate('DirectStreamHelp2')); + } else if (displayPlayMethod === 'Transcode') { + title = globalize.translate('Transcoding'); + text.push(globalize.translate('MediaIsBeingConverted')); if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { - text.push("
"); - text.push(globalize.translate("LabelReasonForTranscoding")); + text.push('
'); + text.push(globalize.translate('LabelReasonForTranscoding')); session.TranscodingInfo.TranscodeReasons.forEach(function (transcodeReason) { text.push(globalize.translate(transcodeReason)); }); @@ -26,18 +26,18 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } alert({ - text: text.join("
"), + text: text.join('
'), title: title }); }); } function showSendMessageForm(btn, session) { - require(["prompt"], function (prompt) { + require(['prompt'], function (prompt) { prompt({ - title: globalize.translate("HeaderSendMessage"), - label: globalize.translate("LabelMessageText"), - confirmText: globalize.translate("ButtonSend") + title: globalize.translate('HeaderSendMessage'), + label: globalize.translate('LabelMessageText'), + confirmText: globalize.translate('ButtonSend') }).then(function (text) { if (text) { connectionManager.getApiClient(session.ServerId).sendMessageCommand(session.Id, { @@ -50,20 +50,20 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } function showOptionsMenu(btn, session) { - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { var menuItems = []; if (session.ServerId && session.DeviceId !== connectionManager.deviceId()) { menuItems.push({ - name: globalize.translate("SendMessage"), - id: "sendmessage" + name: globalize.translate('SendMessage'), + id: 'sendmessage' }); } if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length) { menuItems.push({ - name: globalize.translate("ViewPlaybackInfo"), - id: "transcodinginfo" + name: globalize.translate('ViewPlaybackInfo'), + id: 'transcodinginfo' }); } @@ -72,11 +72,11 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa positionTo: btn }).then(function (id) { switch (id) { - case "sendmessage": + case 'sendmessage': showSendMessageForm(btn, session); break; - case "transcodinginfo": + case 'transcodinginfo': showPlaybackInfo(btn, session); } }); @@ -84,28 +84,28 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } function onActiveDevicesClick(evt) { - var btn = dom.parentWithClass(evt.target, "sessionCardButton"); + var btn = dom.parentWithClass(evt.target, 'sessionCardButton'); if (btn) { - var card = dom.parentWithClass(btn, "card"); + var card = dom.parentWithClass(btn, 'card'); if (card) { var sessionId = card.id; var session = (DashboardPage.sessionsList || []).filter(function (dashboardSession) { - return "session" + dashboardSession.Id === sessionId; + return 'session' + dashboardSession.Id === sessionId; })[0]; if (session) { - if (btn.classList.contains("btnCardOptions")) { + if (btn.classList.contains('btnCardOptions')) { showOptionsMenu(btn, session); - } else if (btn.classList.contains("btnSessionInfo")) { + } else if (btn.classList.contains('btnSessionInfo')) { showPlaybackInfo(btn, session); - } else if (btn.classList.contains("btnSessionSendMessage")) { + } else if (btn.classList.contains('btnSessionSendMessage')) { showSendMessageForm(btn, session); - } else if (btn.classList.contains("btnSessionStop")) { - connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "Stop"); - } else if (btn.classList.contains("btnSessionPlayPause") && session.PlayState) { - connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, "PlayPause"); + } else if (btn.classList.contains('btnSessionStop')) { + connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, 'Stop'); + } else if (btn.classList.contains('btnSessionPlayPause') && session.PlayState) { + connectionManager.getApiClient(session.ServerId).sendPlayStateCommand(session.Id, 'PlayPause'); } } } @@ -135,31 +135,31 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa apiClient.getLiveTvRecordings({ UserId: Dashboard.getCurrentUserId(), IsInProgress: true, - Fields: "CanDelete,PrimaryImageAspectRatio", + Fields: 'CanDelete,PrimaryImageAspectRatio', EnableTotalRecordCount: false, - EnableImageTypes: "Primary,Thumb,Backdrop" + EnableImageTypes: 'Primary,Thumb,Backdrop' }).then(function (result) { - var itemsContainer = view.querySelector(".activeRecordingItems"); + var itemsContainer = view.querySelector('.activeRecordingItems'); if (!result.Items.length) { - view.querySelector(".activeRecordingsSection").classList.add("hide"); - return void(itemsContainer.innerHTML = ""); + view.querySelector('.activeRecordingsSection').classList.add('hide'); + return void(itemsContainer.innerHTML = ''); } - view.querySelector(".activeRecordingsSection").classList.remove("hide"); + view.querySelector('.activeRecordingsSection').classList.remove('hide'); itemsContainer.innerHTML = cardBuilder.getCardsHtml({ items: result.Items, - shape: "auto", - defaultShape: "backdrop", + shape: 'auto', + defaultShape: 'backdrop', showTitle: true, showParentTitle: true, coverImage: true, cardLayout: false, centerText: true, - preferThumb: "auto", + preferThumb: 'auto', overlayText: false, overlayMoreButton: true, - action: "none", + action: 'none', centerPlayButton: true }); imageLoader.lazyChildren(itemsContainer); @@ -168,28 +168,28 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa function reloadSystemInfo(view, apiClient) { apiClient.getSystemInfo().then(function (systemInfo) { - view.querySelector("#serverName").innerHTML = globalize.translate("DashboardServerName", systemInfo.ServerName); - var localizedVersion = globalize.translate("DashboardVersionNumber", systemInfo.Version); + view.querySelector('#serverName').innerHTML = globalize.translate('DashboardServerName', systemInfo.ServerName); + var localizedVersion = globalize.translate('DashboardVersionNumber', systemInfo.Version); - if (systemInfo.SystemUpdateLevel !== "Release") { - localizedVersion += " " + systemInfo.SystemUpdateLevel; + if (systemInfo.SystemUpdateLevel !== 'Release') { + localizedVersion += ' ' + systemInfo.SystemUpdateLevel; } - view.querySelector("#versionNumber").innerHTML = localizedVersion; - view.querySelector("#operatingSystem").innerHTML = globalize.translate("DashboardOperatingSystem", systemInfo.OperatingSystem); - view.querySelector("#architecture").innerHTML = globalize.translate("DashboardArchitecture", systemInfo.SystemArchitecture); + view.querySelector('#versionNumber').innerHTML = localizedVersion; + view.querySelector('#operatingSystem').innerHTML = globalize.translate('DashboardOperatingSystem', systemInfo.OperatingSystem); + view.querySelector('#architecture').innerHTML = globalize.translate('DashboardArchitecture', systemInfo.SystemArchitecture); if (systemInfo.CanSelfRestart) { - view.querySelector("#btnRestartServer").classList.remove("hide"); + view.querySelector('#btnRestartServer').classList.remove('hide'); } else { - view.querySelector("#btnRestartServer").classList.add("hide"); + view.querySelector('#btnRestartServer').classList.add('hide'); } - view.querySelector("#cachePath").innerHTML = systemInfo.CachePath; - view.querySelector("#logPath").innerHTML = systemInfo.LogPath; - view.querySelector("#transcodePath").innerHTML = systemInfo.TranscodingTempPath; - view.querySelector("#metadataPath").innerHTML = systemInfo.InternalMetadataPath; - view.querySelector("#webPath").innerHTML = systemInfo.WebPath; + view.querySelector('#cachePath').innerHTML = systemInfo.CachePath; + view.querySelector('#logPath').innerHTML = systemInfo.LogPath; + view.querySelector('#transcodePath').innerHTML = systemInfo.TranscodingTempPath; + view.querySelector('#metadataPath').innerHTML = systemInfo.InternalMetadataPath; + view.querySelector('#webPath').innerHTML = systemInfo.WebPath; }); } @@ -211,25 +211,25 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } function renderActiveConnections(view, sessions) { - var html = ""; + var html = ''; DashboardPage.sessionsList = sessions; - var parentElement = view.querySelector(".activeDevices"); - var cardElem = parentElement.querySelector(".card"); + var parentElement = view.querySelector('.activeDevices'); + var cardElem = parentElement.querySelector('.card'); if (cardElem) { - cardElem.classList.add("deadSession"); + cardElem.classList.add('deadSession'); } for (var i = 0, length = sessions.length; i < length; i++) { var session = sessions[i]; - var rowId = "session" + session.Id; - var elem = view.querySelector("#" + rowId); + var rowId = 'session' + session.Id; + var elem = view.querySelector('#' + rowId); if (elem) { DashboardPage.updateSession(elem, session); } else { var nowPlayingItem = session.NowPlayingItem; - var className = "scalableCard card activeSession backdropCard backdropCard-scalable"; + var className = 'scalableCard card activeSession backdropCard backdropCard-scalable'; html += '
'; html += '
'; html += '
'; @@ -253,13 +253,13 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } html += '
'; - html += '
' + session.DeviceName + "
"; - html += '
' + DashboardPage.getAppSecondaryText(session) + "
"; - html += "
"; - html += "
"; + html += '
' + session.DeviceName + '
'; + html += '
' + DashboardPage.getAppSecondaryText(session) + '
'; + html += '
'; + html += '
'; if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { - html += '
' + session.TranscodingInfo.Framerate + " fps
"; + html += '
' + session.TranscodingInfo.Framerate + ' fps
'; } else { html += '
'; } @@ -268,56 +268,56 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa var nowPlayingName = DashboardPage.getNowPlayingName(session); html += '
'; html += nowPlayingName.html; - html += "
"; - html += '
' + DashboardPage.getSessionNowPlayingTime(session) + "
"; + html += ''; + html += '
' + DashboardPage.getSessionNowPlayingTime(session) + '
'; html += ''; if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks; html += indicators.getProgressHtml(percent, { - containerClass: "playbackProgress" + containerClass: 'playbackProgress' }); } else { // need to leave the element in just in case the device starts playback html += indicators.getProgressHtml(0, { - containerClass: "playbackProgress hide" + containerClass: 'playbackProgress hide' }); } if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); html += indicators.getProgressHtml(percent, { - containerClass: "transcodingProgress" + containerClass: 'transcodingProgress' }); } else { // same issue as playbackProgress element above html += indicators.getProgressHtml(0, { - containerClass: "transcodingProgress hide" + containerClass: 'transcodingProgress hide' }); } - html += ""; - html += ""; - html += ""; + html += ''; + html += ''; + html += ''; html += '
'; html += '
'; - var btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl ? "" : " hide"; - var playIcon = session.PlayState.IsPaused ? 'pause' : 'play'; + var btnCssClass = session.ServerId && session.NowPlayingItem && session.SupportsRemoteControl ? '' : ' hide'; + const playIcon = session.PlayState.IsPaused ? 'pause' : 'play_arrow'; - html += ''; - html += ''; + html += ''; + html += ''; - btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? "" : " hide"; - html += ''; + btnCssClass = session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo.TranscodeReasons.length ? '' : ' hide'; + html += ''; - btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId() ? "" : " hide"; - html += ''; - html += "
"; + btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf('DisplayMessage') && session.DeviceId !== connectionManager.deviceId() ? '' : ' hide'; + html += ''; + html += '
'; html += '
'; html += DashboardPage.getSessionNowPlayingStreamInfo(session); - html += "
"; + html += ''; html += '
'; var userImage = DashboardPage.getUserImage(session); @@ -325,16 +325,16 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa html += '
'; html += DashboardPage.getUsersHtml(session); - html += "
"; - html += "
"; - html += ""; - html += ""; - html += ""; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; } } - parentElement.insertAdjacentHTML("beforeend", html); - var deadSessionElem = parentElement.querySelector(".deadSession"); + parentElement.insertAdjacentHTML('beforeend', html); + var deadSessionElem = parentElement.querySelector('.deadSession'); if (deadSessionElem) { deadSessionElem.parentNode.removeChild(deadSessionElem); @@ -342,9 +342,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } function renderRunningTasks(view, tasks) { - var html = ""; + var html = ''; tasks = tasks.filter(function (task) { - if ("Idle" != task.State) { + if ('Idle' != task.State) { return !task.IsHidden; } @@ -352,59 +352,59 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa }); if (tasks.length) { - view.querySelector(".runningTasksContainer").classList.remove("hide"); + view.querySelector('.runningTasksContainer').classList.remove('hide'); } else { - view.querySelector(".runningTasksContainer").classList.add("hide"); + view.querySelector('.runningTasksContainer').classList.add('hide'); } for (var i = 0, length = tasks.length; i < length; i++) { var task = tasks[i]; - html += "

"; - html += task.Name + "
"; + html += '

'; + html += task.Name + '
'; - if (task.State === "Running") { + if (task.State === 'Running') { var progress = (task.CurrentProgressPercentage || 0).toFixed(1); html += ''; - html += progress + "%"; - html += ""; - html += "" + progress + "%"; - html += ''; - } else if (task.State === "Cancelling") { - html += '' + globalize.translate("LabelStopping") + ""; + html += progress + '%'; + html += ''; + html += "" + progress + '%'; + html += ''; + } else if (task.State === 'Cancelling') { + html += '' + globalize.translate('LabelStopping') + ''; } - html += "

"; + html += '

'; } - view.querySelector("#divRunningTasks").innerHTML = html; + view.querySelector('#divRunningTasks').innerHTML = html; } window.DashboardPage = { startInterval: function (apiClient) { - apiClient.sendMessage("SessionsStart", "0,1500"); - apiClient.sendMessage("ScheduledTasksInfoStart", "0,1000"); + apiClient.sendMessage('SessionsStart', '0,1500'); + apiClient.sendMessage('ScheduledTasksInfoStart', '0,1000'); }, stopInterval: function (apiClient) { - apiClient.sendMessage("SessionsStop"); - apiClient.sendMessage("ScheduledTasksInfoStop"); + apiClient.sendMessage('SessionsStop'); + apiClient.sendMessage('ScheduledTasksInfoStop'); }, getSessionNowPlayingStreamInfo: function (session) { - var html = ""; + var html = ''; var showTranscodingInfo = false; var displayPlayMethod = playMethodHelper.getDisplayPlayMethod(session); - if (displayPlayMethod === "DirectStream") { - html += globalize.translate("DirectStreaming"); - } else if (displayPlayMethod === "Transcode") { - html += globalize.translate("Transcoding"); + if (displayPlayMethod === 'DirectStream') { + html += globalize.translate('DirectStreaming'); + } else if (displayPlayMethod === 'Transcode') { + html += globalize.translate('Transcoding'); if (session.TranscodingInfo && session.TranscodingInfo.Framerate) { - html += " (" + session.TranscodingInfo.Framerate + " fps)"; + html += ' (' + session.TranscodingInfo.Framerate + ' fps)'; } showTranscodingInfo = true; - } else if (displayPlayMethod === "DirectPlay") { - html += globalize.translate("DirectPlaying"); + } else if (displayPlayMethod === 'DirectPlay') { + html += globalize.translate('DirectPlaying'); } if (showTranscodingInfo) { @@ -413,9 +413,9 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (session.TranscodingInfo) { if (session.TranscodingInfo.Bitrate) { if (session.TranscodingInfo.Bitrate > 1e6) { - line.push((session.TranscodingInfo.Bitrate / 1e6).toFixed(1) + " Mbps"); + line.push((session.TranscodingInfo.Bitrate / 1e6).toFixed(1) + ' Mbps'); } else { - line.push(Math.floor(session.TranscodingInfo.Bitrate / 1e3) + " Kbps"); + line.push(Math.floor(session.TranscodingInfo.Bitrate / 1e3) + ' Kbps'); } } @@ -433,7 +433,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } if (line.length) { - html += " - " + line.join(" "); + html += ' - ' + line.join(' '); } } @@ -441,43 +441,43 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa }, getSessionNowPlayingTime: function (session) { var nowPlayingItem = session.NowPlayingItem; - var html = ""; + var html = ''; if (nowPlayingItem) { if (session.PlayState.PositionTicks) { html += datetime.getDisplayRunningTime(session.PlayState.PositionTicks); } else { - html += "0:00"; + html += '0:00'; } - html += " / "; + html += ' / '; if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { html += datetime.getDisplayRunningTime(nowPlayingItem.RunTimeTicks); } else { - html += "0:00"; + html += '0:00'; } } return html; }, getAppSecondaryText: function (session) { - return session.Client + " " + session.ApplicationVersion; + return session.Client + ' ' + session.ApplicationVersion; }, getNowPlayingName: function (session) { - var imgUrl = ""; + var imgUrl = ''; var nowPlayingItem = session.NowPlayingItem; // FIXME: It seems that, sometimes, server sends date in the future, so date-fns displays messages like 'in less than a minute'. We should fix // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences if (!nowPlayingItem) { return { - html: globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), dfnshelper.localeWithSuffix)), + html: globalize.translate('LastSeen', datefns.formatDistanceToNow(Date.parse(session.LastActivityDate), dfnshelper.localeWithSuffix)), image: imgUrl }; } var topText = itemHelper.getDisplayName(nowPlayingItem); - var bottomText = ""; + var bottomText = ''; if (nowPlayingItem.Artists && nowPlayingItem.Artists.length) { bottomText = topText; @@ -496,14 +496,14 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa tag: nowPlayingItem.ImageTags.Logo, maxHeight: 24, maxWidth: 130, - type: "Logo" + type: 'Logo' }); } else if (nowPlayingItem.ParentLogoImageTag) { imgUrl = ApiClient.getScaledImageUrl(nowPlayingItem.ParentLogoItemId, { tag: nowPlayingItem.ParentLogoImageTag, maxHeight: 24, maxWidth: 130, - type: "Logo" + type: 'Logo' }); } @@ -512,7 +512,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } return { - html: bottomText ? topText + "
" + bottomText : topText, + html: bottomText ? topText + '
' + bottomText : topText, image: imgUrl }; }, @@ -527,106 +527,104 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa html.push(session.AdditionalUsers[i].UserName); } - return html.join(", "); + return html.join(', '); }, getUserImage: function (session) { if (session.UserId && session.UserPrimaryImageTag) { return ApiClient.getUserImageUrl(session.UserId, { tag: session.UserPrimaryImageTag, - type: "Primary" + type: 'Primary' }); } return null; }, updateSession: function (row, session) { - row.classList.remove("deadSession"); + row.classList.remove('deadSession'); var nowPlayingItem = session.NowPlayingItem; if (nowPlayingItem) { - row.classList.add("playingSession"); + row.classList.add('playingSession'); } else { - row.classList.remove("playingSession"); + row.classList.remove('playingSession'); } - if (session.ServerId && -1 !== session.SupportedCommands.indexOf("DisplayMessage") && session.DeviceId !== connectionManager.deviceId()) { - row.querySelector(".btnSessionSendMessage").classList.remove("hide"); + if (session.ServerId && -1 !== session.SupportedCommands.indexOf('DisplayMessage') && session.DeviceId !== connectionManager.deviceId()) { + row.querySelector('.btnSessionSendMessage').classList.remove('hide'); } else { - row.querySelector(".btnSessionSendMessage").classList.add("hide"); + row.querySelector('.btnSessionSendMessage').classList.add('hide'); } if (session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons && session.TranscodingInfo && session.TranscodingInfo.TranscodeReasons.length) { - row.querySelector(".btnSessionInfo").classList.remove("hide"); + row.querySelector('.btnSessionInfo').classList.remove('hide'); } else { - row.querySelector(".btnSessionInfo").classList.add("hide"); + row.querySelector('.btnSessionInfo').classList.add('hide'); } - var btnSessionPlayPause = row.querySelector(".btnSessionPlayPause"); + var btnSessionPlayPause = row.querySelector('.btnSessionPlayPause'); if (session.ServerId && nowPlayingItem && session.SupportsRemoteControl && session.DeviceId !== connectionManager.deviceId()) { - btnSessionPlayPause.classList.remove("hide"); - row.querySelector(".btnSessionStop").classList.remove("hide"); + btnSessionPlayPause.classList.remove('hide'); + row.querySelector('.btnSessionStop').classList.remove('hide'); } else { - btnSessionPlayPause.classList.add("hide"); - row.querySelector(".btnSessionStop").classList.add("hide"); + btnSessionPlayPause.classList.add('hide'); + row.querySelector('.btnSessionStop').classList.add('hide'); } - if (session.PlayState && session.PlayState.IsPaused) { - btnSessionPlayPause.querySelector("i").innerHTML = ""; - } else { - btnSessionPlayPause.querySelector("i").innerHTML = "pause"; - } + const btnSessionPlayPauseIcon = btnSessionPlayPause.querySelector('.material-icons'); + btnSessionPlayPauseIcon.classList.remove('play_arrow', 'pause'); + btnSessionPlayPauseIcon.classList.add(session.PlayState && session.PlayState.IsPaused ? 'play_arrow' : 'pause'); - row.querySelector(".sessionNowPlayingStreamInfo").innerHTML = DashboardPage.getSessionNowPlayingStreamInfo(session); - row.querySelector(".sessionNowPlayingTime").innerHTML = DashboardPage.getSessionNowPlayingTime(session); - row.querySelector(".sessionUserName").innerHTML = DashboardPage.getUsersHtml(session); - row.querySelector(".sessionAppSecondaryText").innerHTML = DashboardPage.getAppSecondaryText(session); - row.querySelector(".sessionTranscodingFramerate").innerHTML = session.TranscodingInfo && session.TranscodingInfo.Framerate ? session.TranscodingInfo.Framerate + " fps" : ""; + row.querySelector('.sessionNowPlayingStreamInfo').innerHTML = DashboardPage.getSessionNowPlayingStreamInfo(session); + row.querySelector('.sessionNowPlayingTime').innerHTML = DashboardPage.getSessionNowPlayingTime(session); + row.querySelector('.sessionUserName').innerHTML = DashboardPage.getUsersHtml(session); + row.querySelector('.sessionAppSecondaryText').innerHTML = DashboardPage.getAppSecondaryText(session); + row.querySelector('.sessionTranscodingFramerate').innerHTML = session.TranscodingInfo && session.TranscodingInfo.Framerate ? session.TranscodingInfo.Framerate + ' fps' : ''; var nowPlayingName = DashboardPage.getNowPlayingName(session); - var nowPlayingInfoElem = row.querySelector(".sessionNowPlayingInfo"); + var nowPlayingInfoElem = row.querySelector('.sessionNowPlayingInfo'); - if (!(nowPlayingName.image && nowPlayingName.image == nowPlayingInfoElem.getAttribute("data-imgsrc"))) { + if (!(nowPlayingName.image && nowPlayingName.image == nowPlayingInfoElem.getAttribute('data-imgsrc'))) { nowPlayingInfoElem.innerHTML = nowPlayingName.html; - nowPlayingInfoElem.setAttribute("data-imgsrc", nowPlayingName.image || ""); + nowPlayingInfoElem.setAttribute('data-imgsrc', nowPlayingName.image || ''); } - var playbackProgressElem = row.querySelector(".playbackProgress"); + var playbackProgressElem = row.querySelector('.playbackProgress'); if (nowPlayingItem && nowPlayingItem.RunTimeTicks) { var percent = 100 * (session.PlayState.PositionTicks || 0) / nowPlayingItem.RunTimeTicks; playbackProgressElem.outerHTML = indicators.getProgressHtml(percent, { - containerClass: "playbackProgress" + containerClass: 'playbackProgress' }); } else { playbackProgressElem.outerHTML = indicators.getProgressHtml(0, { - containerClass: "playbackProgress hide" + containerClass: 'playbackProgress hide' }); } - var transcodingProgress = row.querySelector(".transcodingProgress"); + var transcodingProgress = row.querySelector('.transcodingProgress'); if (session.TranscodingInfo && session.TranscodingInfo.CompletionPercentage) { var percent = session.TranscodingInfo.CompletionPercentage.toFixed(1); transcodingProgress.outerHTML = indicators.getProgressHtml(percent, { - containerClass: "transcodingProgress" + containerClass: 'transcodingProgress' }); } else { transcodingProgress.outerHTML = indicators.getProgressHtml(0, { - containerClass: "transcodingProgress hide" + containerClass: 'transcodingProgress hide' }); } - var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || ""; - var imgElem = row.querySelector(".sessionNowPlayingContent"); + var imgUrl = DashboardPage.getNowPlayingImageUrl(nowPlayingItem) || ''; + var imgElem = row.querySelector('.sessionNowPlayingContent'); - if (imgUrl != imgElem.getAttribute("data-src")) { - imgElem.style.backgroundImage = imgUrl ? "url('" + imgUrl + "')" : ""; - imgElem.setAttribute("data-src", imgUrl); + if (imgUrl != imgElem.getAttribute('data-src')) { + imgElem.style.backgroundImage = imgUrl ? "url('" + imgUrl + "')" : ''; + imgElem.setAttribute('data-src', imgUrl); if (imgUrl) { - imgElem.classList.add("sessionNowPlayingContent-withbackground"); + imgElem.classList.add('sessionNowPlayingContent-withbackground'); } else { - imgElem.classList.remove("sessionNowPlayingContent-withbackground"); + imgElem.classList.remove('sessionNowPlayingContent-withbackground'); } } }, @@ -640,7 +638,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (item && item.BackdropImageTags && item.BackdropImageTags.length) { return ApiClient.getScaledImageUrl(item.Id, { maxWidth: Math.round(dom.getScreenWidth() * 0.20), - type: "Backdrop", + type: 'Backdrop', tag: item.BackdropImageTags[0] }); } @@ -648,7 +646,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (item && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { return ApiClient.getScaledImageUrl(item.ParentBackdropItemId, { maxWidth: Math.round(dom.getScreenWidth() * 0.20), - type: "Backdrop", + type: 'Backdrop', tag: item.ParentBackdropImageTags[0] }); } @@ -656,7 +654,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (item && item.BackdropImageTag) { return ApiClient.getScaledImageUrl(item.BackdropItemId, { maxWidth: Math.round(dom.getScreenWidth() * 0.20), - type: "Backdrop", + type: 'Backdrop', tag: item.BackdropImageTag }); } @@ -666,7 +664,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (item && imageTags.Thumb) { return ApiClient.getScaledImageUrl(item.Id, { maxWidth: Math.round(dom.getScreenWidth() * 0.20), - type: "Thumb", + type: 'Thumb', tag: imageTags.Thumb }); } @@ -674,7 +672,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (item && item.ParentThumbImageTag) { return ApiClient.getScaledImageUrl(item.ParentThumbItemId, { maxWidth: Math.round(dom.getScreenWidth() * 0.20), - type: "Thumb", + type: 'Thumb', tag: item.ParentThumbImageTag }); } @@ -682,7 +680,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (item && item.ThumbImageTag) { return ApiClient.getScaledImageUrl(item.ThumbItemId, { maxWidth: Math.round(dom.getScreenWidth() * 0.20), - type: "Thumb", + type: 'Thumb', tag: item.ThumbImageTag }); } @@ -690,7 +688,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (item && imageTags.Primary) { return ApiClient.getScaledImageUrl(item.Id, { maxWidth: Math.round(dom.getScreenWidth() * 0.20), - type: "Primary", + type: 'Primary', tag: imageTags.Primary }); } @@ -698,7 +696,7 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (item && item.PrimaryImageTag) { return ApiClient.getScaledImageUrl(item.PrimaryImageItemId, { maxWidth: Math.round(dom.getScreenWidth() * 0.20), - type: "Primary", + type: 'Primary', tag: item.PrimaryImageTag }); } @@ -706,46 +704,46 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa if (item && item.AlbumPrimaryImageTag) { return ApiClient.getScaledImageUrl(item.AlbumId, { maxWidth: Math.round(dom.getScreenWidth() * 0.20), - type: "Primary", + type: 'Primary', tag: item.AlbumPrimaryImageTag }); } return null; }, - systemUpdateTaskKey: "SystemUpdateTask", + systemUpdateTaskKey: 'SystemUpdateTask', stopTask: function (btn, id) { - var page = dom.parentWithClass(btn, "page"); + var page = dom.parentWithClass(btn, 'page'); ApiClient.stopScheduledTask(id).then(function () { pollForInfo(page, ApiClient); }); }, restart: function (btn) { - require(["confirm"], function (confirm) { + require(['confirm'], function (confirm) { confirm({ - title: globalize.translate("HeaderRestart"), - text: globalize.translate("MessageConfirmRestart"), - confirmText: globalize.translate("ButtonRestart"), - primary: "delete" + title: globalize.translate('HeaderRestart'), + text: globalize.translate('MessageConfirmRestart'), + confirmText: globalize.translate('ButtonRestart'), + primary: 'delete' }).then(function () { - var page = dom.parentWithClass(btn, "page"); - page.querySelector("#btnRestartServer").disabled = true; - page.querySelector("#btnShutdown").disabled = true; + var page = dom.parentWithClass(btn, 'page'); + page.querySelector('#btnRestartServer').disabled = true; + page.querySelector('#btnShutdown').disabled = true; ApiClient.restartServer(); }); }); }, shutdown: function (btn) { - require(["confirm"], function (confirm) { + require(['confirm'], function (confirm) { confirm({ - title: globalize.translate("HeaderShutdown"), - text: globalize.translate("MessageConfirmShutdown"), - confirmText: globalize.translate("ButtonShutdown"), - primary: "delete" + title: globalize.translate('HeaderShutdown'), + text: globalize.translate('MessageConfirmShutdown'), + confirmText: globalize.translate('ButtonShutdown'), + primary: 'delete' }).then(function () { - var page = dom.parentWithClass(btn, "page"); - page.querySelector("#btnRestartServer").disabled = true; - page.querySelector("#btnShutdown").disabled = true; + var page = dom.parentWithClass(btn, 'page'); + page.querySelector('#btnRestartServer').disabled = true; + page.querySelector('#btnShutdown').disabled = true; ApiClient.shutdownServer(); }); }); @@ -791,8 +789,8 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa } var serverId = ApiClient.serverId(); - view.querySelector(".activeDevices").addEventListener("click", onActiveDevicesClick); - view.addEventListener("viewshow", function () { + view.querySelector('.activeDevices').addEventListener('click', onActiveDevicesClick); + view.addEventListener('viewshow', function () { var page = this; var apiClient = ApiClient; @@ -800,28 +798,28 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa loading.show(); pollForInfo(page, apiClient); DashboardPage.startInterval(apiClient); - events.on(serverNotifications, "RestartRequired", onRestartRequired); - events.on(serverNotifications, "ServerShuttingDown", onServerShuttingDown); - events.on(serverNotifications, "ServerRestarting", onServerRestarting); - events.on(serverNotifications, "PackageInstalling", onPackageInstalling); - events.on(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted); - events.on(serverNotifications, "Sessions", onSessionsUpdate); - events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + events.on(serverNotifications, 'RestartRequired', onRestartRequired); + events.on(serverNotifications, 'ServerShuttingDown', onServerShuttingDown); + events.on(serverNotifications, 'ServerRestarting', onServerRestarting); + events.on(serverNotifications, 'PackageInstalling', onPackageInstalling); + events.on(serverNotifications, 'PackageInstallationCompleted', onPackageInstallationCompleted); + events.on(serverNotifications, 'Sessions', onSessionsUpdate); + events.on(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate); DashboardPage.lastAppUpdateCheck = null; reloadSystemInfo(page, ApiClient); if (!page.userActivityLog) { page.userActivityLog = new ActivityLog({ serverId: ApiClient.serverId(), - element: page.querySelector(".userActivityItems") + element: page.querySelector('.userActivityItems') }); } - if (ApiClient.isMinServerVersion("3.4.1.25")) { + if (ApiClient.isMinServerVersion('3.4.1.25')) { if (!page.serverActivityLog) { page.serverActivityLog = new ActivityLog({ serverId: ApiClient.serverId(), - element: page.querySelector(".serverActivityItems") + element: page.querySelector('.serverActivityItems') }); } } @@ -830,21 +828,21 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa loading.hide(); } }); - view.addEventListener("viewbeforehide", function () { + view.addEventListener('viewbeforehide', function () { var apiClient = ApiClient; - events.off(serverNotifications, "RestartRequired", onRestartRequired); - events.off(serverNotifications, "ServerShuttingDown", onServerShuttingDown); - events.off(serverNotifications, "ServerRestarting", onServerRestarting); - events.off(serverNotifications, "PackageInstalling", onPackageInstalling); - events.off(serverNotifications, "PackageInstallationCompleted", onPackageInstallationCompleted); - events.off(serverNotifications, "Sessions", onSessionsUpdate); - events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + events.off(serverNotifications, 'RestartRequired', onRestartRequired); + events.off(serverNotifications, 'ServerShuttingDown', onServerShuttingDown); + events.off(serverNotifications, 'ServerRestarting', onServerRestarting); + events.off(serverNotifications, 'PackageInstalling', onPackageInstalling); + events.off(serverNotifications, 'PackageInstallationCompleted', onPackageInstallationCompleted); + events.off(serverNotifications, 'Sessions', onSessionsUpdate); + events.off(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate); if (apiClient) { DashboardPage.stopInterval(apiClient); } }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { var page = this; var userActivityLog = page.userActivityLog; diff --git a/src/controllers/dashboard/devices/device.js b/src/controllers/dashboard/devices/device.js index cfe7efbe7..9ff3f5902 100644 --- a/src/controllers/dashboard/devices/device.js +++ b/src/controllers/dashboard/devices/device.js @@ -1,19 +1,19 @@ -define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function (loading, libraryMenu, dom) { - "use strict"; +define(['loading', 'libraryMenu', 'dom', 'emby-input', 'emby-button'], function (loading, libraryMenu, dom) { + 'use strict'; function load(page, device, deviceOptions) { - page.querySelector("#txtCustomName", page).value = deviceOptions.CustomName || ""; - page.querySelector(".reportedName", page).innerHTML = device.Name || ""; + page.querySelector('#txtCustomName', page).value = deviceOptions.CustomName || ''; + page.querySelector('.reportedName', page).innerHTML = device.Name || ''; } function loadData() { var page = this; loading.show(); - var id = getParameterByName("id"); - var promise1 = ApiClient.getJSON(ApiClient.getUrl("Devices/Info", { + var id = getParameterByName('id'); + var promise1 = ApiClient.getJSON(ApiClient.getUrl('Devices/Info', { Id: id })); - var promise2 = ApiClient.getJSON(ApiClient.getUrl("Devices/Options", { + var promise2 = ApiClient.getJSON(ApiClient.getUrl('Devices/Options', { Id: id })); Promise.all([promise1, promise2]).then(function (responses) { @@ -23,28 +23,28 @@ define(["loading", "libraryMenu", "dom", "emby-input", "emby-button"], function } function save(page) { - var id = getParameterByName("id"); + var id = getParameterByName('id'); ApiClient.ajax({ - url: ApiClient.getUrl("Devices/Options", { + url: ApiClient.getUrl('Devices/Options', { Id: id }), - type: "POST", + type: 'POST', data: JSON.stringify({ - CustomName: page.querySelector("#txtCustomName").value + CustomName: page.querySelector('#txtCustomName').value }), - contentType: "application/json" + contentType: 'application/json' }).then(Dashboard.processServerConfigurationUpdateResult); } function onSubmit(e) { var form = this; - save(dom.parentWithClass(form, "page")); + save(dom.parentWithClass(form, 'page')); e.preventDefault(); return false; } return function (view, params) { - view.querySelector("form").addEventListener("submit", onSubmit); - view.addEventListener("viewshow", loadData); + view.querySelector('form').addEventListener('submit', onSubmit); + view.addEventListener('viewshow', loadData); }; }); diff --git a/src/controllers/dashboard/devices/devices.js b/src/controllers/dashboard/devices/devices.js index 7401e17c0..0dea81c75 100644 --- a/src/controllers/dashboard/devices/devices.js +++ b/src/controllers/dashboard/devices/devices.js @@ -1,24 +1,24 @@ -define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "date-fns", "dfnshelper", "emby-button", "emby-itemscontainer", "cardStyle"], function (loading, dom, libraryMenu, globalize, imageHelper, datefns, dfnshelper) { - "use strict"; +define(['loading', 'dom', 'libraryMenu', 'globalize', 'scripts/imagehelper', 'date-fns', 'dfnshelper', 'emby-button', 'emby-itemscontainer', 'cardStyle'], function (loading, dom, libraryMenu, globalize, imageHelper, datefns, dfnshelper) { + 'use strict'; function canDelete(deviceId) { return deviceId !== ApiClient.deviceId(); } function deleteDevice(page, id) { - var msg = globalize.translate("DeleteDeviceConfirmation"); + var msg = globalize.translate('DeleteDeviceConfirmation'); - require(["confirm"], function (confirm) { + require(['confirm'], function (confirm) { confirm({ text: msg, - title: globalize.translate("HeaderDeleteDevice"), - confirmText: globalize.translate("ButtonDelete"), - primary: "delete" + title: globalize.translate('HeaderDeleteDevice'), + confirmText: globalize.translate('ButtonDelete'), + primary: 'delete' }).then(function () { loading.show(); ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl("Devices", { + type: 'DELETE', + url: ApiClient.getUrl('Devices', { Id: id }) }).then(function () { @@ -33,31 +33,31 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "da if (canEdit) { menuItems.push({ - name: globalize.translate("Edit"), - id: "open", - icon: "mode_edit" + name: globalize.translate('Edit'), + id: 'open', + icon: 'mode_edit' }); } if (canDelete(deviceId)) { menuItems.push({ - name: globalize.translate("Delete"), - id: "delete", - icon: "delete" + name: globalize.translate('Delete'), + id: 'delete', + icon: 'delete' }); } - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: menuItems, positionTo: btn, callback: function (id) { switch (id) { - case "open": - Dashboard.navigate("device.html?id=" + deviceId); + case 'open': + Dashboard.navigate('device.html?id=' + deviceId); break; - case "delete": + case 'delete': deleteDevice(view, deviceId); } } @@ -66,74 +66,74 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "da } function load(page, devices) { - var html = ""; + var html = ''; html += devices.map(function (device) { - var deviceHtml = ""; + var deviceHtml = ''; deviceHtml += "'; deviceHtml += '
'; if (canEdit || canDelete(device.Id)) { deviceHtml += '
'; - deviceHtml += ''; - deviceHtml += "
"; + deviceHtml += ''; + deviceHtml += '
'; } deviceHtml += "
"; deviceHtml += device.Name; - deviceHtml += "
"; + deviceHtml += ''; deviceHtml += "
"; - deviceHtml += device.AppName + " " + device.AppVersion; - deviceHtml += "
"; + deviceHtml += device.AppName + ' ' + device.AppVersion; + deviceHtml += ''; deviceHtml += "
"; if (device.LastUserName) { deviceHtml += device.LastUserName; - deviceHtml += ", " + datefns.formatDistanceToNow(Date.parse(device.DateLastActivity), dfnshelper.localeWithSuffix); + deviceHtml += ', ' + datefns.formatDistanceToNow(Date.parse(device.DateLastActivity), dfnshelper.localeWithSuffix); } - deviceHtml += " "; - deviceHtml += "
"; - deviceHtml += ""; - deviceHtml += ""; - deviceHtml += ""; + deviceHtml += ' '; + deviceHtml += ''; + deviceHtml += ''; + deviceHtml += ''; + deviceHtml += ''; return deviceHtml; - }).join(""); - page.querySelector(".devicesList").innerHTML = html; + }).join(''); + page.querySelector('.devicesList').innerHTML = html; } function loadData(page) { loading.show(); - ApiClient.getJSON(ApiClient.getUrl("Devices")).then(function (result) { + ApiClient.getJSON(ApiClient.getUrl('Devices')).then(function (result) { load(page, result.Items); loading.hide(); }); } - var canEdit = ApiClient.isMinServerVersion("3.4.1.31"); + var canEdit = ApiClient.isMinServerVersion('3.4.1.31'); return function (view, params) { - view.querySelector(".devicesList").addEventListener("click", function (e) { - var btnDeviceMenu = dom.parentWithClass(e.target, "btnDeviceMenu"); + view.querySelector('.devicesList').addEventListener('click', function (e) { + var btnDeviceMenu = dom.parentWithClass(e.target, 'btnDeviceMenu'); if (btnDeviceMenu) { - showDeviceMenu(view, btnDeviceMenu, btnDeviceMenu.getAttribute("data-id")); + showDeviceMenu(view, btnDeviceMenu, btnDeviceMenu.getAttribute('data-id')); } }); - view.addEventListener("viewshow", function () { + view.addEventListener('viewshow', function () { loadData(this); }); }; diff --git a/src/controllers/dashboard/dlna/dlnaprofile.js b/src/controllers/dashboard/dlna/dlnaprofile.js index f4d5704a2..3fe238c8a 100644 --- a/src/controllers/dashboard/dlna/dlnaprofile.js +++ b/src/controllers/dashboard/dlna/dlnaprofile.js @@ -1,5 +1,5 @@ -define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-button", "emby-input", "emby-checkbox", "listViewStyle", "emby-button"], function ($, loading, globalize) { - "use strict"; +define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-select', 'emby-button', 'emby-input', 'emby-checkbox', 'listViewStyle', 'emby-button'], function ($, loading, globalize) { + 'use strict'; function loadProfile(page) { loading.show(); @@ -13,62 +13,62 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt } function getProfile() { - var id = getParameterByName("id"); - var url = id ? "Dlna/Profiles/" + id : "Dlna/Profiles/Default"; + var id = getParameterByName('id'); + var url = id ? 'Dlna/Profiles/' + id : 'Dlna/Profiles/Default'; return ApiClient.getJSON(ApiClient.getUrl(url)); } function renderProfile(page, profile, users) { - $("#txtName", page).val(profile.Name); - $(".chkMediaType", page).each(function () { - this.checked = -1 != (profile.SupportedMediaTypes || "").split(",").indexOf(this.getAttribute("data-value")); + $('#txtName', page).val(profile.Name); + $('.chkMediaType', page).each(function () { + this.checked = -1 != (profile.SupportedMediaTypes || '').split(',').indexOf(this.getAttribute('data-value')); }); - $("#chkEnableAlbumArtInDidl", page).checked(profile.EnableAlbumArtInDidl); - $("#chkEnableSingleImageLimit", page).checked(profile.EnableSingleAlbumArtLimit); + $('#chkEnableAlbumArtInDidl', page).checked(profile.EnableAlbumArtInDidl); + $('#chkEnableSingleImageLimit', page).checked(profile.EnableSingleAlbumArtLimit); renderXmlDocumentAttributes(page, profile.XmlRootAttributes || []); var idInfo = profile.Identification || {}; renderIdentificationHeaders(page, idInfo.Headers || []); renderSubtitleProfiles(page, profile.SubtitleProfiles || []); - $("#txtInfoFriendlyName", page).val(profile.FriendlyName || ""); - $("#txtInfoModelName", page).val(profile.ModelName || ""); - $("#txtInfoModelNumber", page).val(profile.ModelNumber || ""); - $("#txtInfoModelDescription", page).val(profile.ModelDescription || ""); - $("#txtInfoModelUrl", page).val(profile.ModelUrl || ""); - $("#txtInfoManufacturer", page).val(profile.Manufacturer || ""); - $("#txtInfoManufacturerUrl", page).val(profile.ManufacturerUrl || ""); - $("#txtInfoSerialNumber", page).val(profile.SerialNumber || ""); - $("#txtIdFriendlyName", page).val(idInfo.FriendlyName || ""); - $("#txtIdModelName", page).val(idInfo.ModelName || ""); - $("#txtIdModelNumber", page).val(idInfo.ModelNumber || ""); - $("#txtIdModelDescription", page).val(idInfo.ModelDescription || ""); - $("#txtIdModelUrl", page).val(idInfo.ModelUrl || ""); - $("#txtIdManufacturer", page).val(idInfo.Manufacturer || ""); - $("#txtIdManufacturerUrl", page).val(idInfo.ManufacturerUrl || ""); - $("#txtIdSerialNumber", page).val(idInfo.SerialNumber || ""); - $("#txtIdDeviceDescription", page).val(idInfo.DeviceDescription || ""); - $("#txtAlbumArtPn", page).val(profile.AlbumArtPn || ""); - $("#txtAlbumArtMaxWidth", page).val(profile.MaxAlbumArtWidth || ""); - $("#txtAlbumArtMaxHeight", page).val(profile.MaxAlbumArtHeight || ""); - $("#txtIconMaxWidth", page).val(profile.MaxIconWidth || ""); - $("#txtIconMaxHeight", page).val(profile.MaxIconHeight || ""); - $("#chkIgnoreTranscodeByteRangeRequests", page).checked(profile.IgnoreTranscodeByteRangeRequests); - $("#txtMaxAllowedBitrate", page).val(profile.MaxStreamingBitrate || ""); - $("#txtMusicStreamingTranscodingBitrate", page).val(profile.MusicStreamingTranscodingBitrate || ""); - $("#chkRequiresPlainFolders", page).checked(profile.RequiresPlainFolders); - $("#chkRequiresPlainVideoItems", page).checked(profile.RequiresPlainVideoItems); - $("#txtProtocolInfo", page).val(profile.ProtocolInfo || ""); - $("#txtXDlnaCap", page).val(profile.XDlnaCap || ""); - $("#txtXDlnaDoc", page).val(profile.XDlnaDoc || ""); - $("#txtSonyAggregationFlags", page).val(profile.SonyAggregationFlags || ""); + $('#txtInfoFriendlyName', page).val(profile.FriendlyName || ''); + $('#txtInfoModelName', page).val(profile.ModelName || ''); + $('#txtInfoModelNumber', page).val(profile.ModelNumber || ''); + $('#txtInfoModelDescription', page).val(profile.ModelDescription || ''); + $('#txtInfoModelUrl', page).val(profile.ModelUrl || ''); + $('#txtInfoManufacturer', page).val(profile.Manufacturer || ''); + $('#txtInfoManufacturerUrl', page).val(profile.ManufacturerUrl || ''); + $('#txtInfoSerialNumber', page).val(profile.SerialNumber || ''); + $('#txtIdFriendlyName', page).val(idInfo.FriendlyName || ''); + $('#txtIdModelName', page).val(idInfo.ModelName || ''); + $('#txtIdModelNumber', page).val(idInfo.ModelNumber || ''); + $('#txtIdModelDescription', page).val(idInfo.ModelDescription || ''); + $('#txtIdModelUrl', page).val(idInfo.ModelUrl || ''); + $('#txtIdManufacturer', page).val(idInfo.Manufacturer || ''); + $('#txtIdManufacturerUrl', page).val(idInfo.ManufacturerUrl || ''); + $('#txtIdSerialNumber', page).val(idInfo.SerialNumber || ''); + $('#txtIdDeviceDescription', page).val(idInfo.DeviceDescription || ''); + $('#txtAlbumArtPn', page).val(profile.AlbumArtPn || ''); + $('#txtAlbumArtMaxWidth', page).val(profile.MaxAlbumArtWidth || ''); + $('#txtAlbumArtMaxHeight', page).val(profile.MaxAlbumArtHeight || ''); + $('#txtIconMaxWidth', page).val(profile.MaxIconWidth || ''); + $('#txtIconMaxHeight', page).val(profile.MaxIconHeight || ''); + $('#chkIgnoreTranscodeByteRangeRequests', page).checked(profile.IgnoreTranscodeByteRangeRequests); + $('#txtMaxAllowedBitrate', page).val(profile.MaxStreamingBitrate || ''); + $('#txtMusicStreamingTranscodingBitrate', page).val(profile.MusicStreamingTranscodingBitrate || ''); + $('#chkRequiresPlainFolders', page).checked(profile.RequiresPlainFolders); + $('#chkRequiresPlainVideoItems', page).checked(profile.RequiresPlainVideoItems); + $('#txtProtocolInfo', page).val(profile.ProtocolInfo || ''); + $('#txtXDlnaCap', page).val(profile.XDlnaCap || ''); + $('#txtXDlnaDoc', page).val(profile.XDlnaDoc || ''); + $('#txtSonyAggregationFlags', page).val(profile.SonyAggregationFlags || ''); profile.DirectPlayProfiles = profile.DirectPlayProfiles || []; profile.TranscodingProfiles = profile.TranscodingProfiles || []; profile.ContainerProfiles = profile.ContainerProfiles || []; profile.CodecProfiles = profile.CodecProfiles || []; profile.ResponseProfiles = profile.ResponseProfiles || []; - var usersHtml = "" + users.map(function (u) { - return '"; - }).join(""); - $("#selectUser", page).html(usersHtml).val(profile.UserId || ""); + var usersHtml = '' + users.map(function (u) { + return ''; + }).join(''); + $('#selectUser', page).html(usersHtml).val(profile.UserId || ''); renderSubProfiles(page, profile); } @@ -76,47 +76,47 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt var index = 0; var html = '
' + headers.map(function (h) { var li = '
'; - li += 'info'; + li += ''; li += '
'; - li += '

' + h.Name + ": " + (h.Value || "") + "

"; - li += '
' + (h.Match || "") + "
"; - li += "
"; - li += ''; - li += "
"; + li += '

' + h.Name + ': ' + (h.Value || '') + '

'; + li += '
' + (h.Match || '') + '
'; + li += '
'; + li += ''; + li += ''; index++; return li; - }).join("") + ""; - var elem = $(".httpHeaderIdentificationList", page).html(html).trigger("create"); - $(".btnDeleteIdentificationHeader", elem).on("click", function () { - var itemIndex = parseInt(this.getAttribute("data-index")); + }).join('') + ''; + var elem = $('.httpHeaderIdentificationList', page).html(html).trigger('create'); + $('.btnDeleteIdentificationHeader', elem).on('click', function () { + var itemIndex = parseInt(this.getAttribute('data-index')); currentProfile.Identification.Headers.splice(itemIndex, 1); renderIdentificationHeaders(page, currentProfile.Identification.Headers); }); } function openPopup(elem) { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } function closePopup(elem) { - elem.classList.add("hide"); + elem.classList.add('hide'); } function editIdentificationHeader(page, header) { isSubProfileNew = null == header; header = header || {}; currentSubProfile = header; - var popup = $("#identificationHeaderPopup", page); - $("#txtIdentificationHeaderName", popup).val(header.Name || ""); - $("#txtIdentificationHeaderValue", popup).val(header.Value || ""); - $("#selectMatchType", popup).val(header.Match || "Equals"); + var popup = $('#identificationHeaderPopup', page); + $('#txtIdentificationHeaderName', popup).val(header.Name || ''); + $('#txtIdentificationHeaderValue', popup).val(header.Value || ''); + $('#selectMatchType', popup).val(header.Match || 'Equals'); openPopup(popup[0]); } function saveIdentificationHeader(page) { - currentSubProfile.Name = $("#txtIdentificationHeaderName", page).val(); - currentSubProfile.Value = $("#txtIdentificationHeaderValue", page).val(); - currentSubProfile.Match = $("#selectMatchType", page).val(); + currentSubProfile.Name = $('#txtIdentificationHeaderName', page).val(); + currentSubProfile.Value = $('#txtIdentificationHeaderValue', page).val(); + currentSubProfile.Match = $('#selectMatchType', page).val(); if (isSubProfileNew) { currentProfile.Identification = currentProfile.Identification || {}; @@ -126,22 +126,22 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt renderIdentificationHeaders(page, currentProfile.Identification.Headers); currentSubProfile = null; - closePopup($("#identificationHeaderPopup", page)[0]); + closePopup($('#identificationHeaderPopup', page)[0]); } function renderXmlDocumentAttributes(page, attribute) { var html = '
' + attribute.map(function (h) { var li = '
'; - li += 'info'; + li += ''; li += '
'; - li += '

' + h.Name + " = " + (h.Value || "") + "

"; - li += "
"; - li += ''; - return li += "
"; - }).join("") + "
"; - var elem = $(".xmlDocumentAttributeList", page).html(html).trigger("create"); - $(".btnDeleteXmlAttribute", elem).on("click", function () { - var itemIndex = parseInt(this.getAttribute("data-index")); + li += '

' + h.Name + ' = ' + (h.Value || '') + '

'; + li += ''; + li += ''; + return li += ''; + }).join('') + ''; + var elem = $('.xmlDocumentAttributeList', page).html(html).trigger('create'); + $('.btnDeleteXmlAttribute', elem).on('click', function () { + var itemIndex = parseInt(this.getAttribute('data-index')); currentProfile.XmlRootAttributes.splice(itemIndex, 1); renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes); }); @@ -151,15 +151,15 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt isSubProfileNew = null == attribute; attribute = attribute || {}; currentSubProfile = attribute; - var popup = $("#xmlAttributePopup", page); - $("#txtXmlAttributeName", popup).val(attribute.Name || ""); - $("#txtXmlAttributeValue", popup).val(attribute.Value || ""); + var popup = $('#xmlAttributePopup', page); + $('#txtXmlAttributeName', popup).val(attribute.Name || ''); + $('#txtXmlAttributeValue', popup).val(attribute.Value || ''); openPopup(popup[0]); } function saveXmlDocumentAttribute(page) { - currentSubProfile.Name = $("#txtXmlAttributeName", page).val(); - currentSubProfile.Value = $("#txtXmlAttributeValue", page).val(); + currentSubProfile.Name = $('#txtXmlAttributeName', page).val(); + currentSubProfile.Value = $('#txtXmlAttributeValue', page).val(); if (isSubProfileNew) { currentProfile.XmlRootAttributes.push(currentSubProfile); @@ -167,30 +167,30 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt renderXmlDocumentAttributes(page, currentProfile.XmlRootAttributes); currentSubProfile = null; - closePopup($("#xmlAttributePopup", page)[0]); + closePopup($('#xmlAttributePopup', page)[0]); } function renderSubtitleProfiles(page, profiles) { var index = 0; var html = '
' + profiles.map(function (h) { var li = '
'; - li += 'info'; + li += ''; li += '
'; - li += '

' + (h.Format || "") + "

"; - li += "
"; - li += ''; - li += "
"; + li += '

' + (h.Format || '') + '

'; + li += '
'; + li += ''; + li += ''; index++; return li; - }).join("") + ""; - var elem = $(".subtitleProfileList", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function () { - var itemIndex = parseInt(this.getAttribute("data-index")); + }).join('') + ''; + var elem = $('.subtitleProfileList', page).html(html).trigger('create'); + $('.btnDeleteProfile', elem).on('click', function () { + var itemIndex = parseInt(this.getAttribute('data-index')); currentProfile.SubtitleProfiles.splice(itemIndex, 1); renderSubtitleProfiles(page, currentProfile.SubtitleProfiles); }); - $(".lnkEditSubProfile", elem).on("click", function () { - var itemIndex = parseInt(this.getAttribute("data-index")); + $('.lnkEditSubProfile', elem).on('click', function () { + var itemIndex = parseInt(this.getAttribute('data-index')); editSubtitleProfile(page, currentProfile.SubtitleProfiles[itemIndex]); }); } @@ -199,17 +199,17 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt isSubProfileNew = null == profile; profile = profile || {}; currentSubProfile = profile; - var popup = $("#subtitleProfilePopup", page); - $("#txtSubtitleProfileFormat", popup).val(profile.Format || ""); - $("#selectSubtitleProfileMethod", popup).val(profile.Method || ""); - $("#selectSubtitleProfileDidlMode", popup).val(profile.DidlMode || ""); + var popup = $('#subtitleProfilePopup', page); + $('#txtSubtitleProfileFormat', popup).val(profile.Format || ''); + $('#selectSubtitleProfileMethod', popup).val(profile.Method || ''); + $('#selectSubtitleProfileDidlMode', popup).val(profile.DidlMode || ''); openPopup(popup[0]); } function saveSubtitleProfile(page) { - currentSubProfile.Format = $("#txtSubtitleProfileFormat", page).val(); - currentSubProfile.Method = $("#selectSubtitleProfileMethod", page).val(); - currentSubProfile.DidlMode = $("#selectSubtitleProfileDidlMode", page).val(); + currentSubProfile.Format = $('#txtSubtitleProfileFormat', page).val(); + currentSubProfile.Method = $('#selectSubtitleProfileMethod', page).val(); + currentSubProfile.DidlMode = $('#selectSubtitleProfileDidlMode', page).val(); if (isSubProfileNew) { currentProfile.SubtitleProfiles.push(currentSubProfile); @@ -217,7 +217,7 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt renderSubtitleProfiles(page, currentProfile.SubtitleProfiles); currentSubProfile = null; - closePopup($("#subtitleProfilePopup", page)[0]); + closePopup($('#subtitleProfilePopup', page)[0]); } function renderSubProfiles(page, profile) { @@ -229,10 +229,10 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt } function saveDirectPlayProfile(page) { - currentSubProfile.Type = $("#selectDirectPlayProfileType", page).val(); - currentSubProfile.Container = $("#txtDirectPlayContainer", page).val(); - currentSubProfile.AudioCodec = $("#txtDirectPlayAudioCodec", page).val(); - currentSubProfile.VideoCodec = $("#txtDirectPlayVideoCodec", page).val(); + currentSubProfile.Type = $('#selectDirectPlayProfileType', page).val(); + currentSubProfile.Container = $('#txtDirectPlayContainer', page).val(); + currentSubProfile.AudioCodec = $('#txtDirectPlayAudioCodec', page).val(); + currentSubProfile.VideoCodec = $('#txtDirectPlayVideoCodec', page).val(); if (isSubProfileNew) { currentProfile.DirectPlayProfiles.push(currentSubProfile); @@ -240,11 +240,11 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt renderSubProfiles(page, currentProfile); currentSubProfile = null; - closePopup($("#popupEditDirectPlayProfile", page)[0]); + closePopup($('#popupEditDirectPlayProfile', page)[0]); } function renderDirectPlayProfiles(page, profiles) { - var html = ""; + var html = ''; html += '"; - var elem = $(".directPlayProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function () { - var index = this.getAttribute("data-profileindex"); + html += ''; + var elem = $('.directPlayProfiles', page).html(html).trigger('create'); + $('.btnDeleteProfile', elem).on('click', function () { + var index = this.getAttribute('data-profileindex'); deleteDirectPlayProfile(page, index); }); - $(".lnkEditSubProfile", elem).on("click", function () { - var index = parseInt(this.getAttribute("data-profileindex")); + $('.lnkEditSubProfile', elem).on('click', function () { + var index = parseInt(this.getAttribute('data-profileindex')); editDirectPlayProfile(page, currentProfile.DirectPlayProfiles[index]); }); } @@ -295,16 +295,16 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt isSubProfileNew = null == directPlayProfile; directPlayProfile = directPlayProfile || {}; currentSubProfile = directPlayProfile; - var popup = $("#popupEditDirectPlayProfile", page); - $("#selectDirectPlayProfileType", popup).val(directPlayProfile.Type || "Video").trigger("change"); - $("#txtDirectPlayContainer", popup).val(directPlayProfile.Container || ""); - $("#txtDirectPlayAudioCodec", popup).val(directPlayProfile.AudioCodec || ""); - $("#txtDirectPlayVideoCodec", popup).val(directPlayProfile.VideoCodec || ""); + var popup = $('#popupEditDirectPlayProfile', page); + $('#selectDirectPlayProfileType', popup).val(directPlayProfile.Type || 'Video').trigger('change'); + $('#txtDirectPlayContainer', popup).val(directPlayProfile.Container || ''); + $('#txtDirectPlayAudioCodec', popup).val(directPlayProfile.AudioCodec || ''); + $('#txtDirectPlayVideoCodec', popup).val(directPlayProfile.VideoCodec || ''); openPopup(popup[0]); } function renderTranscodingProfiles(page, profiles) { - var html = ""; + var html = ''; html += '"; - var elem = $(".transcodingProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function () { - var index = this.getAttribute("data-profileindex"); + html += ''; + var elem = $('.transcodingProfiles', page).html(html).trigger('create'); + $('.btnDeleteProfile', elem).on('click', function () { + var index = this.getAttribute('data-profileindex'); deleteTranscodingProfile(page, index); }); - $(".lnkEditSubProfile", elem).on("click", function () { - var index = parseInt(this.getAttribute("data-profileindex")); + $('.lnkEditSubProfile', elem).on('click', function () { + var index = parseInt(this.getAttribute('data-profileindex')); editTranscodingProfile(page, currentProfile.TranscodingProfiles[index]); }); } @@ -351,16 +351,16 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt isSubProfileNew = null == transcodingProfile; transcodingProfile = transcodingProfile || {}; currentSubProfile = transcodingProfile; - var popup = $("#transcodingProfilePopup", page); - $("#selectTranscodingProfileType", popup).val(transcodingProfile.Type || "Video").trigger("change"); - $("#txtTranscodingContainer", popup).val(transcodingProfile.Container || ""); - $("#txtTranscodingAudioCodec", popup).val(transcodingProfile.AudioCodec || ""); - $("#txtTranscodingVideoCodec", popup).val(transcodingProfile.VideoCodec || ""); - $("#selectTranscodingProtocol", popup).val(transcodingProfile.Protocol || "Http"); - $("#chkEnableMpegtsM2TsMode", popup).checked(transcodingProfile.EnableMpegtsM2TsMode || false); - $("#chkEstimateContentLength", popup).checked(transcodingProfile.EstimateContentLength || false); - $("#chkReportByteRangeRequests", popup).checked("Bytes" == transcodingProfile.TranscodeSeekInfo); - $(".radioTabButton:first", popup).trigger("click"); + var popup = $('#transcodingProfilePopup', page); + $('#selectTranscodingProfileType', popup).val(transcodingProfile.Type || 'Video').trigger('change'); + $('#txtTranscodingContainer', popup).val(transcodingProfile.Container || ''); + $('#txtTranscodingAudioCodec', popup).val(transcodingProfile.AudioCodec || ''); + $('#txtTranscodingVideoCodec', popup).val(transcodingProfile.VideoCodec || ''); + $('#selectTranscodingProtocol', popup).val(transcodingProfile.Protocol || 'Http'); + $('#chkEnableMpegtsM2TsMode', popup).checked(transcodingProfile.EnableMpegtsM2TsMode || false); + $('#chkEstimateContentLength', popup).checked(transcodingProfile.EstimateContentLength || false); + $('#chkReportByteRangeRequests', popup).checked('Bytes' == transcodingProfile.TranscodeSeekInfo); + $('.radioTabButton:first', popup).trigger('click'); openPopup(popup[0]); } @@ -370,15 +370,15 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt } function saveTranscodingProfile(page) { - currentSubProfile.Type = $("#selectTranscodingProfileType", page).val(); - currentSubProfile.Container = $("#txtTranscodingContainer", page).val(); - currentSubProfile.AudioCodec = $("#txtTranscodingAudioCodec", page).val(); - currentSubProfile.VideoCodec = $("#txtTranscodingVideoCodec", page).val(); - currentSubProfile.Protocol = $("#selectTranscodingProtocol", page).val(); - currentSubProfile.Context = "Streaming"; - currentSubProfile.EnableMpegtsM2TsMode = $("#chkEnableMpegtsM2TsMode", page).checked(); - currentSubProfile.EstimateContentLength = $("#chkEstimateContentLength", page).checked(); - currentSubProfile.TranscodeSeekInfo = $("#chkReportByteRangeRequests", page).checked() ? "Bytes" : "Auto"; + currentSubProfile.Type = $('#selectTranscodingProfileType', page).val(); + currentSubProfile.Container = $('#txtTranscodingContainer', page).val(); + currentSubProfile.AudioCodec = $('#txtTranscodingAudioCodec', page).val(); + currentSubProfile.VideoCodec = $('#txtTranscodingVideoCodec', page).val(); + currentSubProfile.Protocol = $('#selectTranscodingProtocol', page).val(); + currentSubProfile.Context = 'Streaming'; + currentSubProfile.EnableMpegtsM2TsMode = $('#chkEnableMpegtsM2TsMode', page).checked(); + currentSubProfile.EstimateContentLength = $('#chkEstimateContentLength', page).checked(); + currentSubProfile.TranscodeSeekInfo = $('#chkReportByteRangeRequests', page).checked() ? 'Bytes' : 'Auto'; if (isSubProfileNew) { currentProfile.TranscodingProfiles.push(currentSubProfile); @@ -386,11 +386,11 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt renderSubProfiles(page, currentProfile); currentSubProfile = null; - closePopup($("#transcodingProfilePopup", page)[0]); + closePopup($('#transcodingProfilePopup', page)[0]); } function renderContainerProfiles(page, profiles) { - var html = ""; + var html = ''; html += '"; - var elem = $(".containerProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function () { - var index = this.getAttribute("data-profileindex"); + html += ''; + var elem = $('.containerProfiles', page).html(html).trigger('create'); + $('.btnDeleteProfile', elem).on('click', function () { + var index = this.getAttribute('data-profileindex'); deleteContainerProfile(page, index); }); - $(".lnkEditSubProfile", elem).on("click", function () { - var index = parseInt(this.getAttribute("data-profileindex")); + $('.lnkEditSubProfile', elem).on('click', function () { + var index = parseInt(this.getAttribute('data-profileindex')); editContainerProfile(page, currentProfile.ContainerProfiles[index]); }); } @@ -440,16 +440,16 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt isSubProfileNew = null == containerProfile; containerProfile = containerProfile || {}; currentSubProfile = containerProfile; - var popup = $("#containerProfilePopup", page); - $("#selectContainerProfileType", popup).val(containerProfile.Type || "Video").trigger("change"); - $("#txtContainerProfileContainer", popup).val(containerProfile.Container || ""); - $(".radioTabButton:first", popup).trigger("click"); + var popup = $('#containerProfilePopup', page); + $('#selectContainerProfileType', popup).val(containerProfile.Type || 'Video').trigger('change'); + $('#txtContainerProfileContainer', popup).val(containerProfile.Container || ''); + $('.radioTabButton:first', popup).trigger('click'); openPopup(popup[0]); } function saveContainerProfile(page) { - currentSubProfile.Type = $("#selectContainerProfileType", page).val(); - currentSubProfile.Container = $("#txtContainerProfileContainer", page).val(); + currentSubProfile.Type = $('#selectContainerProfileType', page).val(); + currentSubProfile.Container = $('#txtContainerProfileContainer', page).val(); if (isSubProfileNew) { currentProfile.ContainerProfiles.push(currentSubProfile); @@ -457,48 +457,48 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt renderSubProfiles(page, currentProfile); currentSubProfile = null; - closePopup($("#containerProfilePopup", page)[0]); + closePopup($('#containerProfilePopup', page)[0]); } function renderCodecProfiles(page, profiles) { - var html = ""; + var html = ''; html += '"; - var elem = $(".codecProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function () { - var index = this.getAttribute("data-profileindex"); + html += ''; + var elem = $('.codecProfiles', page).html(html).trigger('create'); + $('.btnDeleteProfile', elem).on('click', function () { + var index = this.getAttribute('data-profileindex'); deleteCodecProfile(page, index); }); - $(".lnkEditSubProfile", elem).on("click", function () { - var index = parseInt(this.getAttribute("data-profileindex")); + $('.lnkEditSubProfile', elem).on('click', function () { + var index = parseInt(this.getAttribute('data-profileindex')); editCodecProfile(page, currentProfile.CodecProfiles[index]); }); } @@ -512,16 +512,16 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt isSubProfileNew = null == codecProfile; codecProfile = codecProfile || {}; currentSubProfile = codecProfile; - var popup = $("#codecProfilePopup", page); - $("#selectCodecProfileType", popup).val(codecProfile.Type || "Video").trigger("change"); - $("#txtCodecProfileCodec", popup).val(codecProfile.Codec || ""); - $(".radioTabButton:first", popup).trigger("click"); + var popup = $('#codecProfilePopup', page); + $('#selectCodecProfileType', popup).val(codecProfile.Type || 'Video').trigger('change'); + $('#txtCodecProfileCodec', popup).val(codecProfile.Codec || ''); + $('.radioTabButton:first', popup).trigger('click'); openPopup(popup[0]); } function saveCodecProfile(page) { - currentSubProfile.Type = $("#selectCodecProfileType", page).val(); - currentSubProfile.Codec = $("#txtCodecProfileCodec", page).val(); + currentSubProfile.Type = $('#selectCodecProfileType', page).val(); + currentSubProfile.Codec = $('#txtCodecProfileCodec', page).val(); if (isSubProfileNew) { currentProfile.CodecProfiles.push(currentSubProfile); @@ -529,11 +529,11 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt renderSubProfiles(page, currentProfile); currentSubProfile = null; - closePopup($("#codecProfilePopup", page)[0]); + closePopup($('#codecProfilePopup', page)[0]); } function renderResponseProfiles(page, profiles) { - var html = ""; + var html = ''; html += '"; - var elem = $(".mediaProfiles", page).html(html).trigger("create"); - $(".btnDeleteProfile", elem).on("click", function () { - var index = this.getAttribute("data-profileindex"); + html += ''; + var elem = $('.mediaProfiles', page).html(html).trigger('create'); + $('.btnDeleteProfile', elem).on('click', function () { + var index = this.getAttribute('data-profileindex'); deleteResponseProfile(page, index); }); - $(".lnkEditSubProfile", elem).on("click", function () { - var index = parseInt(this.getAttribute("data-profileindex")); + $('.lnkEditSubProfile', elem).on('click', function () { + var index = parseInt(this.getAttribute('data-profileindex')); editResponseProfile(page, currentProfile.ResponseProfiles[index]); }); } @@ -592,20 +592,20 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt isSubProfileNew = null == responseProfile; responseProfile = responseProfile || {}; currentSubProfile = responseProfile; - var popup = $("#responseProfilePopup", page); - $("#selectResponseProfileType", popup).val(responseProfile.Type || "Video").trigger("change"); - $("#txtResponseProfileContainer", popup).val(responseProfile.Container || ""); - $("#txtResponseProfileAudioCodec", popup).val(responseProfile.AudioCodec || ""); - $("#txtResponseProfileVideoCodec", popup).val(responseProfile.VideoCodec || ""); - $(".radioTabButton:first", popup).trigger("click"); + var popup = $('#responseProfilePopup', page); + $('#selectResponseProfileType', popup).val(responseProfile.Type || 'Video').trigger('change'); + $('#txtResponseProfileContainer', popup).val(responseProfile.Container || ''); + $('#txtResponseProfileAudioCodec', popup).val(responseProfile.AudioCodec || ''); + $('#txtResponseProfileVideoCodec', popup).val(responseProfile.VideoCodec || ''); + $('.radioTabButton:first', popup).trigger('click'); openPopup(popup[0]); } function saveResponseProfile(page) { - currentSubProfile.Type = $("#selectResponseProfileType", page).val(); - currentSubProfile.Container = $("#txtResponseProfileContainer", page).val(); - currentSubProfile.AudioCodec = $("#txtResponseProfileAudioCodec", page).val(); - currentSubProfile.VideoCodec = $("#txtResponseProfileVideoCodec", page).val(); + currentSubProfile.Type = $('#selectResponseProfileType', page).val(); + currentSubProfile.Container = $('#txtResponseProfileContainer', page).val(); + currentSubProfile.AudioCodec = $('#txtResponseProfileAudioCodec', page).val(); + currentSubProfile.VideoCodec = $('#txtResponseProfileVideoCodec', page).val(); if (isSubProfileNew) { currentProfile.ResponseProfiles.push(currentSubProfile); @@ -613,32 +613,32 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt renderSubProfiles(page, currentProfile); currentSubProfile = null; - closePopup($("#responseProfilePopup", page)[0]); + closePopup($('#responseProfilePopup', page)[0]); } function saveProfile(page, profile) { updateProfile(page, profile); - var id = getParameterByName("id"); + var id = getParameterByName('id'); if (id) { ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("Dlna/Profiles/" + id), + type: 'POST', + url: ApiClient.getUrl('Dlna/Profiles/' + id), data: JSON.stringify(profile), - contentType: "application/json" + contentType: 'application/json' }).then(function () { - require(["toast"], function (toast) { - toast("Settings saved."); + require(['toast'], function (toast) { + toast('Settings saved.'); }); }, Dashboard.processErrorResponse); } else { ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("Dlna/Profiles"), + type: 'POST', + url: ApiClient.getUrl('Dlna/Profiles'), data: JSON.stringify(profile), - contentType: "application/json" + contentType: 'application/json' }).then(function () { - Dashboard.navigate("dlnaprofiles.html"); + Dashboard.navigate('dlnaprofiles.html'); }, Dashboard.processErrorResponse); } @@ -646,183 +646,183 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-select", "emby-butt } function updateProfile(page, profile) { - profile.Name = $("#txtName", page).val(); - profile.EnableAlbumArtInDidl = $("#chkEnableAlbumArtInDidl", page).checked(); - profile.EnableSingleAlbumArtLimit = $("#chkEnableSingleImageLimit", page).checked(); - profile.SupportedMediaTypes = $(".chkMediaType:checked", page).get().map(function (c) { - return c.getAttribute("data-value"); - }).join(","); + profile.Name = $('#txtName', page).val(); + profile.EnableAlbumArtInDidl = $('#chkEnableAlbumArtInDidl', page).checked(); + profile.EnableSingleAlbumArtLimit = $('#chkEnableSingleImageLimit', page).checked(); + profile.SupportedMediaTypes = $('.chkMediaType:checked', page).get().map(function (c) { + return c.getAttribute('data-value'); + }).join(','); profile.Identification = profile.Identification || {}; - profile.FriendlyName = $("#txtInfoFriendlyName", page).val(); - profile.ModelName = $("#txtInfoModelName", page).val(); - profile.ModelNumber = $("#txtInfoModelNumber", page).val(); - profile.ModelDescription = $("#txtInfoModelDescription", page).val(); - profile.ModelUrl = $("#txtInfoModelUrl", page).val(); - profile.Manufacturer = $("#txtInfoManufacturer", page).val(); - profile.ManufacturerUrl = $("#txtInfoManufacturerUrl", page).val(); - profile.SerialNumber = $("#txtInfoSerialNumber", page).val(); - profile.Identification.FriendlyName = $("#txtIdFriendlyName", page).val(); - profile.Identification.ModelName = $("#txtIdModelName", page).val(); - profile.Identification.ModelNumber = $("#txtIdModelNumber", page).val(); - profile.Identification.ModelDescription = $("#txtIdModelDescription", page).val(); - profile.Identification.ModelUrl = $("#txtIdModelUrl", page).val(); - profile.Identification.Manufacturer = $("#txtIdManufacturer", page).val(); - profile.Identification.ManufacturerUrl = $("#txtIdManufacturerUrl", page).val(); - profile.Identification.SerialNumber = $("#txtIdSerialNumber", page).val(); - profile.Identification.DeviceDescription = $("#txtIdDeviceDescription", page).val(); - profile.AlbumArtPn = $("#txtAlbumArtPn", page).val(); - profile.MaxAlbumArtWidth = $("#txtAlbumArtMaxWidth", page).val(); - profile.MaxAlbumArtHeight = $("#txtAlbumArtMaxHeight", page).val(); - profile.MaxIconWidth = $("#txtIconMaxWidth", page).val(); - profile.MaxIconHeight = $("#txtIconMaxHeight", page).val(); - profile.RequiresPlainFolders = $("#chkRequiresPlainFolders", page).checked(); - profile.RequiresPlainVideoItems = $("#chkRequiresPlainVideoItems", page).checked(); - profile.IgnoreTranscodeByteRangeRequests = $("#chkIgnoreTranscodeByteRangeRequests", page).checked(); - profile.MaxStreamingBitrate = $("#txtMaxAllowedBitrate", page).val(); - profile.MusicStreamingTranscodingBitrate = $("#txtMusicStreamingTranscodingBitrate", page).val(); - profile.ProtocolInfo = $("#txtProtocolInfo", page).val(); - profile.XDlnaCap = $("#txtXDlnaCap", page).val(); - profile.XDlnaDoc = $("#txtXDlnaDoc", page).val(); - profile.SonyAggregationFlags = $("#txtSonyAggregationFlags", page).val(); - profile.UserId = $("#selectUser", page).val(); + profile.FriendlyName = $('#txtInfoFriendlyName', page).val(); + profile.ModelName = $('#txtInfoModelName', page).val(); + profile.ModelNumber = $('#txtInfoModelNumber', page).val(); + profile.ModelDescription = $('#txtInfoModelDescription', page).val(); + profile.ModelUrl = $('#txtInfoModelUrl', page).val(); + profile.Manufacturer = $('#txtInfoManufacturer', page).val(); + profile.ManufacturerUrl = $('#txtInfoManufacturerUrl', page).val(); + profile.SerialNumber = $('#txtInfoSerialNumber', page).val(); + profile.Identification.FriendlyName = $('#txtIdFriendlyName', page).val(); + profile.Identification.ModelName = $('#txtIdModelName', page).val(); + profile.Identification.ModelNumber = $('#txtIdModelNumber', page).val(); + profile.Identification.ModelDescription = $('#txtIdModelDescription', page).val(); + profile.Identification.ModelUrl = $('#txtIdModelUrl', page).val(); + profile.Identification.Manufacturer = $('#txtIdManufacturer', page).val(); + profile.Identification.ManufacturerUrl = $('#txtIdManufacturerUrl', page).val(); + profile.Identification.SerialNumber = $('#txtIdSerialNumber', page).val(); + profile.Identification.DeviceDescription = $('#txtIdDeviceDescription', page).val(); + profile.AlbumArtPn = $('#txtAlbumArtPn', page).val(); + profile.MaxAlbumArtWidth = $('#txtAlbumArtMaxWidth', page).val(); + profile.MaxAlbumArtHeight = $('#txtAlbumArtMaxHeight', page).val(); + profile.MaxIconWidth = $('#txtIconMaxWidth', page).val(); + profile.MaxIconHeight = $('#txtIconMaxHeight', page).val(); + profile.RequiresPlainFolders = $('#chkRequiresPlainFolders', page).checked(); + profile.RequiresPlainVideoItems = $('#chkRequiresPlainVideoItems', page).checked(); + profile.IgnoreTranscodeByteRangeRequests = $('#chkIgnoreTranscodeByteRangeRequests', page).checked(); + profile.MaxStreamingBitrate = $('#txtMaxAllowedBitrate', page).val(); + profile.MusicStreamingTranscodingBitrate = $('#txtMusicStreamingTranscodingBitrate', page).val(); + profile.ProtocolInfo = $('#txtProtocolInfo', page).val(); + profile.XDlnaCap = $('#txtXDlnaCap', page).val(); + profile.XDlnaDoc = $('#txtXDlnaDoc', page).val(); + profile.SonyAggregationFlags = $('#txtSonyAggregationFlags', page).val(); + profile.UserId = $('#selectUser', page).val(); } var currentProfile; var currentSubProfile; var isSubProfileNew; - var allText = globalize.translate("LabelAll"); + var allText = globalize.translate('LabelAll'); - $(document).on("pageinit", "#dlnaProfilePage", function () { + $(document).on('pageinit', '#dlnaProfilePage', function () { var page = this; - $(".radioTabButton", page).on("click", function () { - $(this).siblings().removeClass("ui-btn-active"); - $(this).addClass("ui-btn-active"); - var value = "A" == this.tagName ? this.getAttribute("data-value") : this.value; - var elem = $("." + value, page); - elem.siblings(".tabContent").hide(); + $('.radioTabButton', page).on('click', function () { + $(this).siblings().removeClass('ui-btn-active'); + $(this).addClass('ui-btn-active'); + var value = 'A' == this.tagName ? this.getAttribute('data-value') : this.value; + var elem = $('.' + value, page); + elem.siblings('.tabContent').hide(); elem.show(); }); - $("#selectDirectPlayProfileType", page).on("change", function () { - if ("Video" == this.value) { - $("#fldDirectPlayVideoCodec", page).show(); + $('#selectDirectPlayProfileType', page).on('change', function () { + if ('Video' == this.value) { + $('#fldDirectPlayVideoCodec', page).show(); } else { - $("#fldDirectPlayVideoCodec", page).hide(); + $('#fldDirectPlayVideoCodec', page).hide(); } - if ("Photo" == this.value) { - $("#fldDirectPlayAudioCodec", page).hide(); + if ('Photo' == this.value) { + $('#fldDirectPlayAudioCodec', page).hide(); } else { - $("#fldDirectPlayAudioCodec", page).show(); + $('#fldDirectPlayAudioCodec', page).show(); } }); - $("#selectTranscodingProfileType", page).on("change", function () { - if ("Video" == this.value) { - $("#fldTranscodingVideoCodec", page).show(); - $("#fldTranscodingProtocol", page).show(); - $("#fldEnableMpegtsM2TsMode", page).show(); + $('#selectTranscodingProfileType', page).on('change', function () { + if ('Video' == this.value) { + $('#fldTranscodingVideoCodec', page).show(); + $('#fldTranscodingProtocol', page).show(); + $('#fldEnableMpegtsM2TsMode', page).show(); } else { - $("#fldTranscodingVideoCodec", page).hide(); - $("#fldTranscodingProtocol", page).hide(); - $("#fldEnableMpegtsM2TsMode", page).hide(); + $('#fldTranscodingVideoCodec', page).hide(); + $('#fldTranscodingProtocol', page).hide(); + $('#fldEnableMpegtsM2TsMode', page).hide(); } - if ("Photo" == this.value) { - $("#fldTranscodingAudioCodec", page).hide(); - $("#fldEstimateContentLength", page).hide(); - $("#fldReportByteRangeRequests", page).hide(); + if ('Photo' == this.value) { + $('#fldTranscodingAudioCodec', page).hide(); + $('#fldEstimateContentLength', page).hide(); + $('#fldReportByteRangeRequests', page).hide(); } else { - $("#fldTranscodingAudioCodec", page).show(); - $("#fldEstimateContentLength", page).show(); - $("#fldReportByteRangeRequests", page).show(); + $('#fldTranscodingAudioCodec', page).show(); + $('#fldEstimateContentLength', page).show(); + $('#fldReportByteRangeRequests', page).show(); } }); - $("#selectResponseProfileType", page).on("change", function () { - if ("Video" == this.value) { - $("#fldResponseProfileVideoCodec", page).show(); + $('#selectResponseProfileType', page).on('change', function () { + if ('Video' == this.value) { + $('#fldResponseProfileVideoCodec', page).show(); } else { - $("#fldResponseProfileVideoCodec", page).hide(); + $('#fldResponseProfileVideoCodec', page).hide(); } - if ("Photo" == this.value) { - $("#fldResponseProfileAudioCodec", page).hide(); + if ('Photo' == this.value) { + $('#fldResponseProfileAudioCodec', page).hide(); } else { - $("#fldResponseProfileAudioCodec", page).show(); + $('#fldResponseProfileAudioCodec', page).show(); } }); - $(".btnAddDirectPlayProfile", page).on("click", function () { + $('.btnAddDirectPlayProfile', page).on('click', function () { editDirectPlayProfile(page); }); - $(".btnAddTranscodingProfile", page).on("click", function () { + $('.btnAddTranscodingProfile', page).on('click', function () { editTranscodingProfile(page); }); - $(".btnAddContainerProfile", page).on("click", function () { + $('.btnAddContainerProfile', page).on('click', function () { editContainerProfile(page); }); - $(".btnAddCodecProfile", page).on("click", function () { + $('.btnAddCodecProfile', page).on('click', function () { editCodecProfile(page); }); - $(".btnAddResponseProfile", page).on("click", function () { + $('.btnAddResponseProfile', page).on('click', function () { editResponseProfile(page); }); - $(".btnAddIdentificationHttpHeader", page).on("click", function () { + $('.btnAddIdentificationHttpHeader', page).on('click', function () { editIdentificationHeader(page); }); - $(".btnAddXmlDocumentAttribute", page).on("click", function () { + $('.btnAddXmlDocumentAttribute', page).on('click', function () { editXmlDocumentAttribute(page); }); - $(".btnAddSubtitleProfile", page).on("click", function () { + $('.btnAddSubtitleProfile', page).on('click', function () { editSubtitleProfile(page); }); - $(".dlnaProfileForm").off("submit", DlnaProfilePage.onSubmit).on("submit", DlnaProfilePage.onSubmit); - $(".editDirectPlayProfileForm").off("submit", DlnaProfilePage.onDirectPlayFormSubmit).on("submit", DlnaProfilePage.onDirectPlayFormSubmit); - $(".transcodingProfileForm").off("submit", DlnaProfilePage.onTranscodingProfileFormSubmit).on("submit", DlnaProfilePage.onTranscodingProfileFormSubmit); - $(".containerProfileForm").off("submit", DlnaProfilePage.onContainerProfileFormSubmit).on("submit", DlnaProfilePage.onContainerProfileFormSubmit); - $(".codecProfileForm").off("submit", DlnaProfilePage.onCodecProfileFormSubmit).on("submit", DlnaProfilePage.onCodecProfileFormSubmit); - $(".editResponseProfileForm").off("submit", DlnaProfilePage.onResponseProfileFormSubmit).on("submit", DlnaProfilePage.onResponseProfileFormSubmit); - $(".identificationHeaderForm").off("submit", DlnaProfilePage.onIdentificationHeaderFormSubmit).on("submit", DlnaProfilePage.onIdentificationHeaderFormSubmit); - $(".xmlAttributeForm").off("submit", DlnaProfilePage.onXmlAttributeFormSubmit).on("submit", DlnaProfilePage.onXmlAttributeFormSubmit); - $(".subtitleProfileForm").off("submit", DlnaProfilePage.onSubtitleProfileFormSubmit).on("submit", DlnaProfilePage.onSubtitleProfileFormSubmit); - }).on("pageshow", "#dlnaProfilePage", function () { + $('.dlnaProfileForm').off('submit', DlnaProfilePage.onSubmit).on('submit', DlnaProfilePage.onSubmit); + $('.editDirectPlayProfileForm').off('submit', DlnaProfilePage.onDirectPlayFormSubmit).on('submit', DlnaProfilePage.onDirectPlayFormSubmit); + $('.transcodingProfileForm').off('submit', DlnaProfilePage.onTranscodingProfileFormSubmit).on('submit', DlnaProfilePage.onTranscodingProfileFormSubmit); + $('.containerProfileForm').off('submit', DlnaProfilePage.onContainerProfileFormSubmit).on('submit', DlnaProfilePage.onContainerProfileFormSubmit); + $('.codecProfileForm').off('submit', DlnaProfilePage.onCodecProfileFormSubmit).on('submit', DlnaProfilePage.onCodecProfileFormSubmit); + $('.editResponseProfileForm').off('submit', DlnaProfilePage.onResponseProfileFormSubmit).on('submit', DlnaProfilePage.onResponseProfileFormSubmit); + $('.identificationHeaderForm').off('submit', DlnaProfilePage.onIdentificationHeaderFormSubmit).on('submit', DlnaProfilePage.onIdentificationHeaderFormSubmit); + $('.xmlAttributeForm').off('submit', DlnaProfilePage.onXmlAttributeFormSubmit).on('submit', DlnaProfilePage.onXmlAttributeFormSubmit); + $('.subtitleProfileForm').off('submit', DlnaProfilePage.onSubtitleProfileFormSubmit).on('submit', DlnaProfilePage.onSubtitleProfileFormSubmit); + }).on('pageshow', '#dlnaProfilePage', function () { var page = this; - $("#radioInfo", page).trigger("click"); + $('#radioInfo', page).trigger('click'); loadProfile(page); }); window.DlnaProfilePage = { onSubmit: function () { loading.show(); - saveProfile($(this).parents(".page"), currentProfile); + saveProfile($(this).parents('.page'), currentProfile); return false; }, onDirectPlayFormSubmit: function () { - saveDirectPlayProfile($(this).parents(".page")); + saveDirectPlayProfile($(this).parents('.page')); return false; }, onTranscodingProfileFormSubmit: function () { - saveTranscodingProfile($(this).parents(".page")); + saveTranscodingProfile($(this).parents('.page')); return false; }, onContainerProfileFormSubmit: function () { - saveContainerProfile($(this).parents(".page")); + saveContainerProfile($(this).parents('.page')); return false; }, onCodecProfileFormSubmit: function () { - saveCodecProfile($(this).parents(".page")); + saveCodecProfile($(this).parents('.page')); return false; }, onResponseProfileFormSubmit: function () { - saveResponseProfile($(this).parents(".page")); + saveResponseProfile($(this).parents('.page')); return false; }, onIdentificationHeaderFormSubmit: function () { - saveIdentificationHeader($(this).parents(".page")); + saveIdentificationHeader($(this).parents('.page')); return false; }, onXmlAttributeFormSubmit: function () { - saveXmlDocumentAttribute($(this).parents(".page")); + saveXmlDocumentAttribute($(this).parents('.page')); return false; }, onSubtitleProfileFormSubmit: function () { - saveSubtitleProfile($(this).parents(".page")); + saveSubtitleProfile($(this).parents('.page')); return false; } }; diff --git a/src/controllers/dashboard/dlna/dlnaprofiles.js b/src/controllers/dashboard/dlna/dlnaprofiles.js index e1719ea59..fb4caadeb 100644 --- a/src/controllers/dashboard/dlna/dlnaprofiles.js +++ b/src/controllers/dashboard/dlna/dlnaprofiles.js @@ -1,9 +1,9 @@ -define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby-button"], function ($, globalize, loading, libraryMenu) { - "use strict"; +define(['jQuery', 'globalize', 'loading', 'libraryMenu', 'listViewStyle', 'emby-button'], function ($, globalize, loading, libraryMenu) { + 'use strict'; function loadProfiles(page) { loading.show(); - ApiClient.getJSON(ApiClient.getUrl("Dlna/ProfileInfos")).then(function (result) { + ApiClient.getJSON(ApiClient.getUrl('Dlna/ProfileInfos')).then(function (result) { renderUserProfiles(page, result); renderSystemProfiles(page, result); loading.hide(); @@ -11,19 +11,19 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby- } function renderUserProfiles(page, profiles) { - renderProfiles(page, page.querySelector(".customProfiles"), profiles.filter(function (p) { - return "User" == p.Type; + renderProfiles(page, page.querySelector('.customProfiles'), profiles.filter(function (p) { + return 'User' == p.Type; })); } function renderSystemProfiles(page, profiles) { - renderProfiles(page, page.querySelector(".systemProfiles"), profiles.filter(function (p) { - return "System" == p.Type; + renderProfiles(page, page.querySelector('.systemProfiles'), profiles.filter(function (p) { + return 'System' == p.Type; })); } function renderProfiles(page, element, profiles) { - var html = ""; + var html = ''; if (profiles.length) { html += '
'; @@ -32,38 +32,38 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby- for (var i = 0, length = profiles.length; i < length; i++) { var profile = profiles[i]; html += '
'; - html += ''; + html += ''; html += '"; + html += '
' + profile.Name + '
'; + html += ''; + html += '
'; - if ("User" == profile.Type) { - html += ''; + if ('User' == profile.Type) { + html += ''; } - html += "
"; + html += ''; } if (profiles.length) { - html += ""; + html += ''; } element.innerHTML = html; - $(".btnDeleteProfile", element).on("click", function () { - var id = this.getAttribute("data-profileid"); + $('.btnDeleteProfile', element).on('click', function () { + var id = this.getAttribute('data-profileid'); deleteProfile(page, id); }); } function deleteProfile(page, id) { - require(["confirm"], function (confirm) { - confirm(globalize.translate("MessageConfirmProfileDeletion"), globalize.translate("HeaderConfirmProfileDeletion")).then(function () { + require(['confirm'], function (confirm) { + confirm(globalize.translate('MessageConfirmProfileDeletion'), globalize.translate('HeaderConfirmProfileDeletion')).then(function () { loading.show(); ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl("Dlna/Profiles/" + id) + type: 'DELETE', + url: ApiClient.getUrl('Dlna/Profiles/' + id) }).then(function () { loading.hide(); loadProfiles(page); @@ -74,16 +74,16 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby- function getTabs() { return [{ - href: "dlnasettings.html", - name: globalize.translate("TabSettings") + href: 'dlnasettings.html', + name: globalize.translate('TabSettings') }, { - href: "dlnaprofiles.html", - name: globalize.translate("TabProfiles") + href: 'dlnaprofiles.html', + name: globalize.translate('TabProfiles') }]; } - $(document).on("pageshow", "#dlnaProfilesPage", function () { - libraryMenu.setTabs("dlna", 1, getTabs); + $(document).on('pageshow', '#dlnaProfilesPage', function () { + libraryMenu.setTabs('dlna', 1, getTabs); loadProfiles(this); }); }); diff --git a/src/controllers/dashboard/dlna/dlnasettings.js b/src/controllers/dashboard/dlna/dlnasettings.js index dd71b9ed1..a818002d0 100644 --- a/src/controllers/dashboard/dlna/dlnasettings.js +++ b/src/controllers/dashboard/dlna/dlnasettings.js @@ -1,53 +1,53 @@ -define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function ($, loading, libraryMenu, globalize) { - "use strict"; +define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function ($, loading, libraryMenu, globalize) { + 'use strict'; function loadPage(page, config, users) { - page.querySelector("#chkEnablePlayTo").checked = config.EnablePlayTo; - page.querySelector("#chkEnableDlnaDebugLogging").checked = config.EnableDebugLog; - $("#txtClientDiscoveryInterval", page).val(config.ClientDiscoveryIntervalSeconds); - $("#chkEnableServer", page).checked(config.EnableServer); - $("#chkBlastAliveMessages", page).checked(config.BlastAliveMessages); - $("#txtBlastInterval", page).val(config.BlastAliveMessageIntervalSeconds); + page.querySelector('#chkEnablePlayTo').checked = config.EnablePlayTo; + page.querySelector('#chkEnableDlnaDebugLogging').checked = config.EnableDebugLog; + $('#txtClientDiscoveryInterval', page).val(config.ClientDiscoveryIntervalSeconds); + $('#chkEnableServer', page).checked(config.EnableServer); + $('#chkBlastAliveMessages', page).checked(config.BlastAliveMessages); + $('#txtBlastInterval', page).val(config.BlastAliveMessageIntervalSeconds); var usersHtml = users.map(function (u) { - return '"; - }).join(""); - $("#selectUser", page).html(usersHtml).val(config.DefaultUserId || ""); + return ''; + }).join(''); + $('#selectUser', page).html(usersHtml).val(config.DefaultUserId || ''); loading.hide(); } function onSubmit() { loading.show(); var form = this; - ApiClient.getNamedConfiguration("dlna").then(function (config) { - config.EnablePlayTo = form.querySelector("#chkEnablePlayTo").checked; - config.EnableDebugLog = form.querySelector("#chkEnableDlnaDebugLogging").checked; - config.ClientDiscoveryIntervalSeconds = $("#txtClientDiscoveryInterval", form).val(); - config.EnableServer = $("#chkEnableServer", form).checked(); - config.BlastAliveMessages = $("#chkBlastAliveMessages", form).checked(); - config.BlastAliveMessageIntervalSeconds = $("#txtBlastInterval", form).val(); - config.DefaultUserId = $("#selectUser", form).val(); - ApiClient.updateNamedConfiguration("dlna", config).then(Dashboard.processServerConfigurationUpdateResult); + ApiClient.getNamedConfiguration('dlna').then(function (config) { + config.EnablePlayTo = form.querySelector('#chkEnablePlayTo').checked; + config.EnableDebugLog = form.querySelector('#chkEnableDlnaDebugLogging').checked; + config.ClientDiscoveryIntervalSeconds = $('#txtClientDiscoveryInterval', form).val(); + config.EnableServer = $('#chkEnableServer', form).checked(); + config.BlastAliveMessages = $('#chkBlastAliveMessages', form).checked(); + config.BlastAliveMessageIntervalSeconds = $('#txtBlastInterval', form).val(); + config.DefaultUserId = $('#selectUser', form).val(); + ApiClient.updateNamedConfiguration('dlna', config).then(Dashboard.processServerConfigurationUpdateResult); }); return false; } function getTabs() { return [{ - href: "dlnasettings.html", - name: globalize.translate("TabSettings") + href: 'dlnasettings.html', + name: globalize.translate('TabSettings') }, { - href: "dlnaprofiles.html", - name: globalize.translate("TabProfiles") + href: 'dlnaprofiles.html', + name: globalize.translate('TabProfiles') }]; } - $(document).on("pageinit", "#dlnaSettingsPage", function () { - $(".dlnaSettingsForm").off("submit", onSubmit).on("submit", onSubmit); - }).on("pageshow", "#dlnaSettingsPage", function () { - libraryMenu.setTabs("dlna", 0, getTabs); + $(document).on('pageinit', '#dlnaSettingsPage', function () { + $('.dlnaSettingsForm').off('submit', onSubmit).on('submit', onSubmit); + }).on('pageshow', '#dlnaSettingsPage', function () { + libraryMenu.setTabs('dlna', 0, getTabs); loading.show(); var page = this; - var promise1 = ApiClient.getNamedConfiguration("dlna"); + var promise1 = ApiClient.getNamedConfiguration('dlna'); var promise2 = ApiClient.getUsers(); Promise.all([promise1, promise2]).then(function (responses) { loadPage(page, responses[0], responses[1]); diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index 9820d7401..65f4e4401 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -1,23 +1,23 @@ -define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, loading, globalize, dom, libraryMenu) { - "use strict"; +define(['jQuery', 'loading', 'globalize', 'dom', 'libraryMenu'], function ($, loading, globalize, dom, libraryMenu) { + 'use strict'; function loadPage(page, config, systemInfo) { - Array.prototype.forEach.call(page.querySelectorAll(".chkDecodeCodec"), function (c) { - c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute("data-codec")); + Array.prototype.forEach.call(page.querySelectorAll('.chkDecodeCodec'), function (c) { + c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute('data-codec')); }); - page.querySelector("#chkHardwareEncoding").checked = config.EnableHardwareEncoding; - $("#selectVideoDecoder", page).val(config.HardwareAccelerationType); - $("#selectThreadCount", page).val(config.EncodingThreadCount); - $("#txtDownMixAudioBoost", page).val(config.DownMixAudioBoost); - page.querySelector(".txtEncoderPath").value = config.EncoderAppPathDisplay || ""; - $("#txtTranscodingTempPath", page).val(systemInfo.TranscodingTempPath || ""); - $("#txtVaapiDevice", page).val(config.VaapiDevice || ""); - page.querySelector("#selectEncoderPreset").value = config.EncoderPreset || ""; - page.querySelector("#txtH264Crf").value = config.H264Crf || ""; - page.querySelector("#selectDeinterlaceMethod").value = config.DeinterlaceMethod || ""; - page.querySelector("#chkEnableSubtitleExtraction").checked = config.EnableSubtitleExtraction || false; - page.querySelector("#chkEnableThrottling").checked = config.EnableThrottling || false; - page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change", { + page.querySelector('#chkHardwareEncoding').checked = config.EnableHardwareEncoding; + $('#selectVideoDecoder', page).val(config.HardwareAccelerationType); + $('#selectThreadCount', page).val(config.EncodingThreadCount); + $('#txtDownMixAudioBoost', page).val(config.DownMixAudioBoost); + page.querySelector('.txtEncoderPath').value = config.EncoderAppPathDisplay || ''; + $('#txtTranscodingTempPath', page).val(systemInfo.TranscodingTempPath || ''); + $('#txtVaapiDevice', page).val(config.VaapiDevice || ''); + page.querySelector('#selectEncoderPreset').value = config.EncoderPreset || ''; + page.querySelector('#txtH264Crf').value = config.H264Crf || ''; + page.querySelector('#selectDeinterlaceMethod').value = config.DeinterlaceMethod || ''; + page.querySelector('#chkEnableSubtitleExtraction').checked = config.EnableSubtitleExtraction || false; + page.querySelector('#chkEnableThrottling').checked = config.EnableThrottling || false; + page.querySelector('#selectVideoDecoder').dispatchEvent(new CustomEvent('change', { bubbles: true })); loading.hide(); @@ -25,10 +25,10 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo function onSaveEncodingPathFailure(response) { loading.hide(); - var msg = ""; - msg = globalize.translate("FFmpegSavePathNotFound"); + var msg = ''; + msg = globalize.translate('FFmpegSavePathNotFound'); - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert(msg); }); } @@ -36,11 +36,11 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo function updateEncoder(form) { return ApiClient.getSystemInfo().then(function (systemInfo) { return ApiClient.ajax({ - url: ApiClient.getUrl("System/MediaEncoder/Path"), - type: "POST", + url: ApiClient.getUrl('System/MediaEncoder/Path'), + type: 'POST', data: { - Path: form.querySelector(".txtEncoderPath").value, - PathType: "Custom" + Path: form.querySelector('.txtEncoderPath').value, + PathType: 'Custom' } }).then(Dashboard.processServerConfigurationUpdateResult, onSaveEncodingPathFailure); }); @@ -51,28 +51,28 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo var onDecoderConfirmed = function () { loading.show(); - ApiClient.getNamedConfiguration("encoding").then(function (config) { - config.DownMixAudioBoost = $("#txtDownMixAudioBoost", form).val(); - config.TranscodingTempPath = $("#txtTranscodingTempPath", form).val(); - config.EncodingThreadCount = $("#selectThreadCount", form).val(); - config.HardwareAccelerationType = $("#selectVideoDecoder", form).val(); - config.VaapiDevice = $("#txtVaapiDevice", form).val(); - config.EncoderPreset = form.querySelector("#selectEncoderPreset").value; - config.H264Crf = parseInt(form.querySelector("#txtH264Crf").value || "0"); - config.DeinterlaceMethod = form.querySelector("#selectDeinterlaceMethod").value; - config.EnableSubtitleExtraction = form.querySelector("#chkEnableSubtitleExtraction").checked; - config.EnableThrottling = form.querySelector("#chkEnableThrottling").checked; - config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll(".chkDecodeCodec"), function (c) { + ApiClient.getNamedConfiguration('encoding').then(function (config) { + config.DownMixAudioBoost = $('#txtDownMixAudioBoost', form).val(); + config.TranscodingTempPath = $('#txtTranscodingTempPath', form).val(); + config.EncodingThreadCount = $('#selectThreadCount', form).val(); + config.HardwareAccelerationType = $('#selectVideoDecoder', form).val(); + config.VaapiDevice = $('#txtVaapiDevice', form).val(); + config.EncoderPreset = form.querySelector('#selectEncoderPreset').value; + config.H264Crf = parseInt(form.querySelector('#txtH264Crf').value || '0'); + config.DeinterlaceMethod = form.querySelector('#selectDeinterlaceMethod').value; + config.EnableSubtitleExtraction = form.querySelector('#chkEnableSubtitleExtraction').checked; + config.EnableThrottling = form.querySelector('#chkEnableThrottling').checked; + config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll('.chkDecodeCodec'), function (c) { return c.checked; }), function (c) { - return c.getAttribute("data-codec"); + return c.getAttribute('data-codec'); }); - config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked; - ApiClient.updateNamedConfiguration("encoding", config).then(function () { + config.EnableHardwareEncoding = form.querySelector('#chkHardwareEncoding').checked; + ApiClient.updateNamedConfiguration('encoding', config).then(function () { updateEncoder(form); }, function () { - require(["alert"], function (alert) { - alert(globalize.translate("DefaultErrorMessage")); + require(['alert'], function (alert) { + alert(globalize.translate('DefaultErrorMessage')); }); Dashboard.processServerConfigurationUpdateResult(); @@ -80,11 +80,11 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo }); }; - if ($("#selectVideoDecoder", form).val()) { - require(["alert"], function (alert) { + if ($('#selectVideoDecoder', form).val()) { + require(['alert'], function (alert) { alert({ - title: globalize.translate("TitleHardwareAcceleration"), - text: globalize.translate("HardwareAccelerationWarning") + title: globalize.translate('TitleHardwareAcceleration'), + text: globalize.translate('HardwareAccelerationWarning') }).then(onDecoderConfirmed); }); } else { @@ -95,64 +95,64 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo } function setDecodingCodecsVisible(context, value) { - value = value || ""; + value = value || ''; var any; - Array.prototype.forEach.call(context.querySelectorAll(".chkDecodeCodec"), function (c) { - if (-1 === c.getAttribute("data-types").split(",").indexOf(value)) { - dom.parentWithTag(c, "LABEL").classList.add("hide"); + Array.prototype.forEach.call(context.querySelectorAll('.chkDecodeCodec'), function (c) { + if (-1 === c.getAttribute('data-types').split(',').indexOf(value)) { + dom.parentWithTag(c, 'LABEL').classList.add('hide'); } else { - dom.parentWithTag(c, "LABEL").classList.remove("hide"); + dom.parentWithTag(c, 'LABEL').classList.remove('hide'); any = true; } }); if (any) { - context.querySelector(".decodingCodecsList").classList.remove("hide"); + context.querySelector('.decodingCodecsList').classList.remove('hide'); } else { - context.querySelector(".decodingCodecsList").classList.add("hide"); + context.querySelector('.decodingCodecsList').classList.add('hide'); } } function getTabs() { return [{ - href: "encodingsettings.html", - name: globalize.translate("Transcoding") + href: 'encodingsettings.html', + name: globalize.translate('Transcoding') }, { - href: "playbackconfiguration.html", - name: globalize.translate("TabResumeSettings") + href: 'playbackconfiguration.html', + name: globalize.translate('TabResumeSettings') }, { - href: "streamingsettings.html", - name: globalize.translate("TabStreaming") + href: 'streamingsettings.html', + name: globalize.translate('TabStreaming') }]; } - $(document).on("pageinit", "#encodingSettingsPage", function () { + $(document).on('pageinit', '#encodingSettingsPage', function () { var page = this; - page.querySelector("#selectVideoDecoder").addEventListener("change", function () { - if ("vaapi" == this.value) { - page.querySelector(".fldVaapiDevice").classList.remove("hide"); - page.querySelector("#txtVaapiDevice").setAttribute("required", "required"); + page.querySelector('#selectVideoDecoder').addEventListener('change', function () { + if ('vaapi' == this.value) { + page.querySelector('.fldVaapiDevice').classList.remove('hide'); + page.querySelector('#txtVaapiDevice').setAttribute('required', 'required'); } else { - page.querySelector(".fldVaapiDevice").classList.add("hide"); - page.querySelector("#txtVaapiDevice").removeAttribute("required"); + page.querySelector('.fldVaapiDevice').classList.add('hide'); + page.querySelector('#txtVaapiDevice').removeAttribute('required'); } if (this.value) { - page.querySelector(".hardwareAccelerationOptions").classList.remove("hide"); + page.querySelector('.hardwareAccelerationOptions').classList.remove('hide'); } else { - page.querySelector(".hardwareAccelerationOptions").classList.add("hide"); + page.querySelector('.hardwareAccelerationOptions').classList.add('hide'); } setDecodingCodecsVisible(page, this.value); }); - $("#btnSelectEncoderPath", page).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { + $('#btnSelectEncoderPath', page).on('click.selectDirectory', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ includeFiles: true, callback: function (path) { if (path) { - $(".txtEncoderPath", page).val(path); + $('.txtEncoderPath', page).val(path); } picker.close(); @@ -160,29 +160,29 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo }); }); }); - $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { + $('#btnSelectTranscodingTempPath', page).on('click.selectDirectory', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ callback: function (path) { if (path) { - $("#txtTranscodingTempPath", page).val(path); + $('#txtTranscodingTempPath', page).val(path); } picker.close(); }, validateWriteable: true, - header: globalize.translate("HeaderSelectTranscodingPath"), - instruction: globalize.translate("HeaderSelectTranscodingPathHelp") + header: globalize.translate('HeaderSelectTranscodingPath'), + instruction: globalize.translate('HeaderSelectTranscodingPathHelp') }); }); }); - $(".encodingSettingsForm").off("submit", onSubmit).on("submit", onSubmit); - }).on("pageshow", "#encodingSettingsPage", function () { + $('.encodingSettingsForm').off('submit', onSubmit).on('submit', onSubmit); + }).on('pageshow', '#encodingSettingsPage', function () { loading.show(); - libraryMenu.setTabs("playback", 0, getTabs); + libraryMenu.setTabs('playback', 0, getTabs); var page = this; - ApiClient.getNamedConfiguration("encoding").then(function (config) { + ApiClient.getNamedConfiguration('encoding').then(function (config) { ApiClient.getSystemInfo().then(function (systemInfo) { loadPage(page, config, systemInfo); }); diff --git a/src/controllers/dashboard/general.js b/src/controllers/dashboard/general.js index 68d72d432..98ca260f2 100644 --- a/src/controllers/dashboard/general.js +++ b/src/controllers/dashboard/general.js @@ -1,27 +1,27 @@ -define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox", "emby-textarea", "emby-input", "emby-select", "emby-button"], function ($, loading, globalize) { - "use strict"; +define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-checkbox', 'emby-textarea', 'emby-input', 'emby-select', 'emby-button'], function ($, loading, globalize) { + 'use strict'; function loadPage(page, config, languageOptions, systemInfo) { - page.querySelector("#txtServerName").value = systemInfo.ServerName; - $("#chkAutoRunWebApp", page).checked(config.AutoRunWebApp); + page.querySelector('#txtServerName').value = systemInfo.ServerName; + $('#chkAutoRunWebApp', page).checked(config.AutoRunWebApp); if (systemInfo.CanLaunchWebBrowser) { - page.querySelector("#fldAutoRunWebApp").classList.remove("hide"); + page.querySelector('#fldAutoRunWebApp').classList.remove('hide'); } else { - page.querySelector("#fldAutoRunWebApp").classList.add("hide"); + page.querySelector('#fldAutoRunWebApp').classList.add('hide'); } - page.querySelector("#txtCachePath").value = systemInfo.CachePath || ""; - $("#txtMetadataPath", page).val(systemInfo.InternalMetadataPath || ""); - $("#txtMetadataNetworkPath", page).val(systemInfo.MetadataNetworkPath || ""); - $("#selectLocalizationLanguage", page).html(languageOptions.map(function (language) { - return '"; + page.querySelector('#txtCachePath').value = systemInfo.CachePath || ''; + $('#txtMetadataPath', page).val(systemInfo.InternalMetadataPath || ''); + $('#txtMetadataNetworkPath', page).val(systemInfo.MetadataNetworkPath || ''); + $('#selectLocalizationLanguage', page).html(languageOptions.map(function (language) { + return ''; })).val(config.UICulture); currentLanguage = config.UICulture; if (systemInfo.CanSelfRestart || systemInfo.CanSelfUpdate) { - $(".autoUpdatesContainer", page).removeClass("hide"); + $('.autoUpdatesContainer', page).removeClass('hide'); } else { - $(".autoUpdatesContainer", page).addClass("hide"); + $('.autoUpdatesContainer', page).addClass('hide'); } loading.hide(); @@ -30,19 +30,19 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox", "emby-te function onSubmit() { loading.show(); var form = this; - $(form).parents(".page"); + $(form).parents('.page'); ApiClient.getServerConfiguration().then(function (config) { - config.ServerName = $("#txtServerName", form).val(); - config.UICulture = $("#selectLocalizationLanguage", form).val(); - config.CachePath = form.querySelector("#txtCachePath").value; - config.MetadataPath = $("#txtMetadataPath", form).val(); - config.MetadataNetworkPath = $("#txtMetadataNetworkPath", form).val(); + config.ServerName = $('#txtServerName', form).val(); + config.UICulture = $('#selectLocalizationLanguage', form).val(); + config.CachePath = form.querySelector('#txtCachePath').value; + config.MetadataPath = $('#txtMetadataPath', form).val(); + config.MetadataNetworkPath = $('#txtMetadataNetworkPath', form).val(); var requiresReload = config.UICulture !== currentLanguage; - config.AutoRunWebApp = $("#chkAutoRunWebApp", form).checked(); + config.AutoRunWebApp = $('#chkAutoRunWebApp', form).checked(); ApiClient.updateServerConfiguration(config).then(function() { ApiClient.getNamedConfiguration(brandingConfigKey).then(function(brandingConfig) { - brandingConfig.LoginDisclaimer = form.querySelector("#txtLoginDisclaimer").value; - brandingConfig.CustomCss = form.querySelector("#txtCustomCss").value; + brandingConfig.LoginDisclaimer = form.querySelector('#txtLoginDisclaimer').value; + brandingConfig.CustomCss = form.querySelector('#txtCustomCss').value; if (currentBrandingOptions && brandingConfig.CustomCss !== currentBrandingOptions.CustomCss) { requiresReload = true; @@ -57,8 +57,8 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox", "emby-te }); }); }, function () { - require(["alert"], function (alert) { - alert(globalize.translate("DefaultErrorMessage")); + require(['alert'], function (alert) { + alert(globalize.translate('DefaultErrorMessage')); }); Dashboard.processServerConfigurationUpdateResult(); @@ -69,61 +69,61 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox", "emby-te var currentBrandingOptions; var currentLanguage; - var brandingConfigKey = "branding"; + var brandingConfigKey = 'branding'; return function (view, params) { - $("#btnSelectCachePath", view).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { + $('#btnSelectCachePath', view).on('click.selectDirectory', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ callback: function (path) { if (path) { - view.querySelector("#txtCachePath").value = path; + view.querySelector('#txtCachePath').value = path; } picker.close(); }, validateWriteable: true, - header: globalize.translate("HeaderSelectServerCachePath"), - instruction: globalize.translate("HeaderSelectServerCachePathHelp") + header: globalize.translate('HeaderSelectServerCachePath'), + instruction: globalize.translate('HeaderSelectServerCachePathHelp') }); }); }); - $("#btnSelectMetadataPath", view).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { + $('#btnSelectMetadataPath', view).on('click.selectDirectory', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ - path: $("#txtMetadataPath", view).val(), - networkSharePath: $("#txtMetadataNetworkPath", view).val(), + path: $('#txtMetadataPath', view).val(), + networkSharePath: $('#txtMetadataNetworkPath', view).val(), callback: function (path, networkPath) { if (path) { - $("#txtMetadataPath", view).val(path); + $('#txtMetadataPath', view).val(path); } if (networkPath) { - $("#txtMetadataNetworkPath", view).val(networkPath); + $('#txtMetadataNetworkPath', view).val(networkPath); } picker.close(); }, validateWriteable: true, - header: globalize.translate("HeaderSelectMetadataPath"), - instruction: globalize.translate("HeaderSelectMetadataPathHelp"), + header: globalize.translate('HeaderSelectMetadataPath'), + instruction: globalize.translate('HeaderSelectMetadataPathHelp'), enableNetworkSharePath: true }); }); }); - $(".dashboardGeneralForm", view).off("submit", onSubmit).on("submit", onSubmit); - view.addEventListener("viewshow", function () { + $('.dashboardGeneralForm', view).off('submit', onSubmit).on('submit', onSubmit); + view.addEventListener('viewshow', function () { var promiseConfig = ApiClient.getServerConfiguration(); - var promiseLanguageOptions = ApiClient.getJSON(ApiClient.getUrl("Localization/Options")); + var promiseLanguageOptions = ApiClient.getJSON(ApiClient.getUrl('Localization/Options')); var promiseSystemInfo = ApiClient.getSystemInfo(); Promise.all([promiseConfig, promiseLanguageOptions, promiseSystemInfo]).then(function (responses) { loadPage(view, responses[0], responses[1], responses[2]); }); ApiClient.getNamedConfiguration(brandingConfigKey).then(function (config) { currentBrandingOptions = config; - view.querySelector("#txtLoginDisclaimer").value = config.LoginDisclaimer || ""; - view.querySelector("#txtCustomCss").value = config.CustomCss || ""; + view.querySelector('#txtLoginDisclaimer').value = config.LoginDisclaimer || ''; + view.querySelector('#txtCustomCss').value = config.CustomCss || ''; }); }); }; diff --git a/src/controllers/dashboard/librarydisplay.js b/src/controllers/dashboard/librarydisplay.js index 603ab1ee6..a820c3752 100644 --- a/src/controllers/dashboard/librarydisplay.js +++ b/src/controllers/dashboard/librarydisplay.js @@ -1,50 +1,50 @@ -define(["globalize", "loading", "libraryMenu", "emby-checkbox", "emby-button", "emby-button"], function(globalize, loading, libraryMenu) { - "use strict"; +define(['globalize', 'loading', 'libraryMenu', 'emby-checkbox', 'emby-button', 'emby-button'], function(globalize, loading, libraryMenu) { + 'use strict'; function getTabs() { return [{ - href: "library.html", - name: globalize.translate("HeaderLibraries") + href: 'library.html', + name: globalize.translate('HeaderLibraries') }, { - href: "librarydisplay.html", - name: globalize.translate("TabDisplay") + href: 'librarydisplay.html', + name: globalize.translate('TabDisplay') }, { - href: "metadataimages.html", - name: globalize.translate("TabMetadata") + href: 'metadataimages.html', + name: globalize.translate('TabMetadata') }, { - href: "metadatanfo.html", - name: globalize.translate("TabNfoSettings") + href: 'metadatanfo.html', + name: globalize.translate('TabNfoSettings') }]; } return function(view, params) { function loadData() { ApiClient.getServerConfiguration().then(function(config) { - view.querySelector(".chkFolderView").checked = config.EnableFolderView; - view.querySelector(".chkGroupMoviesIntoCollections").checked = config.EnableGroupingIntoCollections; - view.querySelector(".chkDisplaySpecialsWithinSeasons").checked = config.DisplaySpecialsWithinSeasons; - view.querySelector(".chkExternalContentInSuggestions").checked = config.EnableExternalContentInSuggestions; - view.querySelector("#chkSaveMetadataHidden").checked = config.SaveMetadataHidden; + view.querySelector('.chkFolderView').checked = config.EnableFolderView; + view.querySelector('.chkGroupMoviesIntoCollections').checked = config.EnableGroupingIntoCollections; + view.querySelector('.chkDisplaySpecialsWithinSeasons').checked = config.DisplaySpecialsWithinSeasons; + view.querySelector('.chkExternalContentInSuggestions').checked = config.EnableExternalContentInSuggestions; + view.querySelector('#chkSaveMetadataHidden').checked = config.SaveMetadataHidden; }); - ApiClient.getNamedConfiguration("metadata").then(function(metadata) { - view.querySelector("#selectDateAdded").selectedIndex = metadata.UseFileCreationTimeForDateAdded ? 1 : 0; + ApiClient.getNamedConfiguration('metadata').then(function(metadata) { + view.querySelector('#selectDateAdded').selectedIndex = metadata.UseFileCreationTimeForDateAdded ? 1 : 0; }); } - view.querySelector("form").addEventListener("submit", function(e) { + view.querySelector('form').addEventListener('submit', function(e) { loading.show(); var form = this; ApiClient.getServerConfiguration().then(function(config) { - config.EnableFolderView = form.querySelector(".chkFolderView").checked; - config.EnableGroupingIntoCollections = form.querySelector(".chkGroupMoviesIntoCollections").checked; - config.DisplaySpecialsWithinSeasons = form.querySelector(".chkDisplaySpecialsWithinSeasons").checked; - config.EnableExternalContentInSuggestions = form.querySelector(".chkExternalContentInSuggestions").checked; - config.SaveMetadataHidden = form.querySelector("#chkSaveMetadataHidden").checked; + config.EnableFolderView = form.querySelector('.chkFolderView').checked; + config.EnableGroupingIntoCollections = form.querySelector('.chkGroupMoviesIntoCollections').checked; + config.DisplaySpecialsWithinSeasons = form.querySelector('.chkDisplaySpecialsWithinSeasons').checked; + config.EnableExternalContentInSuggestions = form.querySelector('.chkExternalContentInSuggestions').checked; + config.SaveMetadataHidden = form.querySelector('#chkSaveMetadataHidden').checked; ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); }); - ApiClient.getNamedConfiguration("metadata").then(function(config) { - config.UseFileCreationTimeForDateAdded = "1" === $("#selectDateAdded", form).val(); - ApiClient.updateNamedConfiguration("metadata", config); + ApiClient.getNamedConfiguration('metadata').then(function(config) { + config.UseFileCreationTimeForDateAdded = '1' === $('#selectDateAdded', form).val(); + ApiClient.updateNamedConfiguration('metadata', config); }); e.preventDefault(); @@ -52,14 +52,14 @@ define(["globalize", "loading", "libraryMenu", "emby-checkbox", "emby-button", " return false; }); - view.addEventListener("viewshow", function() { - libraryMenu.setTabs("librarysetup", 1, getTabs); + view.addEventListener('viewshow', function() { + libraryMenu.setTabs('librarysetup', 1, getTabs); loadData(); ApiClient.getSystemInfo().then(function(info) { - if ("Windows" === info.OperatingSystem) { - view.querySelector(".fldSaveMetadataHidden").classList.remove("hide"); + if ('Windows' === info.OperatingSystem) { + view.querySelector('.fldSaveMetadataHidden').classList.remove('hide'); } else { - view.querySelector(".fldSaveMetadataHidden").classList.add("hide"); + view.querySelector('.fldSaveMetadataHidden').classList.add('hide'); } }); }); diff --git a/src/controllers/dashboard/logs.js b/src/controllers/dashboard/logs.js index 46b5e1ac2..e0b000a13 100644 --- a/src/controllers/dashboard/logs.js +++ b/src/controllers/dashboard/logs.js @@ -1,31 +1,31 @@ -define(["datetime", "loading", "apphost", "listViewStyle", "emby-button", "flexStyles"], function(datetime, loading, appHost) { - "use strict"; +define(['datetime', 'loading', 'apphost', 'listViewStyle', 'emby-button', 'flexStyles'], function(datetime, loading, appHost) { + 'use strict'; return function(view, params) { - view.addEventListener("viewbeforeshow", function() { + view.addEventListener('viewbeforeshow', function() { loading.show(); var apiClient = ApiClient; - apiClient.getJSON(apiClient.getUrl("System/Logs")).then(function(logs) { - var html = ""; + apiClient.getJSON(apiClient.getUrl('System/Logs')).then(function(logs) { + var html = ''; html += '
'; html += logs.map(function(log) { - var logUrl = apiClient.getUrl("System/Logs/Log", { + var logUrl = apiClient.getUrl('System/Logs/Log', { name: log.Name }); - logUrl += "&api_key=" + apiClient.accessToken(); - var logHtml = ""; + logUrl += '&api_key=' + apiClient.accessToken(); + var logHtml = ''; logHtml += ''; logHtml += '
'; - logHtml += "

" + log.Name + "

"; + logHtml += "

" + log.Name + '

'; var date = datetime.parseISO8601Date(log.DateModified, true); var text = datetime.toLocaleDateString(date); - text += " " + datetime.getDisplayTime(date); - logHtml += '
' + text + "
"; - logHtml += "
"; - logHtml += "
"; + text += ' ' + datetime.getDisplayTime(date); + logHtml += '
' + text + '
'; + logHtml += '
'; + logHtml += ''; return logHtml; - }).join(""); - html += ""; - view.querySelector(".serverLogs").innerHTML = html; + }).join(''); + html += ''; + view.querySelector('.serverLogs').innerHTML = html; loading.hide(); }); }); diff --git a/src/controllers/dashboard/medialibrarypage.js b/src/controllers/dashboard/medialibrarypage.js index b94c8600f..06eba37cb 100644 --- a/src/controllers/dashboard/medialibrarypage.js +++ b/src/controllers/dashboard/medialibrarypage.js @@ -1,8 +1,8 @@ -define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "globalize", "dom", "indicators", "scripts/imagehelper", "cardStyle", "emby-itemrefreshindicator"], function ($, appHost, taskButton, loading, libraryMenu, globalize, dom, indicators, imageHelper) { - "use strict"; +define(['jQuery', 'apphost', 'scripts/taskbutton', 'loading', 'libraryMenu', 'globalize', 'dom', 'indicators', 'scripts/imagehelper', 'cardStyle', 'emby-itemrefreshindicator'], function ($, appHost, taskButton, loading, libraryMenu, globalize, dom, indicators, imageHelper) { + 'use strict'; function addVirtualFolder(page) { - require(["medialibrarycreator"], function (medialibrarycreator) { + require(['medialibrarycreator'], function (medialibrarycreator) { new medialibrarycreator().show({ collectionTypeOptions: getCollectionTypeOptions().filter(function (f) { return !f.hidden; @@ -17,7 +17,7 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl } function editVirtualFolder(page, virtualFolder) { - require(["medialibraryeditor"], function (medialibraryeditor) { + require(['medialibraryeditor'], function (medialibraryeditor) { new medialibraryeditor().show({ refresh: shouldRefreshLibraryAfterChanges(page), library: virtualFolder @@ -30,14 +30,14 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl } function deleteVirtualFolder(page, virtualFolder) { - var msg = globalize.translate("MessageAreYouSureYouWishToRemoveMediaFolder"); + var msg = globalize.translate('MessageAreYouSureYouWishToRemoveMediaFolder'); if (virtualFolder.Locations.length) { - msg += "

" + globalize.translate("MessageTheFollowingLocationWillBeRemovedFromLibrary") + "

"; - msg += virtualFolder.Locations.join("
"); + msg += '

' + globalize.translate('MessageTheFollowingLocationWillBeRemovedFromLibrary') + '

'; + msg += virtualFolder.Locations.join('
'); } - require(["confirm"], function (confirm) { + require(['confirm'], function (confirm) { confirm({ text: msg, @@ -55,20 +55,20 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl } function refreshVirtualFolder(page, virtualFolder) { - require(["refreshDialog"], function (refreshDialog) { + require(['refreshDialog'], function (refreshDialog) { new refreshDialog({ itemIds: [virtualFolder.ItemId], serverId: ApiClient.serverId(), - mode: "scan" + mode: 'scan' }).show(); }); } function renameVirtualFolder(page, virtualFolder) { - require(["prompt"], function (prompt) { + require(['prompt'], function (prompt) { prompt({ - label: globalize.translate("LabelNewName"), - confirmText: globalize.translate("ButtonRename") + label: globalize.translate('LabelNewName'), + confirmText: globalize.translate('ButtonRename') }).then(function (newName) { if (newName && newName != virtualFolder.Name) { var refreshAfterChange = shouldRefreshLibraryAfterChanges(page); @@ -81,59 +81,59 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl } function showCardMenu(page, elem, virtualFolders) { - var card = dom.parentWithClass(elem, "card"); - var index = parseInt(card.getAttribute("data-index")); + var card = dom.parentWithClass(elem, 'card'); + var index = parseInt(card.getAttribute('data-index')); var virtualFolder = virtualFolders[index]; var menuItems = []; menuItems.push({ - name: globalize.translate("ButtonEditImages"), - id: "editimages", - icon: "photo" + name: globalize.translate('ButtonEditImages'), + id: 'editimages', + icon: 'photo' }); menuItems.push({ - name: globalize.translate("ManageLibrary"), - id: "edit", - icon: "folder_open" + name: globalize.translate('ManageLibrary'), + id: 'edit', + icon: 'folder_open' }); menuItems.push({ - name: globalize.translate("ButtonRemove"), - id: "delete", - icon: "delete" + name: globalize.translate('ButtonRemove'), + id: 'delete', + icon: 'delete' }); menuItems.push({ - name: globalize.translate("ButtonRename"), - id: "rename", - icon: "mode_edit" + name: globalize.translate('ButtonRename'), + id: 'rename', + icon: 'mode_edit' }); menuItems.push({ - name: globalize.translate("ScanLibrary"), - id: "refresh", - icon: "refresh" + name: globalize.translate('ScanLibrary'), + id: 'refresh', + icon: 'refresh' }); - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: menuItems, positionTo: elem, callback: function (resultId) { switch (resultId) { - case "edit": + case 'edit': editVirtualFolder(page, virtualFolder); break; - case "editimages": + case 'editimages': editImages(page, virtualFolder); break; - case "rename": + case 'rename': renameVirtualFolder(page, virtualFolder); break; - case "delete": + case 'delete': deleteVirtualFolder(page, virtualFolder); break; - case "refresh": + case 'refresh': refreshVirtualFolder(page, virtualFolder); } } @@ -149,14 +149,14 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl } function shouldRefreshLibraryAfterChanges(page) { - return "mediaLibraryPage" === page.id; + return 'mediaLibraryPage' === page.id; } function reloadVirtualFolders(page, virtualFolders) { - var html = ""; + var html = ''; virtualFolders.push({ - Name: globalize.translate("ButtonAddMediaLibrary"), - icon: "add_circle", + Name: globalize.translate('ButtonAddMediaLibrary'), + icon: 'add_circle', Locations: [], showType: false, showLocations: false, @@ -169,19 +169,19 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl html += getVirtualFolderHtml(page, virtualFolder, i); } - var divVirtualFolders = page.querySelector("#divVirtualFolders"); + var divVirtualFolders = page.querySelector('#divVirtualFolders'); divVirtualFolders.innerHTML = html; - divVirtualFolders.classList.add("itemsContainer"); - divVirtualFolders.classList.add("vertical-wrap"); - $(".btnCardMenu", divVirtualFolders).on("click", function () { + divVirtualFolders.classList.add('itemsContainer'); + divVirtualFolders.classList.add('vertical-wrap'); + $('.btnCardMenu', divVirtualFolders).on('click', function () { showCardMenu(page, this, virtualFolders); }); - divVirtualFolders.querySelector(".addLibrary").addEventListener("click", function () { + divVirtualFolders.querySelector('.addLibrary').addEventListener('click', function () { addVirtualFolder(page); }); - $(".editLibrary", divVirtualFolders).on("click", function () { - var card = $(this).parents(".card")[0]; - var index = parseInt(card.getAttribute("data-index")); + $('.editLibrary', divVirtualFolders).on('click', function () { + var card = $(this).parents('.card')[0]; + var index = parseInt(card.getAttribute('data-index')); var virtualFolder = virtualFolders[index]; if (virtualFolder.ItemId) { @@ -192,7 +192,7 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl } function editImages(page, virtualFolder) { - require(["imageEditor"], function (imageEditor) { + require(['imageEditor'], function (imageEditor) { imageEditor.show({ itemId: virtualFolder.ItemId, serverId: ApiClient.serverId() @@ -203,48 +203,48 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl } function getLink(text, url) { - return globalize.translate(text, '', ""); + return globalize.translate(text, '', ''); } function getCollectionTypeOptions() { return [{ - name: "", - value: "" + name: '', + value: '' }, { - name: globalize.translate("FolderTypeMovies"), - value: "movies", - message: getLink("MovieLibraryHelp", "https://docs.jellyfin.org/general/server/media/movies.html") + name: globalize.translate('FolderTypeMovies'), + value: 'movies', + message: getLink('MovieLibraryHelp', 'https://docs.jellyfin.org/general/server/media/movies.html') }, { - name: globalize.translate("FolderTypeMusic"), - value: "music", - message: getLink("MusicLibraryHelp", "https://docs.jellyfin.org/general/server/media/music.html") + name: globalize.translate('FolderTypeMusic'), + value: 'music', + message: getLink('MusicLibraryHelp', 'https://docs.jellyfin.org/general/server/media/music.html') }, { - name: globalize.translate("FolderTypeTvShows"), - value: "tvshows", - message: getLink("TvLibraryHelp", "https://docs.jellyfin.org/general/server/media/shows.html") + name: globalize.translate('FolderTypeTvShows'), + value: 'tvshows', + message: getLink('TvLibraryHelp', 'https://docs.jellyfin.org/general/server/media/shows.html') }, { - name: globalize.translate("FolderTypeBooks"), - value: "books", - message: getLink("BookLibraryHelp", "https://docs.jellyfin.org/general/server/media/books.html") + name: globalize.translate('FolderTypeBooks'), + value: 'books', + message: getLink('BookLibraryHelp', 'https://docs.jellyfin.org/general/server/media/books.html') }, { - name: globalize.translate("OptionHomeVideos"), - value: "homevideos" + name: globalize.translate('OptionHomeVideos'), + value: 'homevideos' }, { - name: globalize.translate("FolderTypeMusicVideos"), - value: "musicvideos" + name: globalize.translate('FolderTypeMusicVideos'), + value: 'musicvideos' }, { - name: globalize.translate("FolderTypeUnset"), - value: "mixed", - message: globalize.translate("MessageUnsetContentHelp") + name: globalize.translate('FolderTypeUnset'), + value: 'mixed', + message: globalize.translate('MessageUnsetContentHelp') }]; } function getVirtualFolderHtml(page, virtualFolder, index) { - var html = ""; - var style = ""; + var html = ''; + var style = ''; - if (page.classList.contains("wizardPage")) { - style += "min-width:33.3%;"; + if (page.classList.contains('wizardPage')) { + style += 'min-width:33.3%;'; } html += '
'; @@ -252,12 +252,12 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl html += '
'; html += '
'; html += '
'; - var imgUrl = ""; + var imgUrl = ''; if (virtualFolder.PrimaryImageItemId) { imgUrl = ApiClient.getScaledImageUrl(virtualFolder.PrimaryImageItemId, { maxWidth: Math.round(dom.getScreenWidth() * 0.40), - type: "Primary" + type: 'Primary' }); } @@ -268,124 +268,124 @@ define(["jQuery", "apphost", "scripts/taskbutton", "loading", "libraryMenu", "gl hasCardImageContainer = true; } else if (!virtualFolder.showNameWithIcon) { html += '
'; - html += '' + (virtualFolder.icon || imageHelper.getLibraryIcon(virtualFolder.CollectionType)) + ""; + html += ''; hasCardImageContainer = true; } if (hasCardImageContainer) { html += '
'; - html += '
'; - html += "
"; - html += "
"; + html += '
'; + html += '
'; + html += '
'; } if (!imgUrl && virtualFolder.showNameWithIcon) { html += '

'; - html += '' + (virtualFolder.icon || imageHelper.getLibraryIcon(virtualFolder.CollectionType)) + ""; + html += ''; if (virtualFolder.showNameWithIcon) { html += '
'; html += virtualFolder.Name; - html += "
"; + html += '

'; } - html += ""; + html += ''; } - html += ""; - html += ""; + html += ''; + html += ''; html += '
'; // always show menu unless explicitly hidden if (virtualFolder.showMenu !== false) { html += '
'; - html += ''; - html += "
"; + html += ''; + html += '
'; } html += "
"; if (virtualFolder.showNameWithIcon) { - html += " "; + html += ' '; } else { html += virtualFolder.Name; } - html += "
"; + html += ''; var typeName = getCollectionTypeOptions().filter(function (t) { return t.value == virtualFolder.CollectionType; })[0]; - typeName = typeName ? typeName.name : globalize.translate("FolderTypeUnset"); + typeName = typeName ? typeName.name : globalize.translate('FolderTypeUnset'); html += "
"; if (virtualFolder.showType === false) { - html += " "; + html += ' '; } else { html += typeName; } - html += "
"; + html += ''; if (virtualFolder.showLocations === false) { html += "
"; - html += " "; - html += "
"; + html += ' '; + html += ''; } else if (virtualFolder.Locations.length && virtualFolder.Locations.length === 1) { html += "
"; html += virtualFolder.Locations[0]; - html += "
"; + html += ''; } else { html += "
"; - html += globalize.translate("NumLocationsValue", virtualFolder.Locations.length); - html += "
"; + html += globalize.translate('NumLocationsValue', virtualFolder.Locations.length); + html += ''; } - html += ""; - html += ""; - html += ""; + html += ''; + html += ''; + html += ''; return html; } function getTabs() { return [{ - href: "library.html", - name: globalize.translate("HeaderLibraries") + href: 'library.html', + name: globalize.translate('HeaderLibraries') }, { - href: "librarydisplay.html", - name: globalize.translate("TabDisplay") + href: 'librarydisplay.html', + name: globalize.translate('TabDisplay') }, { - href: "metadataimages.html", - name: globalize.translate("TabMetadata") + href: 'metadataimages.html', + name: globalize.translate('TabMetadata') }, { - href: "metadatanfo.html", - name: globalize.translate("TabNfoSettings") + href: 'metadatanfo.html', + name: globalize.translate('TabNfoSettings') }]; } window.WizardLibraryPage = { next: function () { - Dashboard.navigate("wizardsettings.html"); + Dashboard.navigate('wizardsettings.html'); } }; - pageClassOn("pageshow", "mediaLibraryPage", function () { + pageClassOn('pageshow', 'mediaLibraryPage', function () { reloadLibrary(this); }); - pageIdOn("pageshow", "mediaLibraryPage", function () { - libraryMenu.setTabs("librarysetup", 0, getTabs); + pageIdOn('pageshow', 'mediaLibraryPage', function () { + libraryMenu.setTabs('librarysetup', 0, getTabs); var page = this; taskButton({ - mode: "on", - progressElem: page.querySelector(".refreshProgress"), - taskKey: "RefreshLibrary", - button: page.querySelector(".btnRefresh") + mode: 'on', + progressElem: page.querySelector('.refreshProgress'), + taskKey: 'RefreshLibrary', + button: page.querySelector('.btnRefresh') }); }); - pageIdOn("pagebeforehide", "mediaLibraryPage", function () { + pageIdOn('pagebeforehide', 'mediaLibraryPage', function () { var page = this; taskButton({ - mode: "off", - progressElem: page.querySelector(".refreshProgress"), - taskKey: "RefreshLibrary", - button: page.querySelector(".btnRefresh") + mode: 'off', + progressElem: page.querySelector('.refreshProgress'), + taskKey: 'RefreshLibrary', + button: page.querySelector('.btnRefresh') }); }); }); diff --git a/src/controllers/dashboard/metadataimagespage.js b/src/controllers/dashboard/metadataimagespage.js index 42d751a24..277eecb42 100644 --- a/src/controllers/dashboard/metadataimagespage.js +++ b/src/controllers/dashboard/metadataimagespage.js @@ -1,13 +1,13 @@ -define(["jQuery", "dom", "loading", "libraryMenu", "globalize", "listViewStyle"], function($, dom, loading, libraryMenu, globalize) { - "use strict"; +define(['jQuery', 'dom', 'loading', 'libraryMenu', 'globalize', 'listViewStyle'], function($, dom, loading, libraryMenu, globalize) { + 'use strict'; function populateLanguages(select) { return ApiClient.getCultures().then(function(languages) { - var html = ""; + var html = ''; html += ""; for (var i = 0, length = languages.length; i < length; i++) { var culture = languages[i]; - html += ""; + html += "'; } select.innerHTML = html; }); @@ -15,50 +15,50 @@ define(["jQuery", "dom", "loading", "libraryMenu", "globalize", "listViewStyle"] function populateCountries(select) { return ApiClient.getCountries().then(function(allCountries) { - var html = ""; + var html = ''; html += ""; for (var i = 0, length = allCountries.length; i < length; i++) { var culture = allCountries[i]; - html += ""; + html += "'; } select.innerHTML = html; }); } function loadPage(page) { - var promises = [ApiClient.getServerConfiguration(), populateLanguages(page.querySelector("#selectLanguage")), populateCountries(page.querySelector("#selectCountry"))]; + var promises = [ApiClient.getServerConfiguration(), populateLanguages(page.querySelector('#selectLanguage')), populateCountries(page.querySelector('#selectCountry'))]; Promise.all(promises).then(function(responses) { var config = responses[0]; - page.querySelector("#selectLanguage").value = config.PreferredMetadataLanguage || "", page.querySelector("#selectCountry").value = config.MetadataCountryCode || "", loading.hide(); + page.querySelector('#selectLanguage').value = config.PreferredMetadataLanguage || '', page.querySelector('#selectCountry').value = config.MetadataCountryCode || '', loading.hide(); }); } function onSubmit() { var form = this; return loading.show(), ApiClient.getServerConfiguration().then(function(config) { - config.PreferredMetadataLanguage = form.querySelector("#selectLanguage").value, config.MetadataCountryCode = form.querySelector("#selectCountry").value, ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); + config.PreferredMetadataLanguage = form.querySelector('#selectLanguage').value, config.MetadataCountryCode = form.querySelector('#selectCountry').value, ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); }), !1; } function getTabs() { return [{ - href: "library.html", - name: globalize.translate("HeaderLibraries") + href: 'library.html', + name: globalize.translate('HeaderLibraries') }, { - href: "librarydisplay.html", - name: globalize.translate("TabDisplay") + href: 'librarydisplay.html', + name: globalize.translate('TabDisplay') }, { - href: "metadataimages.html", - name: globalize.translate("TabMetadata") + href: 'metadataimages.html', + name: globalize.translate('TabMetadata') }, { - href: "metadatanfo.html", - name: globalize.translate("TabNfoSettings") + href: 'metadatanfo.html', + name: globalize.translate('TabNfoSettings') }]; } - $(document).on("pageinit", "#metadataImagesConfigurationPage", function() { - $(".metadataImagesConfigurationForm").off("submit", onSubmit).on("submit", onSubmit); - }).on("pageshow", "#metadataImagesConfigurationPage", function() { - libraryMenu.setTabs("metadata", 2, getTabs), loading.show(), loadPage(this); + $(document).on('pageinit', '#metadataImagesConfigurationPage', function() { + $('.metadataImagesConfigurationForm').off('submit', onSubmit).on('submit', onSubmit); + }).on('pageshow', '#metadataImagesConfigurationPage', function() { + libraryMenu.setTabs('metadata', 2, getTabs), loading.show(), loadPage(this); }); }); diff --git a/src/controllers/dashboard/metadatanfo.js b/src/controllers/dashboard/metadatanfo.js index 586663218..a93619261 100644 --- a/src/controllers/dashboard/metadatanfo.js +++ b/src/controllers/dashboard/metadatanfo.js @@ -1,16 +1,16 @@ -define(["jQuery", "loading", "libraryMenu", "globalize"], function ($, loading, libraryMenu, globalize) { - "use strict"; +define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, libraryMenu, globalize) { + 'use strict'; function loadPage(page, config, users) { - var html = '"; + var html = ''; html += users.map(function (user) { - return '"; - }).join(""); - $("#selectUser", page).html(html).val(config.UserId || ""); - $("#selectReleaseDateFormat", page).val(config.ReleaseDateFormat); - page.querySelector("#chkSaveImagePaths").checked = config.SaveImagePathsInNfo; - page.querySelector("#chkEnablePathSubstitution").checked = config.EnablePathSubstitution; - page.querySelector("#chkEnableExtraThumbs").checked = config.EnableExtraThumbsDuplication; + return ''; + }).join(''); + $('#selectUser', page).html(html).val(config.UserId || ''); + $('#selectReleaseDateFormat', page).val(config.ReleaseDateFormat); + page.querySelector('#chkSaveImagePaths').checked = config.SaveImagePathsInNfo; + page.querySelector('#chkEnablePathSubstitution').checked = config.EnablePathSubstitution; + page.querySelector('#chkEnableExtraThumbs').checked = config.EnableExtraThumbsDuplication; loading.hide(); } @@ -18,11 +18,11 @@ define(["jQuery", "loading", "libraryMenu", "globalize"], function ($, loading, loading.show(); var form = this; ApiClient.getNamedConfiguration(metadataKey).then(function (config) { - config.UserId = $("#selectUser", form).val() || null; - config.ReleaseDateFormat = $("#selectReleaseDateFormat", form).val(); - config.SaveImagePathsInNfo = form.querySelector("#chkSaveImagePaths").checked; - config.EnablePathSubstitution = form.querySelector("#chkEnablePathSubstitution").checked; - config.EnableExtraThumbsDuplication = form.querySelector("#chkEnableExtraThumbs").checked; + config.UserId = $('#selectUser', form).val() || null; + config.ReleaseDateFormat = $('#selectReleaseDateFormat', form).val(); + config.SaveImagePathsInNfo = form.querySelector('#chkSaveImagePaths').checked; + config.EnablePathSubstitution = form.querySelector('#chkEnablePathSubstitution').checked; + config.EnableExtraThumbsDuplication = form.querySelector('#chkEnableExtraThumbs').checked; ApiClient.updateNamedConfiguration(metadataKey, config).then(function () { Dashboard.processServerConfigurationUpdateResult(); showConfirmMessage(config); @@ -33,36 +33,36 @@ define(["jQuery", "loading", "libraryMenu", "globalize"], function ($, loading, function showConfirmMessage(config) { var msg = []; - msg.push(globalize.translate("MetadataSettingChangeHelp")); + msg.push(globalize.translate('MetadataSettingChangeHelp')); - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert({ - text: msg.join("

") + text: msg.join('

') }); }); } function getTabs() { return [{ - href: "library.html", - name: globalize.translate("HeaderLibraries") + href: 'library.html', + name: globalize.translate('HeaderLibraries') }, { - href: "librarydisplay.html", - name: globalize.translate("TabDisplay") + href: 'librarydisplay.html', + name: globalize.translate('TabDisplay') }, { - href: "metadataimages.html", - name: globalize.translate("TabMetadata") + href: 'metadataimages.html', + name: globalize.translate('TabMetadata') }, { - href: "metadatanfo.html", - name: globalize.translate("TabNfoSettings") + href: 'metadatanfo.html', + name: globalize.translate('TabNfoSettings') }]; } - var metadataKey = "xbmcmetadata"; - $(document).on("pageinit", "#metadataNfoPage", function () { - $(".metadataNfoForm").off("submit", onSubmit).on("submit", onSubmit); - }).on("pageshow", "#metadataNfoPage", function () { - libraryMenu.setTabs("metadata", 3, getTabs); + var metadataKey = 'xbmcmetadata'; + $(document).on('pageinit', '#metadataNfoPage', function () { + $('.metadataNfoForm').off('submit', onSubmit).on('submit', onSubmit); + }).on('pageshow', '#metadataNfoPage', function () { + libraryMenu.setTabs('metadata', 3, getTabs); loading.show(); var page = this; var promise1 = ApiClient.getUsers(); diff --git a/src/controllers/dashboard/networking.js b/src/controllers/dashboard/networking.js index c0e4d76d0..9cf638cee 100644 --- a/src/controllers/dashboard/networking.js +++ b/src/controllers/dashboard/networking.js @@ -1,10 +1,10 @@ -define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"], function (loading, libraryMenu, globalize) { - "use strict"; +define(['loading', 'libraryMenu', 'globalize', 'emby-checkbox', 'emby-select'], function (loading, libraryMenu, globalize) { + 'use strict'; function onSubmit(e) { var form = this; - var localAddress = form.querySelector("#txtLocalAddress").value; - var enableUpnp = form.querySelector("#chkEnableUpnp").checked; + var localAddress = form.querySelector('#txtLocalAddress').value; + var enableUpnp = form.querySelector('#chkEnableUpnp').checked; confirmSelections(localAddress, enableUpnp, function () { var validationResult = getValidationAlert(form); @@ -16,35 +16,35 @@ define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"], validateHttps(form).then(function () { loading.show(); ApiClient.getServerConfiguration().then(function (config) { - config.LocalNetworkSubnets = form.querySelector("#txtLanNetworks").value.split(",").map(function (s) { + config.LocalNetworkSubnets = form.querySelector('#txtLanNetworks').value.split(',').map(function (s) { return s.trim(); }).filter(function (s) { return s.length > 0; }); - config.RemoteIPFilter = form.querySelector("#txtExternalAddressFilter").value.split(",").map(function (s) { + config.RemoteIPFilter = form.querySelector('#txtExternalAddressFilter').value.split(',').map(function (s) { return s.trim(); }).filter(function (s) { return s.length > 0; }); - config.IsRemoteIPFilterBlacklist = "blacklist" === form.querySelector("#selectExternalAddressFilterMode").value; - config.PublicPort = form.querySelector("#txtPublicPort").value; - config.PublicHttpsPort = form.querySelector("#txtPublicHttpsPort").value; - var httpsMode = form.querySelector("#selectHttpsMode").value; + config.IsRemoteIPFilterBlacklist = 'blacklist' === form.querySelector('#selectExternalAddressFilterMode').value; + config.PublicPort = form.querySelector('#txtPublicPort').value; + config.PublicHttpsPort = form.querySelector('#txtPublicHttpsPort').value; + var httpsMode = form.querySelector('#selectHttpsMode').value; switch (httpsMode) { - case "proxy": + case 'proxy': config.EnableHttps = true; config.RequireHttps = false; config.IsBehindProxy = true; break; - case "required": + case 'required': config.EnableHttps = true; config.RequireHttps = true; config.IsBehindProxy = false; break; - case "enabled": + case 'enabled': config.EnableHttps = true; config.RequireHttps = false; config.IsBehindProxy = false; @@ -56,13 +56,13 @@ define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"], config.IsBehindProxy = false; } - config.HttpsPortNumber = form.querySelector("#txtHttpsPort").value; - config.HttpServerPortNumber = form.querySelector("#txtPortNumber").value; + config.HttpsPortNumber = form.querySelector('#txtHttpsPort').value; + config.HttpServerPortNumber = form.querySelector('#txtPortNumber').value; config.EnableUPnP = enableUpnp; - config.BaseUrl = form.querySelector("#txtBaseUrl").value; - config.EnableRemoteAccess = form.querySelector("#chkRemoteAccess").checked; - config.CertificatePath = form.querySelector("#txtCertificatePath").value || null; - config.CertificatePassword = form.querySelector("#txtCertPassword").value || null; + config.BaseUrl = form.querySelector('#txtBaseUrl').value; + config.EnableRemoteAccess = form.querySelector('#chkRemoteAccess').checked; + config.CertificatePath = form.querySelector('#txtCertificatePath').value || null; + config.CertificatePassword = form.querySelector('#txtCertPassword').value || null; config.LocalNetworkAddresses = localAddress ? [localAddress] : []; ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult, Dashboard.processErrorResponse); }); @@ -72,43 +72,43 @@ define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"], } function triggerChange(select) { - var evt = document.createEvent("HTMLEvents"); - evt.initEvent("change", false, true); + var evt = document.createEvent('HTMLEvents'); + evt.initEvent('change', false, true); select.dispatchEvent(evt); } function getValidationAlert(form) { - if (form.querySelector("#txtPublicPort").value === form.querySelector("#txtPublicHttpsPort").value) { - return "The public http and https ports must be different."; + if (form.querySelector('#txtPublicPort').value === form.querySelector('#txtPublicHttpsPort').value) { + return 'The public http and https ports must be different.'; } - if (form.querySelector("#txtPortNumber").value === form.querySelector("#txtHttpsPort").value) { - return "The http and https ports must be different."; + if (form.querySelector('#txtPortNumber').value === form.querySelector('#txtHttpsPort').value) { + return 'The http and https ports must be different.'; } return null; } function validateHttps(form) { - var remoteAccess = form.querySelector("#chkRemoteAccess").checked; - var certPath = form.querySelector("#txtCertificatePath").value || null; - var httpsMode = form.querySelector("#selectHttpsMode").value; + var remoteAccess = form.querySelector('#chkRemoteAccess').checked; + var certPath = form.querySelector('#txtCertificatePath').value || null; + var httpsMode = form.querySelector('#selectHttpsMode').value; - if (!remoteAccess || ("enabled" !== httpsMode && "required" !== httpsMode || certPath)) { + if (!remoteAccess || ('enabled' !== httpsMode && 'required' !== httpsMode || certPath)) { return Promise.resolve(); } return new Promise(function (resolve, reject) { return alertText({ - title: globalize.translate("TitleHostingSettings"), - text: globalize.translate("HttpsRequiresCert") + title: globalize.translate('TitleHostingSettings'), + text: globalize.translate('HttpsRequiresCert') }).then(reject, reject); }); } function alertText(options) { return new Promise(function (resolve, reject) { - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert(options).then(resolve, reject); }); }); @@ -117,8 +117,8 @@ define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"], function confirmSelections(localAddress, enableUpnp, callback) { if (localAddress || !enableUpnp) { alertText({ - title: globalize.translate("TitleHostingSettings"), - text: globalize.translate("SettingsWarning") + title: globalize.translate('TitleHostingSettings'), + text: globalize.translate('SettingsWarning') }).then(callback); } else { callback(); @@ -127,76 +127,76 @@ define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"], return function (view, params) { function loadPage(page, config) { - page.querySelector("#txtPortNumber").value = config.HttpServerPortNumber; - page.querySelector("#txtPublicPort").value = config.PublicPort; - page.querySelector("#txtPublicHttpsPort").value = config.PublicHttpsPort; - page.querySelector("#txtLocalAddress").value = config.LocalNetworkAddresses[0] || ""; - page.querySelector("#txtLanNetworks").value = (config.LocalNetworkSubnets || []).join(", "); - page.querySelector("#txtExternalAddressFilter").value = (config.RemoteIPFilter || []).join(", "); - page.querySelector("#selectExternalAddressFilterMode").value = config.IsRemoteIPFilterBlacklist ? "blacklist" : "whitelist"; - page.querySelector("#chkRemoteAccess").checked = null == config.EnableRemoteAccess || config.EnableRemoteAccess; - var selectHttpsMode = page.querySelector("#selectHttpsMode"); + page.querySelector('#txtPortNumber').value = config.HttpServerPortNumber; + page.querySelector('#txtPublicPort').value = config.PublicPort; + page.querySelector('#txtPublicHttpsPort').value = config.PublicHttpsPort; + page.querySelector('#txtLocalAddress').value = config.LocalNetworkAddresses[0] || ''; + page.querySelector('#txtLanNetworks').value = (config.LocalNetworkSubnets || []).join(', '); + page.querySelector('#txtExternalAddressFilter').value = (config.RemoteIPFilter || []).join(', '); + page.querySelector('#selectExternalAddressFilterMode').value = config.IsRemoteIPFilterBlacklist ? 'blacklist' : 'whitelist'; + page.querySelector('#chkRemoteAccess').checked = null == config.EnableRemoteAccess || config.EnableRemoteAccess; + var selectHttpsMode = page.querySelector('#selectHttpsMode'); if (config.IsBehindProxy) { - selectHttpsMode.value = "proxy"; + selectHttpsMode.value = 'proxy'; } else if (config.RequireHttps) { - selectHttpsMode.value = "required"; + selectHttpsMode.value = 'required'; } else if (config.EnableHttps) { - selectHttpsMode.value = "enabled"; + selectHttpsMode.value = 'enabled'; } else { - selectHttpsMode.value = "disabled"; + selectHttpsMode.value = 'disabled'; } - page.querySelector("#txtHttpsPort").value = config.HttpsPortNumber; - page.querySelector("#txtBaseUrl").value = config.BaseUrl || ""; - var txtCertificatePath = page.querySelector("#txtCertificatePath"); - txtCertificatePath.value = config.CertificatePath || ""; - page.querySelector("#txtCertPassword").value = config.CertificatePassword || ""; - page.querySelector("#chkEnableUpnp").checked = config.EnableUPnP; - triggerChange(page.querySelector("#chkRemoteAccess")); + page.querySelector('#txtHttpsPort').value = config.HttpsPortNumber; + page.querySelector('#txtBaseUrl').value = config.BaseUrl || ''; + var txtCertificatePath = page.querySelector('#txtCertificatePath'); + txtCertificatePath.value = config.CertificatePath || ''; + page.querySelector('#txtCertPassword').value = config.CertificatePassword || ''; + page.querySelector('#chkEnableUpnp').checked = config.EnableUPnP; + triggerChange(page.querySelector('#chkRemoteAccess')); loading.hide(); } - view.querySelector("#chkRemoteAccess").addEventListener("change", function () { + view.querySelector('#chkRemoteAccess').addEventListener('change', function () { if (this.checked) { - view.querySelector(".fldExternalAddressFilter").classList.remove("hide"); - view.querySelector(".fldExternalAddressFilterMode").classList.remove("hide"); - view.querySelector(".fldPublicPort").classList.remove("hide"); - view.querySelector(".fldPublicHttpsPort").classList.remove("hide"); - view.querySelector(".fldCertificatePath").classList.remove("hide"); - view.querySelector(".fldCertPassword").classList.remove("hide"); - view.querySelector(".fldHttpsMode").classList.remove("hide"); - view.querySelector(".fldEnableUpnp").classList.remove("hide"); + view.querySelector('.fldExternalAddressFilter').classList.remove('hide'); + view.querySelector('.fldExternalAddressFilterMode').classList.remove('hide'); + view.querySelector('.fldPublicPort').classList.remove('hide'); + view.querySelector('.fldPublicHttpsPort').classList.remove('hide'); + view.querySelector('.fldCertificatePath').classList.remove('hide'); + view.querySelector('.fldCertPassword').classList.remove('hide'); + view.querySelector('.fldHttpsMode').classList.remove('hide'); + view.querySelector('.fldEnableUpnp').classList.remove('hide'); } else { - view.querySelector(".fldExternalAddressFilter").classList.add("hide"); - view.querySelector(".fldExternalAddressFilterMode").classList.add("hide"); - view.querySelector(".fldPublicPort").classList.add("hide"); - view.querySelector(".fldPublicHttpsPort").classList.add("hide"); - view.querySelector(".fldCertificatePath").classList.add("hide"); - view.querySelector(".fldCertPassword").classList.add("hide"); - view.querySelector(".fldHttpsMode").classList.add("hide"); - view.querySelector(".fldEnableUpnp").classList.add("hide"); + view.querySelector('.fldExternalAddressFilter').classList.add('hide'); + view.querySelector('.fldExternalAddressFilterMode').classList.add('hide'); + view.querySelector('.fldPublicPort').classList.add('hide'); + view.querySelector('.fldPublicHttpsPort').classList.add('hide'); + view.querySelector('.fldCertificatePath').classList.add('hide'); + view.querySelector('.fldCertPassword').classList.add('hide'); + view.querySelector('.fldHttpsMode').classList.add('hide'); + view.querySelector('.fldEnableUpnp').classList.add('hide'); } }); - view.querySelector("#btnSelectCertPath").addEventListener("click", function () { - require(["directorybrowser"], function (directoryBrowser) { + view.querySelector('#btnSelectCertPath').addEventListener('click', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ includeFiles: true, includeDirectories: true, callback: function (path) { if (path) { - view.querySelector("#txtCertificatePath").value = path; + view.querySelector('#txtCertificatePath').value = path; } picker.close(); }, - header: globalize.translate("HeaderSelectCertificatePath") + header: globalize.translate('HeaderSelectCertificatePath') }); }); }); - view.querySelector(".dashboardHostingForm").addEventListener("submit", onSubmit); - view.addEventListener("viewshow", function (e) { + view.querySelector('.dashboardHostingForm').addEventListener('submit', onSubmit); + view.addEventListener('viewshow', function (e) { loading.show(); ApiClient.getServerConfiguration().then(function (config) { loadPage(view, config); diff --git a/src/controllers/dashboard/notifications/notification.js b/src/controllers/dashboard/notifications/notification.js index 70e6adaf6..90d453cda 100644 --- a/src/controllers/dashboard/notifications/notification.js +++ b/src/controllers/dashboard/notifications/notification.js @@ -1,23 +1,23 @@ -define(["jQuery", "emby-checkbox", "fnchecked"], function ($) { - "use strict"; +define(['jQuery', 'emby-checkbox', 'fnchecked'], function ($) { + 'use strict'; function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) { var html = '
'; html += items.map(function (u) { var isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1; - var checkedHtml = isChecked ? ' checked="checked"' : ""; - return '"; - }).join(""); - html += "
"; - elem.html(html).trigger("create"); + var checkedHtml = isChecked ? ' checked="checked"' : ''; + return ''; + }).join(''); + html += ''; + elem.html(html).trigger('create'); } function reload(page) { - var type = getParameterByName("type"); + var type = getParameterByName('type'); var promise1 = ApiClient.getUsers(); var promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey); - var promise3 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")); - var promise4 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Services")); + var promise3 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')); + var promise4 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Services')); Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) { var users = responses[0]; var notificationOptions = responses[1]; @@ -31,34 +31,34 @@ define(["jQuery", "emby-checkbox", "fnchecked"], function ($) { })[0] || {}; if (typeInfo.IsBasedOnUserEvent) { - $(".monitorUsers", page).show(); + $('.monitorUsers', page).show(); } else { - $(".monitorUsers", page).hide(); + $('.monitorUsers', page).hide(); } - $(".notificationType", page).html(typeInfo.Name || "Unknown Notification"); + $('.notificationType', page).html(typeInfo.Name || 'Unknown Notification'); if (!notificationConfig) { notificationConfig = { DisabledMonitorUsers: [], SendToUsers: [], DisabledServices: [], - SendToUserMode: "Admins" + SendToUserMode: 'Admins' }; } - fillItems($(".monitorUsersList", page), users, "chkMonitor", "chkMonitor", notificationConfig.DisabledMonitorUsers); - fillItems($(".sendToUsersList", page), users, "chkSendTo", "chkSendTo", notificationConfig.SendToUsers, true); - fillItems($(".servicesList", page), services, "chkService", "chkService", notificationConfig.DisabledServices); - $("#chkEnabled", page).checked(notificationConfig.Enabled || false); - $("#selectUsers", page).val(notificationConfig.SendToUserMode).trigger("change"); + fillItems($('.monitorUsersList', page), users, 'chkMonitor', 'chkMonitor', notificationConfig.DisabledMonitorUsers); + fillItems($('.sendToUsersList', page), users, 'chkSendTo', 'chkSendTo', notificationConfig.SendToUsers, true); + fillItems($('.servicesList', page), services, 'chkService', 'chkService', notificationConfig.DisabledServices); + $('#chkEnabled', page).checked(notificationConfig.Enabled || false); + $('#selectUsers', page).val(notificationConfig.SendToUserMode).trigger('change'); }); } function save(page) { - var type = getParameterByName("type"); + var type = getParameterByName('type'); var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey); - var promise2 = ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")); + var promise2 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')); Promise.all([promise1, promise2]).then(function (responses) { var notificationOptions = responses[0]; var types = responses[1]; @@ -76,47 +76,47 @@ define(["jQuery", "emby-checkbox", "fnchecked"], function ($) { types.filter(function (n) { return n.Type == type; })[0]; - notificationConfig.Enabled = $("#chkEnabled", page).checked(); - notificationConfig.SendToUserMode = $("#selectUsers", page).val(); - notificationConfig.DisabledMonitorUsers = $(".chkMonitor", page).get().filter(function (c) { + notificationConfig.Enabled = $('#chkEnabled', page).checked(); + notificationConfig.SendToUserMode = $('#selectUsers', page).val(); + notificationConfig.DisabledMonitorUsers = $('.chkMonitor', page).get().filter(function (c) { return !c.checked; }).map(function (c) { - return c.getAttribute("data-itemid"); + return c.getAttribute('data-itemid'); }); - notificationConfig.SendToUsers = $(".chkSendTo", page).get().filter(function (c) { + notificationConfig.SendToUsers = $('.chkSendTo', page).get().filter(function (c) { return c.checked; }).map(function (c) { - return c.getAttribute("data-itemid"); + return c.getAttribute('data-itemid'); }); - notificationConfig.DisabledServices = $(".chkService", page).get().filter(function (c) { + notificationConfig.DisabledServices = $('.chkService', page).get().filter(function (c) { return !c.checked; }).map(function (c) { - return c.getAttribute("data-itemid"); + return c.getAttribute('data-itemid'); }); ApiClient.updateNamedConfiguration(notificationsConfigurationKey, notificationOptions).then(function (r) { Dashboard.processServerConfigurationUpdateResult(); - Dashboard.navigate("notificationsettings.html"); + Dashboard.navigate('notificationsettings.html'); }); }); } function onSubmit() { - save($(this).parents(".page")); + save($(this).parents('.page')); return false; } - var notificationsConfigurationKey = "notifications"; - $(document).on("pageinit", "#notificationSettingPage", function () { + var notificationsConfigurationKey = 'notifications'; + $(document).on('pageinit', '#notificationSettingPage', function () { var page = this; - $("#selectUsers", page).on("change", function () { - if ("Custom" == this.value) { - $(".selectCustomUsers", page).show(); + $('#selectUsers', page).on('change', function () { + if ('Custom' == this.value) { + $('.selectCustomUsers', page).show(); } else { - $(".selectCustomUsers", page).hide(); + $('.selectCustomUsers', page).hide(); } }); - $(".notificationSettingForm").off("submit", onSubmit).on("submit", onSubmit); - }).on("pageshow", "#notificationSettingPage", function () { + $('.notificationSettingForm').off('submit', onSubmit).on('submit', onSubmit); + }).on('pageshow', '#notificationSettingPage', function () { reload(this); }); }); diff --git a/src/controllers/dashboard/notifications/notifications.js b/src/controllers/dashboard/notifications/notifications.js index 3c0b5e9b3..4e049bc10 100644 --- a/src/controllers/dashboard/notifications/notifications.js +++ b/src/controllers/dashboard/notifications/notifications.js @@ -1,59 +1,59 @@ -define(["loading", "libraryMenu", "globalize", "listViewStyle", "emby-button"], function(loading, libraryMenu, globalize) { - "use strict"; +define(['loading', 'libraryMenu', 'globalize', 'listViewStyle', 'emby-button'], function(loading, libraryMenu, globalize) { + 'use strict'; function reload(page) { loading.show(); - ApiClient.getJSON(ApiClient.getUrl("Notifications/Types")).then(function(list) { - var html = ""; - var lastCategory = ""; + ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')).then(function(list) { + var html = ''; + var lastCategory = ''; var showHelp = true; html += list.map(function(notification) { - var itemHtml = ""; + var itemHtml = ''; if (notification.Category !== lastCategory) { lastCategory = notification.Category; if (lastCategory) { - itemHtml += ""; - itemHtml += ""; + itemHtml += ''; + itemHtml += ''; } itemHtml += '
'; itemHtml += '
'; itemHtml += '

'; itemHtml += notification.Category; - itemHtml += "

"; + itemHtml += ''; if (showHelp) { showHelp = false; itemHtml += ''; - itemHtml += globalize.translate("Help"); - itemHtml += ""; + itemHtml += globalize.translate('Help'); + itemHtml += ''; } - itemHtml += "
"; + itemHtml += '
'; itemHtml += ''; + itemHtml += ''; + itemHtml += ''; return itemHtml; - }).join(""); + }).join(''); if (list.length) { - html += ""; - html += ""; + html += ''; + html += ''; } - page.querySelector(".notificationList").innerHTML = html; + page.querySelector('.notificationList').innerHTML = html; loading.hide(); }); } return function(view, params) { - view.addEventListener("viewshow", function() { + view.addEventListener('viewshow', function() { reload(view); }); }; diff --git a/src/controllers/dashboard/playbackconfiguration.js b/src/controllers/dashboard/playbackconfiguration.js index a4ba6bb62..d5b67a296 100644 --- a/src/controllers/dashboard/playbackconfiguration.js +++ b/src/controllers/dashboard/playbackconfiguration.js @@ -1,10 +1,10 @@ -define(["jQuery", "loading", "libraryMenu", "globalize"], function ($, loading, libraryMenu, globalize) { - "use strict"; +define(['jQuery', 'loading', 'libraryMenu', 'globalize'], function ($, loading, libraryMenu, globalize) { + 'use strict'; function loadPage(page, config) { - $("#txtMinResumePct", page).val(config.MinResumePct); - $("#txtMaxResumePct", page).val(config.MaxResumePct); - $("#txtMinResumeDuration", page).val(config.MinResumeDurationSeconds); + $('#txtMinResumePct', page).val(config.MinResumePct); + $('#txtMaxResumePct', page).val(config.MaxResumePct); + $('#txtMinResumeDuration', page).val(config.MinResumeDurationSeconds); loading.hide(); } @@ -24,22 +24,22 @@ define(["jQuery", "loading", "libraryMenu", "globalize"], function ($, loading, function getTabs() { return [{ - href: "encodingsettings.html", - name: globalize.translate("Transcoding") + href: 'encodingsettings.html', + name: globalize.translate('Transcoding') }, { - href: "playbackconfiguration.html", - name: globalize.translate("TabResumeSettings") + href: 'playbackconfiguration.html', + name: globalize.translate('TabResumeSettings') }, { - href: "streamingsettings.html", - name: globalize.translate("TabStreaming") + href: 'streamingsettings.html', + name: globalize.translate('TabStreaming') }]; } - $(document).on("pageinit", "#playbackConfigurationPage", function () { - $(".playbackConfigurationForm").off("submit", onSubmit).on("submit", onSubmit); - }).on("pageshow", "#playbackConfigurationPage", function () { + $(document).on('pageinit', '#playbackConfigurationPage', function () { + $('.playbackConfigurationForm').off('submit', onSubmit).on('submit', onSubmit); + }).on('pageshow', '#playbackConfigurationPage', function () { loading.show(); - libraryMenu.setTabs("playback", 1, getTabs); + libraryMenu.setTabs('playback', 1, getTabs); var page = this; ApiClient.getServerConfiguration().then(function (config) { loadPage(page, config); diff --git a/src/controllers/dashboard/plugins/add.js b/src/controllers/dashboard/plugins/add.js index 3b2bf9e76..1ceee102e 100644 --- a/src/controllers/dashboard/plugins/add.js +++ b/src/controllers/dashboard/plugins/add.js @@ -1,31 +1,31 @@ -define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "emby-button"], function ($, loading, libraryMenu, globalize, connectionManager) { - "use strict"; +define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'connectionManager', 'emby-button'], function ($, loading, libraryMenu, globalize, connectionManager) { + 'use strict'; function populateHistory(packageInfo, page) { - var html = ""; + var html = ''; var length = Math.min(packageInfo.versions.length, 10); for (var i = 0; i < length; i++) { var version = packageInfo.versions[i]; - html += '

' + version.version + "

"; - html += '
' + version.changelog + "
"; + html += '

' + version.version + '

'; + html += '
' + version.changelog + '
'; } - $("#revisionHistory", page).html(html); + $('#revisionHistory', page).html(html); } function populateVersions(packageInfo, page, installedPlugin) { - var html = ""; + var html = ''; for (var i = 0; i < packageInfo.versions.length; i++) { var version = packageInfo.versions[i]; - html += '"; + html += ''; } - var selectmenu = $("#selectVersion", page).html(html); + var selectmenu = $('#selectVersion', page).html(html); if (!installedPlugin) { - $("#pCurrentVersion", page).hide().html(""); + $('#pCurrentVersion', page).hide().html(''); } var packageVersion = packageInfo.versions[0]; @@ -42,56 +42,56 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e populateVersions(pkg, page, installedPlugin); populateHistory(pkg, page); - $(".pluginName", page).html(pkg.name); - $("#btnInstallDiv", page).removeClass("hide"); - $("#pSelectVersion", page).removeClass("hide"); + $('.pluginName', page).html(pkg.name); + $('#btnInstallDiv', page).removeClass('hide'); + $('#pSelectVersion', page).removeClass('hide'); if (pkg.overview) { - $("#overview", page).show().html(pkg.overview); + $('#overview', page).show().html(pkg.overview); } else { - $("#overview", page).hide(); + $('#overview', page).hide(); } - $("#description", page).html(pkg.description); - $("#developer", page).html(pkg.owner); + $('#description', page).html(pkg.description); + $('#developer', page).html(pkg.owner); if (installedPlugin) { - var currentVersionText = globalize.translate("MessageYouHaveVersionInstalled", "" + installedPlugin.Version + ""); - $("#pCurrentVersion", page).show().html(currentVersionText); + var currentVersionText = globalize.translate('MessageYouHaveVersionInstalled', '' + installedPlugin.Version + ''); + $('#pCurrentVersion', page).show().html(currentVersionText); } else { - $("#pCurrentVersion", page).hide().html(""); + $('#pCurrentVersion', page).hide().html(''); } loading.hide(); } function alertText(options) { - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert(options); }); } function performInstallation(page, packageName, guid, updateClass, version) { - var developer = $("#developer", page).html().toLowerCase(); + var developer = $('#developer', page).html().toLowerCase(); var alertCallback = function () { loading.show(); - page.querySelector("#btnInstall").disabled = true; + page.querySelector('#btnInstall').disabled = true; ApiClient.installPlugin(packageName, guid, updateClass, version).then(function () { loading.hide(); - alertText(globalize.translate("PluginInstalledMessage")); + alertText(globalize.translate('PluginInstalledMessage')); }); }; if (developer !== 'jellyfin') { loading.hide(); - var msg = globalize.translate("MessagePluginInstallDisclaimer"); - msg += "
"; - msg += "
"; - msg += globalize.translate("PleaseConfirmPluginInstallation"); + var msg = globalize.translate('MessagePluginInstallDisclaimer'); + msg += '
'; + msg += '
'; + msg += globalize.translate('PleaseConfirmPluginInstallation'); - require(["confirm"], function (confirm) { - confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function () { + require(['confirm'], function (confirm) { + confirm(msg, globalize.translate('HeaderConfirmPluginInstallation')).then(function () { alertCallback(); }, function () { console.debug('plugin not installed'); @@ -103,24 +103,24 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e } return function (view, params) { - $(".addPluginForm", view).on("submit", function () { + $('.addPluginForm', view).on('submit', function () { loading.show(); - var page = $(this).parents("#addPluginPage")[0]; + var page = $(this).parents('#addPluginPage')[0]; var name = params.name; var guid = params.guid; ApiClient.getInstalledPlugins().then(function (plugins) { var installedPlugin = plugins.filter(function (plugin) { return plugin.Name == name; })[0]; - var vals = $("#selectVersion", page).val().split("|"); + var vals = $('#selectVersion', page).val().split('|'); var version = vals[0]; if (installedPlugin) { if (installedPlugin.Version === version) { loading.hide(); Dashboard.alert({ - message: globalize.translate("MessageAlreadyInstalled"), - title: globalize.translate("HeaderPluginInstallation") + message: globalize.translate('MessageAlreadyInstalled'), + title: globalize.translate('HeaderPluginInstallation') }); } } else { @@ -129,7 +129,7 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e }); return false; }); - view.addEventListener("viewshow", function () { + view.addEventListener('viewshow', function () { var page = this; loading.show(); var name = params.name; diff --git a/src/controllers/dashboard/plugins/available.js b/src/controllers/dashboard/plugins/available.js index aff9b89ed..82fea00b5 100644 --- a/src/controllers/dashboard/plugins/available.js +++ b/src/controllers/dashboard/plugins/available.js @@ -1,5 +1,5 @@ -define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby-checkbox", "emby-select"], function (loading, libraryMenu, globalize) { - "use strict"; +define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby-checkbox', 'emby-select'], function (loading, libraryMenu, globalize) { + 'use strict'; function reloadList(page) { loading.show(); @@ -7,8 +7,8 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby var promise2 = ApiClient.getInstalledPlugins(); Promise.all([promise1, promise2]).then(function (responses) { populateList({ - catalogElement: page.querySelector("#pluginTiles"), - noItemsElement: page.querySelector("#noPlugins"), + catalogElement: page.querySelector('#pluginTiles'), + noItemsElement: page.querySelector('#noPlugins'), availablePlugins: responses[0], installedPlugins: responses[1] }); @@ -16,15 +16,15 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby } function getHeaderText(category) { - category = category.replace(" ", ""); - if ("Channel" === category) { - category = "Channels"; - } else if ("Theme" === category) { - category = "Themes"; - } else if ("LiveTV" === category) { - category = "HeaderLiveTV"; - } else if ("ScreenSaver" === category) { - category = "HeaderScreenSavers"; + category = category.replace(' ', ''); + if ('Channel' === category) { + category = 'Channels'; + } else if ('Theme' === category) { + category = 'Themes'; + } else if ('LiveTV' === category) { + category = 'HeaderLiveTV'; + } else if ('ScreenSaver' === category) { + category = 'HeaderScreenSavers'; } return globalize.translate(category); @@ -56,28 +56,28 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby }); var currentCategory = null; - var html = ""; + var html = ''; for (var i = 0; i < availablePlugins.length; i++) { var plugin = availablePlugins[i]; var category = plugin.categoryDisplayName; if (category != currentCategory) { if (currentCategory) { - html += ""; - html += ""; + html += ''; + html += ''; } html += '
'; - html += '

' + category + "

"; + html += '

' + category + '

'; html += '
'; currentCategory = category; } html += getPluginHtml(plugin, options, installedPlugins); } - html += "
"; - html += "
"; + html += ''; + html += ''; if (!availablePlugins.length && options.noItemsElement) { - options.noItemsElement.classList.remove("hide"); + options.noItemsElement.classList.remove('hide'); } options.catalogElement.innerHTML = html; @@ -85,44 +85,44 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby } function getPluginHtml(plugin, options, installedPlugins) { - var html = ""; - var href = plugin.externalUrl ? plugin.externalUrl : "addplugin.html?name=" + encodeURIComponent(plugin.name) + "&guid=" + plugin.guid; + var html = ''; + var href = plugin.externalUrl ? plugin.externalUrl : 'addplugin.html?name=' + encodeURIComponent(plugin.name) + '&guid=' + plugin.guid; if (options.context) { - href += "&context=" + options.context; + href += '&context=' + options.context; } - var target = plugin.externalUrl ? ' target="_blank"' : ""; + var target = plugin.externalUrl ? ' target="_blank"' : ''; html += "
"; html += '
'; html += '
'; html += '
'; - html += '"; - html += 'folder'; - html += ""; - html += "
"; + html += ''; + html += ''; + html += ''; + html += '
'; html += '
'; html += "
"; html += plugin.name; - html += "
"; + html += '
'; var installedPlugin = installedPlugins.filter(function (ip) { return ip.Id == plugin.guid; })[0]; html += "
"; - html += installedPlugin ? globalize.translate("LabelVersionInstalled", installedPlugin.Version) : " "; - html += "
"; - html += "
"; - html += ""; - return html += ""; + html += installedPlugin ? globalize.translate('LabelVersionInstalled', installedPlugin.Version) : ' '; + html += ''; + html += ''; + html += ''; + return html += ''; } function getTabs() { return [{ - href: "installedplugins.html", - name: globalize.translate("TabMyPlugins") + href: 'installedplugins.html', + name: globalize.translate('TabMyPlugins') }, { - href: "availableplugins.html", - name: globalize.translate("TabCatalog") + href: 'availableplugins.html', + name: globalize.translate('TabCatalog') }]; } @@ -131,8 +131,8 @@ define(["loading", "libraryMenu", "globalize", "cardStyle", "emby-button", "emby }; return function (view, params) { - view.addEventListener("viewshow", function () { - libraryMenu.setTabs("plugins", 1, getTabs); + view.addEventListener('viewshow', function () { + libraryMenu.setTabs('plugins', 1, getTabs); reloadList(this); }); }; diff --git a/src/controllers/dashboard/plugins/installed.js b/src/controllers/dashboard/plugins/installed.js index 826996516..5ca739f71 100644 --- a/src/controllers/dashboard/plugins/installed.js +++ b/src/controllers/dashboard/plugins/installed.js @@ -1,15 +1,15 @@ -define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button"], function (loading, libraryMenu, dom, globalize) { - "use strict"; +define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'], function (loading, libraryMenu, dom, globalize) { + 'use strict'; function deletePlugin(page, uniqueid, name) { - var msg = globalize.translate("UninstallPluginConfirmation", name); + var msg = globalize.translate('UninstallPluginConfirmation', name); - require(["confirm"], function (confirm) { + require(['confirm'], function (confirm) { confirm({ - title: globalize.translate("UninstallPluginHeader"), + title: globalize.translate('UninstallPluginHeader'), text: msg, - primary: "delete", - confirmText: globalize.translate("UninstallPluginHeader") + primary: 'delete', + confirmText: globalize.translate('UninstallPluginHeader') }).then(function () { loading.show(); ApiClient.uninstallPlugin(uniqueid).then(function () { @@ -21,13 +21,13 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" function showNoConfigurationMessage() { Dashboard.alert({ - message: globalize.translate("NoPluginConfigurationMessage") + message: globalize.translate('NoPluginConfigurationMessage') }); } function showConnectMessage() { Dashboard.alert({ - message: globalize.translate("MessagePluginConfigurationRequiresLocalAccess") + message: globalize.translate('MessagePluginConfigurationRequiresLocalAccess') }); } @@ -36,33 +36,33 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" return pluginConfigurationPage.PluginId == plugin.Id; })[0]; var configPageUrl = configPage ? Dashboard.getConfigurationPageUrl(configPage.Name) : null; - var html = ""; + var html = ''; html += "
"; html += '
'; html += '
'; html += '
'; html += configPageUrl ? '' : '"; - html += "
"; + html += ''; + html += configPageUrl ? '' : '
'; + html += '
'; html += '
'; html += '
'; - html += ''; - html += "
"; + html += ''; + html += '
'; html += "
"; html += configPage.DisplayName || plugin.Name; - html += "
"; + html += ''; html += "
"; html += plugin.Version; - html += "
"; - html += ""; - html += ""; - html += ""; + html += ''; + html += ''; + html += ''; + html += ''; return html; } function renderPlugins(page, plugins) { - ApiClient.getJSON(ApiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration").then(function (configPages) { + ApiClient.getJSON(ApiClient.getUrl('web/configurationpages') + '?pageType=PluginConfiguration').then(function (configPages) { populateList(page, plugins, configPages); }); } @@ -78,22 +78,22 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" var html = plugins.map(function (p) { return getPluginCardHtml(p, pluginConfigurationPages); - }).join(""); + }).join(''); - var installedPluginsElement = page.querySelector(".installedPlugins"); - installedPluginsElement.removeEventListener("click", onInstalledPluginsClick); - installedPluginsElement.addEventListener("click", onInstalledPluginsClick); + var installedPluginsElement = page.querySelector('.installedPlugins'); + installedPluginsElement.removeEventListener('click', onInstalledPluginsClick); + installedPluginsElement.addEventListener('click', onInstalledPluginsClick); if (plugins.length) { - installedPluginsElement.classList.add("itemsContainer"); - installedPluginsElement.classList.add("vertical-wrap"); + installedPluginsElement.classList.add('itemsContainer'); + installedPluginsElement.classList.add('vertical-wrap'); } else { html += '
'; - html += "

" + globalize.translate("MessageNoPluginsInstalled") + "

"; + html += '

' + globalize.translate('MessageNoPluginsInstalled') + '

'; html += '

'; - html += globalize.translate("BrowsePluginCatalogMessage"); - html += "

"; - html += "
"; + html += globalize.translate('BrowsePluginCatalogMessage'); + html += '

'; + html += ''; } installedPluginsElement.innerHTML = html; @@ -101,36 +101,36 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" } function showPluginMenu(page, elem) { - var card = dom.parentWithClass(elem, "card"); - var id = card.getAttribute("data-id"); - var name = card.getAttribute("data-name"); - var configHref = card.querySelector(".cardContent").getAttribute("href"); + var card = dom.parentWithClass(elem, 'card'); + var id = card.getAttribute('data-id'); + var name = card.getAttribute('data-name'); + var configHref = card.querySelector('.cardContent').getAttribute('href'); var menuItems = []; if (configHref) { menuItems.push({ - name: globalize.translate("ButtonSettings"), - id: "open", - icon: "mode_edit" + name: globalize.translate('ButtonSettings'), + id: 'open', + icon: 'mode_edit' }); } menuItems.push({ - name: globalize.translate("ButtonUninstall"), - id: "delete", - icon: "delete" + name: globalize.translate('ButtonUninstall'), + id: 'delete', + icon: 'delete' }); - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: menuItems, positionTo: elem, callback: function (resultId) { switch (resultId) { - case "open": + case 'open': Dashboard.navigate(configHref); break; - case "delete": + case 'delete': deletePlugin(page, id, name); break; } @@ -148,29 +148,29 @@ define(["loading", "libraryMenu", "dom", "globalize", "cardStyle", "emby-button" function getTabs() { return [{ - href: "installedplugins.html", - name: globalize.translate("TabMyPlugins") + href: 'installedplugins.html', + name: globalize.translate('TabMyPlugins') }, { - href: "availableplugins.html", - name: globalize.translate("TabCatalog") + href: 'availableplugins.html', + name: globalize.translate('TabCatalog') }]; } function onInstalledPluginsClick(e) { - if (dom.parentWithClass(e.target, "noConfigPluginCard")) { + if (dom.parentWithClass(e.target, 'noConfigPluginCard')) { showNoConfigurationMessage(); - } else if (dom.parentWithClass(e.target, "connectModePluginCard")) { + } else if (dom.parentWithClass(e.target, 'connectModePluginCard')) { showConnectMessage(); } else { - var btnCardMenu = dom.parentWithClass(e.target, "btnCardMenu"); + var btnCardMenu = dom.parentWithClass(e.target, 'btnCardMenu'); if (btnCardMenu) { - showPluginMenu(dom.parentWithClass(btnCardMenu, "page"), btnCardMenu); + showPluginMenu(dom.parentWithClass(btnCardMenu, 'page'), btnCardMenu); } } } - pageIdOn("pageshow", "pluginsPage", function () { - libraryMenu.setTabs("plugins", 0, getTabs); + pageIdOn('pageshow', 'pluginsPage', function () { + libraryMenu.setTabs('plugins', 0, getTabs); reloadList(this); }); diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtask.js b/src/controllers/dashboard/scheduledtasks/scheduledtask.js index 8a3cdf5d6..52050d1f8 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtask.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtask.js @@ -1,5 +1,5 @@ -define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby-button", "emby-select"], function ($, loading, datetime, dom, globalize) { - "use strict"; +define(['jQuery', 'loading', 'datetime', 'dom', 'globalize', 'emby-input', 'emby-button', 'emby-select'], function ($, loading, datetime, dom, globalize) { + 'use strict'; function fillTimeOfDay(select) { @@ -14,7 +14,7 @@ define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby select.innerHTML = options.map(function (o) { return ''; - }).join(""); + }).join(''); } Array.prototype.remove = function (from, to) { @@ -26,92 +26,92 @@ define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby var ScheduledTaskPage = { refreshScheduledTask: function (view) { loading.show(); - var id = getParameterByName("id"); + var id = getParameterByName('id'); ApiClient.getScheduledTask(id).then(function (task) { ScheduledTaskPage.loadScheduledTask(view, task); }); }, loadScheduledTask: function (view, task) { - $(".taskName", view).html(task.Name); - $("#pTaskDescription", view).html(task.Description); + $('.taskName', view).html(task.Name); + $('#pTaskDescription', view).html(task.Description); - require(["listViewStyle"], function () { + require(['listViewStyle'], function () { ScheduledTaskPage.loadTaskTriggers(view, task); }); loading.hide(); }, loadTaskTriggers: function (context, task) { - var html = ""; + var html = ''; html += '
'; for (var i = 0, length = task.Triggers.length; i < length; i++) { var trigger = task.Triggers[i]; html += '
'; - html += 'schedule'; + html += ''; if (trigger.MaxRuntimeMs) { html += '
'; } else { html += '
'; } - html += "
" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + "
"; + html += "
" + ScheduledTaskPage.getTriggerFriendlyName(trigger) + '
'; if (trigger.MaxRuntimeMs) { html += '
'; var hours = trigger.MaxRuntimeTicks / 36e9; if (hours == 1) { - html += globalize.translate("ValueTimeLimitSingleHour"); + html += globalize.translate('ValueTimeLimitSingleHour'); } else { - html += globalize.translate("ValueTimeLimitMultiHour", hours); + html += globalize.translate('ValueTimeLimitMultiHour', hours); } - html += "
"; + html += '
'; } - html += "
"; - html += ''; - html += "
"; + html += '
'; + html += ''; + html += ''; } - html += ""; - context.querySelector(".taskTriggers").innerHTML = html; + html += ''; + context.querySelector('.taskTriggers').innerHTML = html; }, // TODO: Replace this mess with date-fns and remove datetime completely getTriggerFriendlyName: function (trigger) { - if ("DailyTrigger" == trigger.Type) { - return globalize.translate("DailyAt", ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); + if ('DailyTrigger' == trigger.Type) { + return globalize.translate('DailyAt', ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); } - if ("WeeklyTrigger" == trigger.Type) { + if ('WeeklyTrigger' == trigger.Type) { // TODO: The day of week isn't localised as well - return globalize.translate("WeeklyAt", trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); + return globalize.translate('WeeklyAt', trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); } - if ("SystemEventTrigger" == trigger.Type && "WakeFromSleep" == trigger.SystemEvent) { - return globalize.translate("OnWakeFromSleep"); + if ('SystemEventTrigger' == trigger.Type && 'WakeFromSleep' == trigger.SystemEvent) { + return globalize.translate('OnWakeFromSleep'); } - if (trigger.Type == "IntervalTrigger") { + if (trigger.Type == 'IntervalTrigger') { var hours = trigger.IntervalTicks / 36e9; if (hours == 0.25) { - return globalize.translate("EveryXMinutes", "15"); + return globalize.translate('EveryXMinutes', '15'); } if (hours == 0.5) { - return globalize.translate("EveryXMinutes", "30"); + return globalize.translate('EveryXMinutes', '30'); } if (hours == 0.75) { - return globalize.translate("EveryXMinutes", "45"); + return globalize.translate('EveryXMinutes', '45'); } if (hours == 1) { - return globalize.translate("EveryHour"); + return globalize.translate('EveryHour'); } - return globalize.translate("EveryXHours", hours); + return globalize.translate('EveryXHours', hours); } - if (trigger.Type == "StartupTrigger") { - return globalize.translate("OnApplicationStartup"); + if (trigger.Type == 'StartupTrigger') { + return globalize.translate('OnApplicationStartup'); } return trigger.Type; @@ -124,20 +124,20 @@ define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby return datetime.getDisplayTime(now); }, showAddTriggerPopup: function (view) { - $("#selectTriggerType", view).val("DailyTrigger"); - view.querySelector("#selectTriggerType").dispatchEvent(new CustomEvent("change", {})); - $("#popupAddTrigger", view).removeClass("hide"); + $('#selectTriggerType', view).val('DailyTrigger'); + view.querySelector('#selectTriggerType').dispatchEvent(new CustomEvent('change', {})); + $('#popupAddTrigger', view).removeClass('hide'); }, confirmDeleteTrigger: function (view, index) { - require(["confirm"], function (confirm) { - confirm(globalize.translate("MessageDeleteTaskTrigger"), globalize.translate("HeaderDeleteTaskTrigger")).then(function () { + require(['confirm'], function (confirm) { + confirm(globalize.translate('MessageDeleteTaskTrigger'), globalize.translate('HeaderDeleteTaskTrigger')).then(function () { ScheduledTaskPage.deleteTrigger(view, index); }); }); }, deleteTrigger: function (view, index) { loading.show(); - var id = getParameterByName("id"); + var id = getParameterByName('id'); ApiClient.getScheduledTask(id).then(function (task) { task.Triggers.remove(index); ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () { @@ -146,55 +146,55 @@ define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby }); }, refreshTriggerFields: function (page, triggerType) { - if (triggerType == "DailyTrigger") { - $("#fldTimeOfDay", page).show(); - $("#fldDayOfWeek", page).hide(); - $("#fldSelectSystemEvent", page).hide(); - $("#fldSelectInterval", page).hide(); - $("#selectTimeOfDay", page).attr("required", "required"); - } else if (triggerType == "WeeklyTrigger") { - $("#fldTimeOfDay", page).show(); - $("#fldDayOfWeek", page).show(); - $("#fldSelectSystemEvent", page).hide(); - $("#fldSelectInterval", page).hide(); - $("#selectTimeOfDay", page).attr("required", "required"); - } else if (triggerType == "SystemEventTrigger") { - $("#fldTimeOfDay", page).hide(); - $("#fldDayOfWeek", page).hide(); - $("#fldSelectSystemEvent", page).show(); - $("#fldSelectInterval", page).hide(); - $("#selectTimeOfDay", page).removeAttr("required"); - } else if (triggerType == "IntervalTrigger") { - $("#fldTimeOfDay", page).hide(); - $("#fldDayOfWeek", page).hide(); - $("#fldSelectSystemEvent", page).hide(); - $("#fldSelectInterval", page).show(); - $("#selectTimeOfDay", page).removeAttr("required"); - } else if (triggerType == "StartupTrigger") { - $("#fldTimeOfDay", page).hide(); - $("#fldDayOfWeek", page).hide(); - $("#fldSelectSystemEvent", page).hide(); - $("#fldSelectInterval", page).hide(); - $("#selectTimeOfDay", page).removeAttr("required"); + if (triggerType == 'DailyTrigger') { + $('#fldTimeOfDay', page).show(); + $('#fldDayOfWeek', page).hide(); + $('#fldSelectSystemEvent', page).hide(); + $('#fldSelectInterval', page).hide(); + $('#selectTimeOfDay', page).attr('required', 'required'); + } else if (triggerType == 'WeeklyTrigger') { + $('#fldTimeOfDay', page).show(); + $('#fldDayOfWeek', page).show(); + $('#fldSelectSystemEvent', page).hide(); + $('#fldSelectInterval', page).hide(); + $('#selectTimeOfDay', page).attr('required', 'required'); + } else if (triggerType == 'SystemEventTrigger') { + $('#fldTimeOfDay', page).hide(); + $('#fldDayOfWeek', page).hide(); + $('#fldSelectSystemEvent', page).show(); + $('#fldSelectInterval', page).hide(); + $('#selectTimeOfDay', page).removeAttr('required'); + } else if (triggerType == 'IntervalTrigger') { + $('#fldTimeOfDay', page).hide(); + $('#fldDayOfWeek', page).hide(); + $('#fldSelectSystemEvent', page).hide(); + $('#fldSelectInterval', page).show(); + $('#selectTimeOfDay', page).removeAttr('required'); + } else if (triggerType == 'StartupTrigger') { + $('#fldTimeOfDay', page).hide(); + $('#fldDayOfWeek', page).hide(); + $('#fldSelectSystemEvent', page).hide(); + $('#fldSelectInterval', page).hide(); + $('#selectTimeOfDay', page).removeAttr('required'); } }, getTriggerToAdd: function (page) { var trigger = { - Type: $("#selectTriggerType", page).val() + Type: $('#selectTriggerType', page).val() }; - if (trigger.Type == "DailyTrigger") { - trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val(); - } else if (trigger.Type == "WeeklyTrigger") { - trigger.DayOfWeek = $("#selectDayOfWeek", page).val(); - trigger.TimeOfDayTicks = $("#selectTimeOfDay", page).val(); - } else if (trigger.Type == "SystemEventTrigger") { - trigger.SystemEvent = $("#selectSystemEvent", page).val(); - } else if (trigger.Type == "IntervalTrigger") { - trigger.IntervalTicks = $("#selectInterval", page).val(); + if (trigger.Type == 'DailyTrigger') { + trigger.TimeOfDayTicks = $('#selectTimeOfDay', page).val(); + } else if (trigger.Type == 'WeeklyTrigger') { + trigger.DayOfWeek = $('#selectDayOfWeek', page).val(); + trigger.TimeOfDayTicks = $('#selectTimeOfDay', page).val(); + } else if (trigger.Type == 'SystemEventTrigger') { + trigger.SystemEvent = $('#selectSystemEvent', page).val(); + } else if (trigger.Type == 'IntervalTrigger') { + trigger.IntervalTicks = $('#selectInterval', page).val(); } - var timeLimit = $("#txtTimeLimit", page).val() || "0"; + var timeLimit = $('#txtTimeLimit', page).val() || '0'; timeLimit = parseFloat(timeLimit) * 3600000; trigger.MaxRuntimeMs = timeLimit || null; @@ -205,34 +205,34 @@ define(["jQuery", "loading", "datetime", "dom", "globalize", "emby-input", "emby return function (view, params) { function onSubmit(e) { loading.show(); - var id = getParameterByName("id"); + var id = getParameterByName('id'); ApiClient.getScheduledTask(id).then(function (task) { task.Triggers.push(ScheduledTaskPage.getTriggerToAdd(view)); ApiClient.updateScheduledTaskTriggers(task.Id, task.Triggers).then(function () { - $("#popupAddTrigger").addClass("hide"); + $('#popupAddTrigger').addClass('hide'); ScheduledTaskPage.refreshScheduledTask(view); }); }); e.preventDefault(); } - view.querySelector(".addTriggerForm").addEventListener("submit", onSubmit); - fillTimeOfDay(view.querySelector("#selectTimeOfDay")); - $(view.querySelector("#popupAddTrigger").parentNode).trigger("create"); - view.querySelector(".selectTriggerType").addEventListener("change", function () { + view.querySelector('.addTriggerForm').addEventListener('submit', onSubmit); + fillTimeOfDay(view.querySelector('#selectTimeOfDay')); + $(view.querySelector('#popupAddTrigger').parentNode).trigger('create'); + view.querySelector('.selectTriggerType').addEventListener('change', function () { ScheduledTaskPage.refreshTriggerFields(view, this.value); }); - view.querySelector(".btnAddTrigger").addEventListener("click", function () { + view.querySelector('.btnAddTrigger').addEventListener('click', function () { ScheduledTaskPage.showAddTriggerPopup(view); }); - view.addEventListener("click", function (e) { - var btnDeleteTrigger = dom.parentWithClass(e.target, "btnDeleteTrigger"); + view.addEventListener('click', function (e) { + var btnDeleteTrigger = dom.parentWithClass(e.target, 'btnDeleteTrigger'); if (btnDeleteTrigger) { - ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute("data-index"))); + ScheduledTaskPage.confirmDeleteTrigger(view, parseInt(btnDeleteTrigger.getAttribute('data-index'))); } }); - view.addEventListener("viewshow", function () { + view.addEventListener('viewshow', function () { ScheduledTaskPage.refreshScheduledTask(view); }); }; diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js index b9c7ba413..5ce53cf6f 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtasks.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtasks.js @@ -1,5 +1,5 @@ -define(["jQuery", "loading", "events", "globalize", "serverNotifications", "date-fns", "dfnshelper", "listViewStyle", "emby-button"], function ($, loading, events, globalize, serverNotifications, datefns, dfnshelper) { - "use strict"; +define(['jQuery', 'loading', 'events', 'globalize', 'serverNotifications', 'date-fns', 'dfnshelper', 'listViewStyle', 'emby-button'], function ($, loading, events, globalize, serverNotifications, datefns, dfnshelper) { + 'use strict'; function reloadList(page) { ApiClient.getScheduledTasks({ @@ -12,114 +12,114 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "date function populateList(page, tasks) { tasks = tasks.sort(function(a, b) { - a = a.Category + " " + a.Name; - b = b.Category + " " + b.Name; + a = a.Category + ' ' + a.Name; + b = b.Category + ' ' + b.Name; return a == b ? 0 : a < b ? -1 : 1; }); var currentCategory; - var html = ""; + var html = ''; for (var i = 0; i < tasks.length; i++) { var task = tasks[i]; if (task.Category != currentCategory) { currentCategory = task.Category; if (currentCategory) { - html += ""; - html += ""; + html += ''; + html += ''; } html += '
'; html += '
'; html += '

'; html += currentCategory; - html += "

"; + html += ''; if (i === 0) { - html += '' + globalize.translate("Help") + ""; + html += '' + globalize.translate('Help') + ''; } - html += "
"; + html += '
'; html += '
'; } html += '
'; html += ""; - html += 'schedule'; - html += ""; + html += ''; + html += ''; html += '"; - if (task.State === "Running") { - html += ''; - } else if (task.State === "Idle") { - html += ''; + html += "

" + task.Name + '

'; + html += "
" + getTaskProgressHtml(task) + '
'; + html += ''; + html += '
'; + if (task.State === 'Running') { + html += ''; + } else if (task.State === 'Idle') { + html += ''; } - html += "
"; + html += ''; } if (tasks.length) { - html += ""; - html += ""; + html += ''; + html += ''; } - page.querySelector(".divScheduledTasks").innerHTML = html; + page.querySelector('.divScheduledTasks').innerHTML = html; } function getTaskProgressHtml(task) { - var html = ""; - if (task.State === "Idle") { + var html = ''; + if (task.State === 'Idle') { if (task.LastExecutionResult) { var endtime = Date.parse(task.LastExecutionResult.EndTimeUtc); var starttime = Date.parse(task.LastExecutionResult.StartTimeUtc); - html += globalize.translate("LabelScheduledTaskLastRan", datefns.formatDistanceToNow(endtime, dfnshelper.localeWithSuffix), + html += globalize.translate('LabelScheduledTaskLastRan', datefns.formatDistanceToNow(endtime, dfnshelper.localeWithSuffix), datefns.formatDistance(starttime, endtime, { locale: dfnshelper.getLocale() })); - if (task.LastExecutionResult.Status === "Failed") { - html += " (" + globalize.translate("LabelFailed") + ")"; - } else if (task.LastExecutionResult.Status === "Cancelled") { - html += " (" + globalize.translate("LabelCancelled") + ")"; - } else if (task.LastExecutionResult.Status === "Aborted") { - html += " " + globalize.translate("LabelAbortedByServerShutdown") + ""; + if (task.LastExecutionResult.Status === 'Failed') { + html += " (" + globalize.translate('LabelFailed') + ')'; + } else if (task.LastExecutionResult.Status === 'Cancelled') { + html += " (" + globalize.translate('LabelCancelled') + ')'; + } else if (task.LastExecutionResult.Status === 'Aborted') { + html += " " + globalize.translate('LabelAbortedByServerShutdown') + ''; } } - } else if (task.State === "Running") { + } else if (task.State === 'Running') { var progress = (task.CurrentProgressPercentage || 0).toFixed(1); html += '
'; html += '
'; html += '
'; - html += "
"; - html += "
"; - html += "" + progress + "%"; - html += "
"; + html += ''; + html += ''; + html += "" + progress + '%'; + html += ''; } else { - html += "" + globalize.translate("LabelStopping") + ""; + html += "" + globalize.translate('LabelStopping') + ''; } return html; } function setTaskButtonIcon(button, icon) { - var inner = button.querySelector("i"); - inner.classList.remove("stop", "play_arrow"); + var inner = button.querySelector('.material-icons'); + inner.classList.remove('stop', 'play_arrow'); inner.classList.add(icon); } function updateTaskButton(elem, state) { - if (state === "Running") { - elem.classList.remove("btnStartTask"); - elem.classList.add("btnStopTask"); - setTaskButtonIcon(elem, "stop"); - elem.title = globalize.translate("ButtonStop"); - } else if (state === "Idle") { - elem.classList.add("btnStartTask"); - elem.classList.remove("btnStopTask"); - setTaskButtonIcon(elem, "play_arrow"); - elem.title = globalize.translate("ButtonStart"); + if (state === 'Running') { + elem.classList.remove('btnStartTask'); + elem.classList.add('btnStopTask'); + setTaskButtonIcon(elem, 'stop'); + elem.title = globalize.translate('ButtonStop'); + } else if (state === 'Idle') { + elem.classList.add('btnStartTask'); + elem.classList.remove('btnStopTask'); + setTaskButtonIcon(elem, 'play_arrow'); + elem.title = globalize.translate('ButtonStart'); } - $(elem).parents(".listItem")[0].setAttribute("data-status", state); + $(elem).parents('.listItem')[0].setAttribute('data-status', state); } return function(view, params) { function updateTasks(tasks) { for (var i = 0; i < tasks.length; i++) { var task = tasks[i]; - view.querySelector("#taskProgress" + task.Id).innerHTML = getTaskProgressHtml(task); - updateTaskButton(view.querySelector("#btnTask" + task.Id), task.State); + view.querySelector('#taskProgress' + task.Id).innerHTML = getTaskProgressHtml(task); + updateTaskButton(view.querySelector('#btnTask' + task.Id), task.State); } } @@ -136,47 +136,47 @@ define(["jQuery", "loading", "events", "globalize", "serverNotifications", "date } function startInterval() { - ApiClient.sendMessage("ScheduledTasksInfoStart", "1000,1000"); + ApiClient.sendMessage('ScheduledTasksInfoStart', '1000,1000'); pollInterval && clearInterval(pollInterval); pollInterval = setInterval(onPollIntervalFired, 1e4); } function stopInterval() { - ApiClient.sendMessage("ScheduledTasksInfoStop"); + ApiClient.sendMessage('ScheduledTasksInfoStop'); pollInterval && clearInterval(pollInterval); } var pollInterval; var serverId = ApiClient.serverId(); - $(".divScheduledTasks", view).on("click", ".btnStartTask", function() { + $('.divScheduledTasks', view).on('click', '.btnStartTask', function() { var button = this; - var id = button.getAttribute("data-taskid"); + var id = button.getAttribute('data-taskid'); ApiClient.startScheduledTask(id).then(function() { - updateTaskButton(button, "Running"); + updateTaskButton(button, 'Running'); reloadList(view); }); }); - $(".divScheduledTasks", view).on("click", ".btnStopTask", function() { + $('.divScheduledTasks', view).on('click', '.btnStopTask', function() { var button = this; - var id = button.getAttribute("data-taskid"); + var id = button.getAttribute('data-taskid'); ApiClient.stopScheduledTask(id).then(function() { - updateTaskButton(button, ""); + updateTaskButton(button, ''); reloadList(view); }); }); - view.addEventListener("viewbeforehide", function() { - events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + view.addEventListener('viewbeforehide', function() { + events.off(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate); stopInterval(); }); - view.addEventListener("viewshow", function() { + view.addEventListener('viewshow', function() { loading.show(); startInterval(); reloadList(view); - events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + events.on(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate); }); }; }); diff --git a/src/controllers/dashboard/serveractivity.js b/src/controllers/dashboard/serveractivity.js index fb3b8112d..c48a2903a 100644 --- a/src/controllers/dashboard/serveractivity.js +++ b/src/controllers/dashboard/serveractivity.js @@ -1,26 +1,26 @@ -define(["components/activitylog", "globalize"], function (ActivityLog, globalize) { - "use strict"; +define(['components/activitylog', 'globalize'], function (ActivityLog, globalize) { + 'use strict'; return function (view, params) { var activityLog; - if (params.useractivity !== "false") { - view.querySelector(".activityItems").setAttribute("data-useractivity", "true"); - view.querySelector(".sectionTitle").innerHTML = globalize.translate("HeaderActivity"); + if (params.useractivity !== 'false') { + view.querySelector('.activityItems').setAttribute('data-useractivity', 'true'); + view.querySelector('.sectionTitle').innerHTML = globalize.translate('HeaderActivity'); } else { - view.querySelector(".activityItems").setAttribute("data-useractivity", "false"); - view.querySelector(".sectionTitle").innerHTML = globalize.translate("Alerts"); + view.querySelector('.activityItems').setAttribute('data-useractivity', 'false'); + view.querySelector('.sectionTitle').innerHTML = globalize.translate('Alerts'); } - view.addEventListener("viewshow", function () { + view.addEventListener('viewshow', function () { if (!activityLog) { activityLog = new ActivityLog({ serverId: ApiClient.serverId(), - element: view.querySelector(".activityItems") + element: view.querySelector('.activityItems') }); } }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { if (activityLog) { activityLog.destroy(); } diff --git a/src/controllers/dashboard/streamingsettings.js b/src/controllers/dashboard/streamingsettings.js index dcd0dcba1..37afe5a05 100644 --- a/src/controllers/dashboard/streamingsettings.js +++ b/src/controllers/dashboard/streamingsettings.js @@ -1,8 +1,8 @@ -define(["jQuery", "libraryMenu", "loading", "globalize"], function ($, libraryMenu, loading, globalize) { - "use strict"; +define(['jQuery', 'libraryMenu', 'loading', 'globalize'], function ($, libraryMenu, loading, globalize) { + 'use strict'; function loadPage(page, config) { - $("#txtRemoteClientBitrateLimit", page).val(config.RemoteClientBitrateLimit / 1e6 || ""); + $('#txtRemoteClientBitrateLimit', page).val(config.RemoteClientBitrateLimit / 1e6 || ''); loading.hide(); } @@ -10,7 +10,7 @@ define(["jQuery", "libraryMenu", "loading", "globalize"], function ($, libraryMe loading.show(); var form = this; ApiClient.getServerConfiguration().then(function (config) { - config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0")); + config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($('#txtRemoteClientBitrateLimit', form).val() || '0')); ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); }); @@ -19,22 +19,22 @@ define(["jQuery", "libraryMenu", "loading", "globalize"], function ($, libraryMe function getTabs() { return [{ - href: "encodingsettings.html", - name: globalize.translate("Transcoding") + href: 'encodingsettings.html', + name: globalize.translate('Transcoding') }, { - href: "playbackconfiguration.html", - name: globalize.translate("TabResumeSettings") + href: 'playbackconfiguration.html', + name: globalize.translate('TabResumeSettings') }, { - href: "streamingsettings.html", - name: globalize.translate("TabStreaming") + href: 'streamingsettings.html', + name: globalize.translate('TabStreaming') }]; } - $(document).on("pageinit", "#streamingSettingsPage", function () { - $(".streamingSettingsForm").off("submit", onSubmit).on("submit", onSubmit); - }).on("pageshow", "#streamingSettingsPage", function () { + $(document).on('pageinit', '#streamingSettingsPage', function () { + $('.streamingSettingsForm').off('submit', onSubmit).on('submit', onSubmit); + }).on('pageshow', '#streamingSettingsPage', function () { loading.show(); - libraryMenu.setTabs("playback", 2, getTabs); + libraryMenu.setTabs('playback', 2, getTabs); var page = this; ApiClient.getServerConfiguration().then(function (config) { loadPage(page, config); diff --git a/src/controllers/edititemmetadata.js b/src/controllers/edititemmetadata.js index aba741d64..2bfc5e560 100644 --- a/src/controllers/edititemmetadata.js +++ b/src/controllers/edititemmetadata.js @@ -1,25 +1,25 @@ -define(["loading", "scripts/editorsidebar"], function (loading) { - "use strict"; +define(['loading', 'scripts/editorsidebar'], function (loading) { + 'use strict'; function reload(context, itemId) { loading.show(); if (itemId) { - require(["metadataEditor"], function (metadataEditor) { - metadataEditor.embed(context.querySelector(".editPageInnerContent"), itemId, ApiClient.serverInfo().Id); + require(['metadataEditor'], function (metadataEditor) { + metadataEditor.embed(context.querySelector('.editPageInnerContent'), itemId, ApiClient.serverInfo().Id); }); } else { - context.querySelector(".editPageInnerContent").innerHTML = ""; + context.querySelector('.editPageInnerContent').innerHTML = ''; loading.hide(); } } return function (view, params) { - view.addEventListener("viewshow", function () { + view.addEventListener('viewshow', function () { reload(this, MetadataEditor.getCurrentItemId()); }); MetadataEditor.setCurrentItemId(null); - view.querySelector(".libraryTree").addEventListener("itemclicked", function (event) { + view.querySelector('.libraryTree').addEventListener('itemclicked', function (event) { var data = event.detail; if (data.id != MetadataEditor.getCurrentItemId()) { diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index c06b0bd8f..b4c793623 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -1,26 +1,26 @@ -define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "apphost", "layoutManager", "focusManager", "emby-itemscontainer", "emby-scroller"], function (appRouter, cardBuilder, dom, globalize, connectionManager, appHost, layoutManager, focusManager) { - "use strict"; +define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'emby-itemscontainer', 'emby-scroller'], function (appRouter, cardBuilder, dom, globalize, connectionManager, appHost, layoutManager, focusManager) { + 'use strict'; function enableScrollX() { return true; } function getThumbShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop"; + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function getPosterShape() { - return enableScrollX() ? "overflowPortrait" : "portrait"; + return enableScrollX() ? 'overflowPortrait' : 'portrait'; } function getSquareShape() { - return enableScrollX() ? "overflowSquare" : "square"; + return enableScrollX() ? 'overflowSquare' : 'square'; } function getSections() { return [{ - name: "HeaderFavoriteMovies", - types: "Movie", + name: 'HeaderFavoriteMovies', + types: 'Movie', shape: getPosterShape(), showTitle: true, showYear: true, @@ -28,8 +28,8 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap overlayText: false, centerText: true }, { - name: "HeaderFavoriteShows", - types: "Series", + name: 'HeaderFavoriteShows', + types: 'Series', shape: getPosterShape(), showTitle: true, showYear: true, @@ -37,8 +37,8 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap overlayText: false, centerText: true }, { - name: "HeaderFavoriteEpisodes", - types: "Episode", + name: 'HeaderFavoriteEpisodes', + types: 'Episode', shape: getThumbShape(), preferThumb: false, showTitle: true, @@ -47,8 +47,8 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap overlayText: false, centerText: true }, { - name: "HeaderFavoriteVideos", - types: "Video", + name: 'HeaderFavoriteVideos', + types: 'Video', shape: getThumbShape(), preferThumb: true, showTitle: true, @@ -56,16 +56,16 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap overlayText: false, centerText: true }, { - name: "HeaderFavoriteCollections", - types: "BoxSet", + name: 'HeaderFavoriteCollections', + types: 'BoxSet', shape: getPosterShape(), showTitle: true, overlayPlayButton: true, overlayText: false, centerText: true }, { - name: "HeaderFavoritePlaylists", - types: "Playlist", + name: 'HeaderFavoritePlaylists', + types: 'Playlist', shape: getSquareShape(), preferThumb: false, showTitle: true, @@ -75,8 +75,8 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap overlayPlayButton: true, coverImage: true }, { - name: "HeaderFavoritePeople", - types: "Person", + name: 'HeaderFavoritePeople', + types: 'Person', shape: getPosterShape(), preferThumb: false, showTitle: true, @@ -86,8 +86,8 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap overlayPlayButton: true, coverImage: true }, { - name: "HeaderFavoriteArtists", - types: "MusicArtist", + name: 'HeaderFavoriteArtists', + types: 'MusicArtist', shape: getSquareShape(), preferThumb: false, showTitle: true, @@ -97,8 +97,8 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap overlayPlayButton: true, coverImage: true }, { - name: "HeaderFavoriteAlbums", - types: "MusicAlbum", + name: 'HeaderFavoriteAlbums', + types: 'MusicAlbum', shape: getSquareShape(), preferThumb: false, showTitle: true, @@ -108,8 +108,8 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap overlayPlayButton: true, coverImage: true }, { - name: "HeaderFavoriteSongs", - types: "Audio", + name: 'HeaderFavoriteSongs', + types: 'Audio', shape: getSquareShape(), preferThumb: false, showTitle: true, @@ -117,11 +117,11 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap showParentTitle: true, centerText: true, overlayMoreButton: true, - action: "instantmix", + action: 'instantmix', coverImage: true }, { - name: "HeaderFavoriteBooks", - types: "Book", + name: 'HeaderFavoriteBooks', + types: 'Book', shape: getPosterShape(), showTitle: true, showYear: true, @@ -135,23 +135,23 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap return function () { var apiClient = this.apiClient; var options = { - SortBy: (section.types, "SeriesName,SortName"), - SortOrder: "Ascending", - Filters: "IsFavorite", + SortBy: (section.types, 'SeriesName,SortName'), + SortOrder: 'Ascending', + Filters: 'IsFavorite', Recursive: true, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', CollapseBoxSetItems: false, - ExcludeLocationTypes: "Virtual", + ExcludeLocationTypes: 'Virtual', EnableTotalRecordCount: false }; options.Limit = 20; var userId = apiClient.getCurrentUserId(); - if ("MusicArtist" === section.types) { + if ('MusicArtist' === section.types) { return apiClient.getArtists(userId, options); } - if ("Person" === section.types) { + if ('Person' === section.types) { return apiClient.getPeople(userId, options); } @@ -161,7 +161,7 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap } function getRouteUrl(section, serverId) { - return appRouter.getRouteUrl("list", { + return appRouter.getRouteUrl('list', { serverId: serverId, itemTypes: section.types, isFavorite: true @@ -170,14 +170,14 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap function getItemsHtmlFn(section) { return function (items) { - var supportsImageAnalysis = appHost.supports("imageanalysis"); + var supportsImageAnalysis = appHost.supports('imageanalysis'); var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle; cardLayout = false; var serverId = this.apiClient.serverId(); var leadingButtons = layoutManager.tv ? [{ - name: globalize.translate("All"), - id: "more", - icon: "favorite", + name: globalize.translate('All'), + id: 'more', + icon: 'favorite', routeUrl: getRouteUrl(section, serverId) }] : null; var lines = 0; @@ -220,7 +220,7 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap this.view = view; this.params = params; this.apiClient = connectionManager.currentApiClient(); - this.sectionsContainer = view.querySelector(".sections"); + this.sectionsContainer = view.querySelector('.sections'); createSections(this, this.sectionsContainer, this.apiClient); } @@ -228,50 +228,50 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap var i; var length; var sections = getSections(); - var html = ""; + var html = ''; for (i = 0, length = sections.length; i < length; i++) { var section = sections[i]; - var sectionClass = "verticalSection"; + var sectionClass = 'verticalSection'; if (!section.showTitle) { - sectionClass += " verticalSection-extrabottompadding"; + sectionClass += ' verticalSection-extrabottompadding'; } html += '
'; html += '
'; if (layoutManager.tv) { - html += '

' + globalize.translate(section.name) + "

"; + html += '

' + globalize.translate(section.name) + '

'; } else { html += ''; html += '

'; html += globalize.translate(section.name); - html += "

"; - html += ''; - html += "
"; + html += ''; + html += ''; + html += ''; } - html += "
"; + html += '
'; html += '
'; - html += ""; + html += ''; } elem.innerHTML = html; - var elems = elem.querySelectorAll(".itemsContainer"); + var elems = elem.querySelectorAll('.itemsContainer'); for (i = 0, length = elems.length; i < length; i++) { var itemsContainer = elems[i]; itemsContainer.fetchData = getFetchDataFn(sections[i]).bind(instance); itemsContainer.getItemsHtml = getItemsHtmlFn(sections[i]).bind(instance); - itemsContainer.parentContainer = dom.parentWithClass(itemsContainer, "verticalSection"); + itemsContainer.parentContainer = dom.parentWithClass(itemsContainer, 'verticalSection'); } } FavoritesTab.prototype.onResume = function (options) { var promises = (this.apiClient, []); var view = this.view; - var elems = this.sectionsContainer.querySelectorAll(".itemsContainer"); + var elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); for (var i = 0, length = elems.length; i < length; i++) { promises.push(elems[i].resume(options)); @@ -285,7 +285,7 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap }; FavoritesTab.prototype.onPause = function () { - var elems = this.sectionsContainer.querySelectorAll(".itemsContainer"); + var elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); for (var i = 0, length = elems.length; i < length; i++) { elems[i].pause(); @@ -296,7 +296,7 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap this.view = null; this.params = null; this.apiClient = null; - var elems = this.sectionsContainer.querySelectorAll(".itemsContainer"); + var elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); for (var i = 0, length = elems.length; i < length; i++) { elems[i].fetchData = null; diff --git a/src/controllers/home.js b/src/controllers/home.js index b1dd70ebd..9a4cea222 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -1,11 +1,11 @@ -define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby-scroller"], function (TabbedView, globalize, require) { - "use strict"; +define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby-scroller'], function (TabbedView, globalize, require) { + 'use strict'; function getTabs() { return [{ - name: globalize.translate("Home") + name: globalize.translate('Home') }, { - name: globalize.translate("Favorites") + name: globalize.translate('Favorites') }]; } @@ -21,18 +21,18 @@ define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby- function getTabController(index) { if (null == index) { - throw new Error("index cannot be null"); + throw new Error('index cannot be null'); } var depends = []; switch (index) { case 0: - depends.push("controllers/hometab"); + depends.push('controllers/hometab'); break; case 1: - depends.push("controllers/favorites"); + depends.push('controllers/favorites'); } var instance = this; @@ -63,12 +63,12 @@ define(["tabbedView", "globalize", "require", "emby-tabs", "emby-button", "emby- HomeView.prototype.onPause = function () { TabbedView.prototype.onPause.call(this); - document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader"); + document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader'); }; HomeView.prototype.onResume = function (options) { TabbedView.prototype.onResume.call(this, options); - document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"); + document.querySelector('.skinHeader').classList.add('noHomeButtonHeader'); }; return HomeView; diff --git a/src/controllers/hometab.js b/src/controllers/hometab.js index d2adcb2da..8e2a1f92e 100644 --- a/src/controllers/hometab.js +++ b/src/controllers/hometab.js @@ -1,12 +1,12 @@ -define(["userSettings", "loading", "connectionManager", "apphost", "layoutManager", "focusManager", "homeSections", "emby-itemscontainer"], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) { - "use strict"; +define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'homeSections', 'emby-itemscontainer'], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) { + 'use strict'; function HomeTab(view, params) { this.view = view; this.params = params; this.apiClient = connectionManager.currentApiClient(); - this.sectionsContainer = view.querySelector(".sections"); - view.querySelector(".sections").addEventListener("settingschange", onHomeScreenSettingsChanged.bind(this)); + this.sectionsContainer = view.querySelector('.sections'); + view.querySelector('.sections').addEventListener('settingschange', onHomeScreenSettingsChanged.bind(this)); } function onHomeScreenSettingsChanged() { @@ -36,7 +36,7 @@ define(["userSettings", "loading", "connectionManager", "apphost", "layoutManage this.destroyHomeSections(); this.sectionsRendered = true; return apiClient.getCurrentUser().then(function (user) { - return homeSections.loadSections(view.querySelector(".sections"), apiClient, user, userSettings).then(function () { + return homeSections.loadSections(view.querySelector('.sections'), apiClient, user, userSettings).then(function () { if (options.autoFocus) { focusManager.autoFocus(view); } diff --git a/src/controllers/itemdetailpage.js b/src/controllers/itemdetailpage.js index 992b86e4e..45342208e 100644 --- a/src/controllers/itemdetailpage.js +++ b/src/controllers/itemdetailpage.js @@ -1,5 +1,5 @@ -define(["loading", "appRouter", "layoutManager", "connectionManager", "userSettings", "cardBuilder", "datetime", "mediaInfo", "backdrop", "listView", "itemContextMenu", "itemHelper", "dom", "indicators", "imageLoader", "libraryMenu", "globalize", "browser", "events", "playbackManager", "scrollStyles", "emby-itemscontainer", "emby-checkbox", "emby-button", "emby-playstatebutton", "emby-ratingbutton", "emby-scroller", "emby-select"], function (loading, appRouter, layoutManager, connectionManager, userSettings, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, dom, indicators, imageLoader, libraryMenu, globalize, browser, events, playbackManager) { - "use strict"; +define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSettings', 'cardBuilder', 'datetime', 'mediaInfo', 'backdrop', 'listView', 'itemContextMenu', 'itemHelper', 'dom', 'indicators', 'imageLoader', 'libraryMenu', 'globalize', 'browser', 'events', 'playbackManager', 'scrollStyles', 'emby-itemscontainer', 'emby-checkbox', 'emby-button', 'emby-playstatebutton', 'emby-ratingbutton', 'emby-scroller', 'emby-select'], function (loading, appRouter, layoutManager, connectionManager, userSettings, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, dom, indicators, imageLoader, libraryMenu, globalize, browser, events, playbackManager) { + 'use strict'; function getPromise(apiClient, params) { var id = params.id; @@ -24,19 +24,19 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti return apiClient.getArtist(params.musicartist, apiClient.getCurrentUserId()); } - throw new Error("Invalid request"); + throw new Error('Invalid request'); } function hideAll(page, className, show) { var i; var length; - var elems = page.querySelectorAll("." + className); + var elems = page.querySelectorAll('.' + className); for (i = 0, length = elems.length; i < length; i++) { if (show) { - elems[i].classList.remove("hide"); + elems[i].classList.remove('hide'); } else { - elems[i].classList.add("hide"); + elems[i].classList.add('hide'); } } } @@ -61,101 +61,101 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function getProgramScheduleHtml(items) { - var html = ""; + var html = ''; html += '
'; html += listView.getListViewHtml({ items: items, enableUserDataButtons: false, image: true, - imageSource: "channel", + imageSource: 'channel', showProgramDateTime: true, showChannel: false, mediaInfo: false, - action: "none", + action: 'none', moreButton: false, recordButton: false }); - return html += "
"; + return html += ''; } function renderSeriesTimerSchedule(page, apiClient, seriesTimerId) { apiClient.getLiveTvTimers({ UserId: apiClient.getCurrentUserId(), ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", - SortBy: "StartDate", + EnableImageTypes: 'Primary,Backdrop,Thumb', + SortBy: 'StartDate', EnableTotalRecordCount: false, EnableUserData: false, SeriesTimerId: seriesTimerId, - Fields: "ChannelInfo,ChannelImage" + Fields: 'ChannelInfo,ChannelImage' }).then(function (result) { if (result.Items.length && result.Items[0].SeriesTimerId != seriesTimerId) { result.Items = []; } var html = getProgramScheduleHtml(result.Items); - var scheduleTab = page.querySelector(".seriesTimerSchedule"); + var scheduleTab = page.querySelector('.seriesTimerSchedule'); scheduleTab.innerHTML = html; imageLoader.lazyChildren(scheduleTab); }); } function renderTimerEditor(page, item, apiClient, user) { - if ("Recording" !== item.Type || !user.Policy.EnableLiveTvManagement || !item.TimerId || "InProgress" !== item.Status) { - return void hideAll(page, "btnCancelTimer"); + if ('Recording' !== item.Type || !user.Policy.EnableLiveTvManagement || !item.TimerId || 'InProgress' !== item.Status) { + return void hideAll(page, 'btnCancelTimer'); } - hideAll(page, "btnCancelTimer", true); + hideAll(page, 'btnCancelTimer', true); } function renderSeriesTimerEditor(page, item, apiClient, user) { - if ("SeriesTimer" !== item.Type) { - return void hideAll(page, "btnCancelSeriesTimer"); + if ('SeriesTimer' !== item.Type) { + return void hideAll(page, 'btnCancelSeriesTimer'); } if (user.Policy.EnableLiveTvManagement) { - require(["seriesRecordingEditor"], function (seriesRecordingEditor) { + require(['seriesRecordingEditor'], function (seriesRecordingEditor) { seriesRecordingEditor.embed(item, apiClient.serverId(), { - context: page.querySelector(".seriesRecordingEditor") + context: page.querySelector('.seriesRecordingEditor') }); }); - page.querySelector(".seriesTimerScheduleSection").classList.remove("hide"); - hideAll(page, "btnCancelSeriesTimer", true); + page.querySelector('.seriesTimerScheduleSection').classList.remove('hide'); + hideAll(page, 'btnCancelSeriesTimer', true); return void renderSeriesTimerSchedule(page, apiClient, item.Id); } - page.querySelector(".seriesTimerScheduleSection").classList.add("hide"); - return void hideAll(page, "btnCancelSeriesTimer"); + page.querySelector('.seriesTimerScheduleSection').classList.add('hide'); + return void hideAll(page, 'btnCancelSeriesTimer'); } function renderTrackSelections(page, instance, item, forceReload) { - var select = page.querySelector(".selectSource"); + var select = page.querySelector('.selectSource'); - if (!item.MediaSources || !itemHelper.supportsMediaSourceSelection(item) || -1 === playbackManager.getSupportedCommands().indexOf("PlayMediaSource") || !playbackManager.canPlay(item)) { - page.querySelector(".trackSelections").classList.add("hide"); - select.innerHTML = ""; - page.querySelector(".selectVideo").innerHTML = ""; - page.querySelector(".selectAudio").innerHTML = ""; - page.querySelector(".selectSubtitles").innerHTML = ""; + if (!item.MediaSources || !itemHelper.supportsMediaSourceSelection(item) || -1 === playbackManager.getSupportedCommands().indexOf('PlayMediaSource') || !playbackManager.canPlay(item)) { + page.querySelector('.trackSelections').classList.add('hide'); + select.innerHTML = ''; + page.querySelector('.selectVideo').innerHTML = ''; + page.querySelector('.selectAudio').innerHTML = ''; + page.querySelector('.selectSubtitles').innerHTML = ''; return; } playbackManager.getPlaybackMediaSources(item).then(function (mediaSources) { instance._currentPlaybackMediaSources = mediaSources; - page.querySelector(".trackSelections").classList.remove("hide"); - select.setLabel(globalize.translate("LabelVersion")); + page.querySelector('.trackSelections').classList.remove('hide'); + select.setLabel(globalize.translate('LabelVersion')); var currentValue = select.value; var selectedId = mediaSources[0].Id; select.innerHTML = mediaSources.map(function (v) { - var selected = v.Id === selectedId ? " selected" : ""; - return '"; - }).join(""); + var selected = v.Id === selectedId ? ' selected' : ''; + return ''; + }).join(''); if (mediaSources.length > 1) { - page.querySelector(".selectSourceContainer").classList.remove("hide"); + page.querySelector('.selectSourceContainer').classList.remove('hide'); } else { - page.querySelector(".selectSourceContainer").classList.add("hide"); + page.querySelector('.selectSourceContainer').classList.add('hide'); } if (select.value !== currentValue || forceReload) { @@ -167,18 +167,18 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function renderVideoSelections(page, mediaSources) { - var mediaSourceId = page.querySelector(".selectSource").value; + var mediaSourceId = page.querySelector('.selectSource').value; var mediaSource = mediaSources.filter(function (m) { return m.Id === mediaSourceId; })[0]; var tracks = mediaSource.MediaStreams.filter(function (m) { - return "Video" === m.Type; + return 'Video' === m.Type; }); - var select = page.querySelector(".selectVideo"); - select.setLabel(globalize.translate("LabelVideo")); + var select = page.querySelector('.selectVideo'); + select.setLabel(globalize.translate('LabelVideo')); var selectedId = tracks.length ? tracks[0].Index : -1; select.innerHTML = tracks.map(function (v) { - var selected = v.Index === selectedId ? " selected" : ""; + var selected = v.Index === selectedId ? ' selected' : ''; var titleParts = []; var resolutionText = mediaInfo.getResolutionText(v); @@ -190,100 +190,100 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti titleParts.push(v.Codec.toUpperCase()); } - return '"; - }).join(""); - select.setAttribute("disabled", "disabled"); + return ''; + }).join(''); + select.setAttribute('disabled', 'disabled'); if (tracks.length) { - page.querySelector(".selectVideoContainer").classList.remove("hide"); + page.querySelector('.selectVideoContainer').classList.remove('hide'); } else { - page.querySelector(".selectVideoContainer").classList.add("hide"); + page.querySelector('.selectVideoContainer').classList.add('hide'); } } function renderAudioSelections(page, mediaSources) { - var mediaSourceId = page.querySelector(".selectSource").value; + var mediaSourceId = page.querySelector('.selectSource').value; var mediaSource = mediaSources.filter(function (m) { return m.Id === mediaSourceId; })[0]; var tracks = mediaSource.MediaStreams.filter(function (m) { - return "Audio" === m.Type; + return 'Audio' === m.Type; }); - var select = page.querySelector(".selectAudio"); - select.setLabel(globalize.translate("LabelAudio")); + var select = page.querySelector('.selectAudio'); + select.setLabel(globalize.translate('LabelAudio')); var selectedId = mediaSource.DefaultAudioStreamIndex; select.innerHTML = tracks.map(function (v) { - var selected = v.Index === selectedId ? " selected" : ""; - return '"; - }).join(""); + var selected = v.Index === selectedId ? ' selected' : ''; + return ''; + }).join(''); if (tracks.length > 1) { - select.removeAttribute("disabled"); + select.removeAttribute('disabled'); } else { - select.setAttribute("disabled", "disabled"); + select.setAttribute('disabled', 'disabled'); } if (tracks.length) { - page.querySelector(".selectAudioContainer").classList.remove("hide"); + page.querySelector('.selectAudioContainer').classList.remove('hide'); } else { - page.querySelector(".selectAudioContainer").classList.add("hide"); + page.querySelector('.selectAudioContainer').classList.add('hide'); } } function renderSubtitleSelections(page, mediaSources) { - var mediaSourceId = page.querySelector(".selectSource").value; + var mediaSourceId = page.querySelector('.selectSource').value; var mediaSource = mediaSources.filter(function (m) { return m.Id === mediaSourceId; })[0]; var tracks = mediaSource.MediaStreams.filter(function (m) { - return "Subtitle" === m.Type; + return 'Subtitle' === m.Type; }); - var select = page.querySelector(".selectSubtitles"); - select.setLabel(globalize.translate("LabelSubtitles")); + var select = page.querySelector('.selectSubtitles'); + select.setLabel(globalize.translate('LabelSubtitles')); var selectedId = null == mediaSource.DefaultSubtitleStreamIndex ? -1 : mediaSource.DefaultSubtitleStreamIndex; if (tracks.length) { - var selected = -1 === selectedId ? " selected" : ""; - select.innerHTML = '" + tracks.map(function (v) { - selected = v.Index === selectedId ? " selected" : ""; - return '"; - }).join(""); - page.querySelector(".selectSubtitlesContainer").classList.remove("hide"); + var selected = -1 === selectedId ? ' selected' : ''; + select.innerHTML = '' + tracks.map(function (v) { + selected = v.Index === selectedId ? ' selected' : ''; + return ''; + }).join(''); + page.querySelector('.selectSubtitlesContainer').classList.remove('hide'); } else { - select.innerHTML = ""; - page.querySelector(".selectSubtitlesContainer").classList.add("hide"); + select.innerHTML = ''; + page.querySelector('.selectSubtitlesContainer').classList.add('hide'); } } function reloadPlayButtons(page, item) { var canPlay = false; - if ("Program" == item.Type) { + if ('Program' == item.Type) { var now = new Date(); if (now >= datetime.parseISO8601Date(item.StartDate, true) && now < datetime.parseISO8601Date(item.EndDate, true)) { - hideAll(page, "btnPlay", true); + hideAll(page, 'btnPlay', true); canPlay = true; } else { - hideAll(page, "btnPlay"); + hideAll(page, 'btnPlay'); } - hideAll(page, "btnResume"); - hideAll(page, "btnInstantMix"); - hideAll(page, "btnShuffle"); + hideAll(page, 'btnResume'); + hideAll(page, 'btnInstantMix'); + hideAll(page, 'btnShuffle'); } else if (playbackManager.canPlay(item)) { - hideAll(page, "btnPlay", true); - var enableInstantMix = -1 !== ["Audio", "MusicAlbum", "MusicGenre", "MusicArtist"].indexOf(item.Type); - hideAll(page, "btnInstantMix", enableInstantMix); - var enableShuffle = item.IsFolder || -1 !== ["MusicAlbum", "MusicGenre", "MusicArtist"].indexOf(item.Type); - hideAll(page, "btnShuffle", enableShuffle); + hideAll(page, 'btnPlay', true); + var enableInstantMix = -1 !== ['Audio', 'MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type); + hideAll(page, 'btnInstantMix', enableInstantMix); + var enableShuffle = item.IsFolder || -1 !== ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type); + hideAll(page, 'btnShuffle', enableShuffle); canPlay = true; - hideAll(page, "btnResume", item.UserData && item.UserData.PlaybackPositionTicks > 0); + hideAll(page, 'btnResume', item.UserData && item.UserData.PlaybackPositionTicks > 0); } else { - hideAll(page, "btnPlay"); - hideAll(page, "btnResume"); - hideAll(page, "btnInstantMix"); - hideAll(page, "btnShuffle"); + hideAll(page, 'btnPlay'); + hideAll(page, 'btnResume'); + hideAll(page, 'btnInstantMix'); + hideAll(page, 'btnShuffle'); } return canPlay; @@ -292,30 +292,30 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function reloadUserDataButtons(page, item) { var i; var length; - var btnPlaystates = page.querySelectorAll(".btnPlaystate"); + var btnPlaystates = page.querySelectorAll('.btnPlaystate'); for (i = 0, length = btnPlaystates.length; i < length; i++) { var btnPlaystate = btnPlaystates[i]; if (itemHelper.canMarkPlayed(item)) { - btnPlaystate.classList.remove("hide"); + btnPlaystate.classList.remove('hide'); btnPlaystate.setItem(item); } else { - btnPlaystate.classList.add("hide"); + btnPlaystate.classList.add('hide'); btnPlaystate.setItem(null); } } - var btnUserRatings = page.querySelectorAll(".btnUserRating"); + var btnUserRatings = page.querySelectorAll('.btnUserRating'); for (i = 0, length = btnUserRatings.length; i < length; i++) { var btnUserRating = btnUserRatings[i]; if (itemHelper.canRate(item)) { - btnUserRating.classList.remove("hide"); + btnUserRating.classList.remove('hide'); btnUserRating.setItem(item); } else { - btnUserRating.classList.add("hide"); + btnUserRating.classList.add('hide'); btnUserRating.setItem(null); } } @@ -328,13 +328,13 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti var artist = artists[i]; var href = appRouter.getRouteUrl(artist, { context: context, - itemType: "MusicArtist", + itemType: 'MusicArtist', serverId: serverId }); - html.push('' + artist.Name + ""); + html.push('' + artist.Name + ''); } - return html = html.join(" / "); + return html = html.join(' / '); } function renderName(item, container, isStatic, context) { var parentRoute; @@ -344,64 +344,64 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti if (item.AlbumArtists) { parentNameHtml.push(getArtistLinksHtml(item.AlbumArtists, item.ServerId, context)); parentNameLast = true; - } else if (item.ArtistItems && item.ArtistItems.length && "MusicVideo" === item.Type) { + } else if (item.ArtistItems && item.ArtistItems.length && 'MusicVideo' === item.Type) { parentNameHtml.push(getArtistLinksHtml(item.ArtistItems, item.ServerId, context)); parentNameLast = true; - } else if (item.SeriesName && "Episode" === item.Type) { + } else if (item.SeriesName && 'Episode' === item.Type) { parentRoute = appRouter.getRouteUrl({ Id: item.SeriesId, Name: item.SeriesName, - Type: "Series", + Type: 'Series', IsFolder: true, ServerId: item.ServerId }, { context: context }); - parentNameHtml.push('' + item.SeriesName + ""); + parentNameHtml.push('' + item.SeriesName + ''); } else if (item.IsSeries || item.EpisodeTitle) { parentNameHtml.push(item.Name); } - if (item.SeriesName && "Season" === item.Type) { + if (item.SeriesName && 'Season' === item.Type) { parentRoute = appRouter.getRouteUrl({ Id: item.SeriesId, Name: item.SeriesName, - Type: "Series", + Type: 'Series', IsFolder: true, ServerId: item.ServerId }, { context: context }); - parentNameHtml.push('' + item.SeriesName + ""); - } else if (null != item.ParentIndexNumber && "Episode" === item.Type) { + parentNameHtml.push('' + item.SeriesName + ''); + } else if (null != item.ParentIndexNumber && 'Episode' === item.Type) { parentRoute = appRouter.getRouteUrl({ Id: item.SeasonId, Name: item.SeasonName, - Type: "Season", + Type: 'Season', IsFolder: true, ServerId: item.ServerId }, { context: context }); - parentNameHtml.push('' + item.SeasonName + ""); + parentNameHtml.push('' + item.SeasonName + ''); } else if (null != item.ParentIndexNumber && item.IsSeries) { - parentNameHtml.push(item.SeasonName || "S" + item.ParentIndexNumber); - } else if (item.Album && item.AlbumId && ("MusicVideo" === item.Type || "Audio" === item.Type)) { + parentNameHtml.push(item.SeasonName || 'S' + item.ParentIndexNumber); + } else if (item.Album && item.AlbumId && ('MusicVideo' === item.Type || 'Audio' === item.Type)) { parentRoute = appRouter.getRouteUrl({ Id: item.AlbumId, Name: item.Album, - Type: "MusicAlbum", + Type: 'MusicAlbum', IsFolder: true, ServerId: item.ServerId }, { context: context }); - parentNameHtml.push('' + item.Album + ""); + parentNameHtml.push('' + item.Album + ''); } else if (item.Album) { parentNameHtml.push(item.Album); } // FIXME: This whole section needs some refactoring, so it becames easier to scale across all form factors. See GH #1022 - var html = ""; + var html = ''; var tvShowHtml = parentNameHtml[0]; var tvSeasonHtml = parentNameHtml[1]; @@ -409,15 +409,15 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti if (parentNameLast) { // Music if (layoutManager.mobile) { - html = '

' + parentNameHtml.join("
") + "

"; + html = '

' + parentNameHtml.join('
') + '

'; } else { - html = '

' + parentNameHtml.join(" - ") + "

"; + html = '

' + parentNameHtml.join(' - ') + '

'; } } else { if (layoutManager.mobile) { - html = '

' + parentNameHtml.join("
") + "

"; + html = '

' + parentNameHtml.join('
') + '

'; } else { - html = '

' + tvShowHtml + "

"; + html = '

' + tvShowHtml + '

'; } } } @@ -425,7 +425,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti var name = itemHelper.getDisplayName(item, { includeParentInfo: false }); - var offset = parentNameLast ? ".25em" : ".5em"; + var offset = parentNameLast ? '.25em' : '.5em'; if (html && !parentNameLast) { if (!layoutManager.mobile && tvSeasonHtml) { @@ -434,7 +434,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti html += '

' + name + '

'; } } else { - html = '

' + name + "

" + html; + html = '

' + name + '

' + html; } if (item.OriginalTitle && item.OriginalTitle != item.Name) { @@ -444,17 +444,17 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti container.innerHTML = html; if (html.length) { - container.classList.remove("hide"); + container.classList.remove('hide'); } else { - container.classList.add("hide"); + container.classList.add('hide'); } } function setTrailerButtonVisibility(page, item) { - if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf("PlayTrailers")) { - hideAll(page, "btnPlayTrailer", true); + if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf('PlayTrailers')) { + hideAll(page, 'btnPlayTrailer', true); } else { - hideAll(page, "btnPlayTrailer"); + hideAll(page, 'btnPlayTrailer'); } } @@ -469,76 +469,76 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function renderDetailPageBackdrop(page, item, apiClient) { var imgUrl; var hasbackdrop = false; - var itemBackdropElement = page.querySelector("#itemBackdrop"); - var usePrimaryImage = item.MediaType === "Video" && item.Type !== "Movie" && item.Type !== "Trailer" || - item.MediaType && item.MediaType !== "Video" || - item.Type === "MusicAlbum" || - item.Type === "Person"; + var itemBackdropElement = page.querySelector('#itemBackdrop'); + var usePrimaryImage = item.MediaType === 'Video' && item.Type !== 'Movie' && item.Type !== 'Trailer' || + item.MediaType && item.MediaType !== 'Video' || + item.Type === 'MusicAlbum' || + item.Type === 'Person'; if (!layoutManager.mobile && !userSettings.enableBackdrops()) { return false; } - if ("Program" === item.Type && item.ImageTags && item.ImageTags.Thumb) { + if ('Program' === item.Type && item.ImageTags && item.ImageTags.Thumb) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Thumb", + type: 'Thumb', maxWidth: dom.getScreenWidth(), index: 0, tag: item.ImageTags.Thumb }); - page.classList.remove("noBackdrop"); - imageLoader.lazyImage(itemBackdropElement, imgUrl, false); + page.classList.remove('noBackdrop'); + imageLoader.lazyImage(itemBackdropElement, imgUrl); hasbackdrop = true; } else if (usePrimaryImage && item.ImageTags && item.ImageTags.Primary) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Primary", + type: 'Primary', maxWidth: dom.getScreenWidth(), index: 0, tag: item.ImageTags.Primary }); - page.classList.remove("noBackdrop"); - imageLoader.lazyImage(itemBackdropElement, imgUrl, false); + page.classList.remove('noBackdrop'); + imageLoader.lazyImage(itemBackdropElement, imgUrl); hasbackdrop = true; } else if (item.BackdropImageTags && item.BackdropImageTags.length) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Backdrop", + type: 'Backdrop', maxWidth: dom.getScreenWidth(), index: 0, tag: item.BackdropImageTags[0] }); - page.classList.remove("noBackdrop"); - imageLoader.lazyImage(itemBackdropElement, imgUrl, false); + page.classList.remove('noBackdrop'); + imageLoader.lazyImage(itemBackdropElement, imgUrl); hasbackdrop = true; } else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { imgUrl = apiClient.getScaledImageUrl(item.ParentBackdropItemId, { - type: "Backdrop", + type: 'Backdrop', maxWidth: dom.getScreenWidth(), index: 0, tag: item.ParentBackdropImageTags[0] }); - page.classList.remove("noBackdrop"); - imageLoader.lazyImage(itemBackdropElement, imgUrl, false); + page.classList.remove('noBackdrop'); + imageLoader.lazyImage(itemBackdropElement, imgUrl); hasbackdrop = true; } else if (item.ImageTags && item.ImageTags.Thumb) { imgUrl = apiClient.getScaledImageUrl(item.Id, { - type: "Thumb", + type: 'Thumb', maxWidth: dom.getScreenWidth(), index: 0, tag: item.ImageTags.Thumb }); - page.classList.remove("noBackdrop"); - imageLoader.lazyImage(itemBackdropElement, imgUrl, false); + page.classList.remove('noBackdrop'); + imageLoader.lazyImage(itemBackdropElement, imgUrl); hasbackdrop = true; } else { - itemBackdropElement.style.backgroundImage = ""; + itemBackdropElement.style.backgroundImage = ''; } - if ("Person" === item.Type) { + if ('Person' === item.Type) { // FIXME: This hides the backdrop on all persons to fix a margin issue. Ideally, a proper fix should be made. page.classList.add('noBackdrop'); - itemBackdropElement.classList.add("personBackdrop"); + itemBackdropElement.classList.add('personBackdrop'); } else { - itemBackdropElement.classList.remove("personBackdrop"); + itemBackdropElement.classList.remove('personBackdrop'); } return hasbackdrop; @@ -546,15 +546,15 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function reloadFromItem(instance, page, params, item, user) { var context = params.context; - page.querySelector(".detailPagePrimaryContainer").classList.add("detailSticky"); + page.querySelector('.detailPagePrimaryContainer').classList.add('detailSticky'); - renderName(item, page.querySelector(".nameContainer"), false, context); + renderName(item, page.querySelector('.nameContainer'), false, context); var apiClient = connectionManager.getApiClient(item.ServerId); renderSeriesTimerEditor(page, item, apiClient, user); renderTimerEditor(page, item, apiClient, user); renderImage(page, item, apiClient, user); renderLogo(page, item, apiClient); - setTitle(item, apiClient); + Emby.Page.setTitle(''); setInitialCollapsibleState(page, item, apiClient, context, user); renderDetails(page, item, apiClient, context); renderTrackSelections(page, instance, item); @@ -562,96 +562,96 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti renderDetailPageBackdrop(page, item, apiClient); var canPlay = reloadPlayButtons(page, item); - if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf("PlayTrailers")) { - hideAll(page, "btnPlayTrailer", true); + if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf('PlayTrailers')) { + hideAll(page, 'btnPlayTrailer', true); } else { - hideAll(page, "btnPlayTrailer"); + hideAll(page, 'btnPlayTrailer'); } setTrailerButtonVisibility(page, item); if (item.CanDelete && !item.IsFolder) { - hideAll(page, "btnDeleteItem", true); + hideAll(page, 'btnDeleteItem', true); } else { - hideAll(page, "btnDeleteItem"); + hideAll(page, 'btnDeleteItem'); } - if ("Program" !== item.Type || canPlay) { - hideAll(page, "mainDetailButtons", true); + if ('Program' !== item.Type || canPlay) { + hideAll(page, 'mainDetailButtons', true); } else { - hideAll(page, "mainDetailButtons"); + hideAll(page, 'mainDetailButtons'); } showRecordingFields(instance, page, item, user); var groupedVersions = (item.MediaSources || []).filter(function (g) { - return "Grouping" == g.Type; + return 'Grouping' == g.Type; }); if (user.Policy.IsAdministrator && groupedVersions.length) { - page.querySelector(".btnSplitVersions").classList.remove("hide"); + page.querySelector('.btnSplitVersions').classList.remove('hide'); } else { - page.querySelector(".btnSplitVersions").classList.add("hide"); + page.querySelector('.btnSplitVersions').classList.add('hide'); } if (itemContextMenu.getCommands(getContextMenuOptions(item, user)).length) { - hideAll(page, "btnMoreCommands", true); + hideAll(page, 'btnMoreCommands', true); } else { - hideAll(page, "btnMoreCommands"); + hideAll(page, 'btnMoreCommands'); } - var itemBirthday = page.querySelector("#itemBirthday"); + var itemBirthday = page.querySelector('#itemBirthday'); - if ("Person" == item.Type && item.PremiereDate) { + if ('Person' == item.Type && item.PremiereDate) { try { var birthday = datetime.parseISO8601Date(item.PremiereDate, true).toDateString(); - itemBirthday.classList.remove("hide"); - itemBirthday.innerHTML = globalize.translate("BirthDateValue", birthday); + itemBirthday.classList.remove('hide'); + itemBirthday.innerHTML = globalize.translate('BirthDateValue', birthday); } catch (err) { - itemBirthday.classList.add("hide"); + itemBirthday.classList.add('hide'); } } else { - itemBirthday.classList.add("hide"); + itemBirthday.classList.add('hide'); } - var itemDeathDate = page.querySelector("#itemDeathDate"); + var itemDeathDate = page.querySelector('#itemDeathDate'); - if ("Person" == item.Type && item.EndDate) { + if ('Person' == item.Type && item.EndDate) { try { var deathday = datetime.parseISO8601Date(item.EndDate, true).toDateString(); - itemDeathDate.classList.remove("hide"); - itemDeathDate.innerHTML = globalize.translate("DeathDateValue", deathday); + itemDeathDate.classList.remove('hide'); + itemDeathDate.innerHTML = globalize.translate('DeathDateValue', deathday); } catch (err) { - itemDeathDate.classList.add("hide"); + itemDeathDate.classList.add('hide'); } } else { - itemDeathDate.classList.add("hide"); + itemDeathDate.classList.add('hide'); } - var itemBirthLocation = page.querySelector("#itemBirthLocation"); + var itemBirthLocation = page.querySelector('#itemBirthLocation'); - if ("Person" == item.Type && item.ProductionLocations && item.ProductionLocations.length) { - var gmap = '' + item.ProductionLocations[0] + ""; - itemBirthLocation.classList.remove("hide"); - itemBirthLocation.innerHTML = globalize.translate("BirthPlaceValue", gmap); + if ('Person' == item.Type && item.ProductionLocations && item.ProductionLocations.length) { + var gmap = '' + item.ProductionLocations[0] + ''; + itemBirthLocation.classList.remove('hide'); + itemBirthLocation.innerHTML = globalize.translate('BirthPlaceValue', gmap); } else { - itemBirthLocation.classList.add("hide"); + itemBirthLocation.classList.add('hide'); } setPeopleHeader(page, item); loading.hide(); - if (item.Type === "Book") { - hideAll(page, "btnDownload", true); + if (item.Type === 'Book') { + hideAll(page, 'btnDownload', true); } - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); } function logoImageUrl(item, apiClient, options) { options = options || {}; - options.type = "Logo"; + options.type = 'Logo'; if (item.ImageTags && item.ImageTags.Logo) { options.tag = item.ImageTags.Logo; @@ -666,53 +666,40 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti return null; } - function setTitle(item, apiClient) { - var url = logoImageUrl(item, apiClient, {}); - - if (url != null) { - var pageTitle = document.querySelector(".pageTitle"); - pageTitle.style.backgroundImage = "url('" + url + "')"; - pageTitle.classList.add("pageTitleWithLogo"); - pageTitle.innerHTML = ""; - } else { - Emby.Page.setTitle(""); - } - } - function renderLogo(page, item, apiClient) { var url = logoImageUrl(item, apiClient, { maxWidth: 400 }); - var detailLogo = page.querySelector(".detailLogo"); + var detailLogo = page.querySelector('.detailLogo'); if (!layoutManager.mobile && !userSettings.enableBackdrops()) { - detailLogo.classList.add("hide"); + detailLogo.classList.add('hide'); } else if (url) { - detailLogo.classList.remove("hide"); - detailLogo.classList.add("lazy"); - detailLogo.setAttribute("data-src", url); + detailLogo.classList.remove('hide'); + detailLogo.classList.add('lazy'); + detailLogo.setAttribute('data-src', url); imageLoader.lazyImage(detailLogo); } else { - detailLogo.classList.add("hide"); + detailLogo.classList.add('hide'); } } function showRecordingFields(instance, page, item, user) { if (!instance.currentRecordingFields) { - var recordingFieldsElement = page.querySelector(".recordingFields"); + var recordingFieldsElement = page.querySelector('.recordingFields'); - if ("Program" == item.Type && user.Policy.EnableLiveTvManagement) { - require(["recordingFields"], function (recordingFields) { + if ('Program' == item.Type && user.Policy.EnableLiveTvManagement) { + require(['recordingFields'], function (recordingFields) { instance.currentRecordingFields = new recordingFields({ parent: recordingFieldsElement, programId: item.Id, serverId: item.ServerId }); - recordingFieldsElement.classList.remove("hide"); + recordingFieldsElement.classList.remove('hide'); }); } else { - recordingFieldsElement.classList.add("hide"); - recordingFieldsElement.innerHTML = ""; + recordingFieldsElement.classList.add('hide'); + recordingFieldsElement.innerHTML = ''; } } } @@ -723,34 +710,34 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti var links = []; if (!layoutManager.tv && item.HomePageUrl) { - links.push('' + globalize.translate("ButtonWebsite") + ""); + links.push('' + globalize.translate('ButtonWebsite') + ''); } if (item.ExternalUrls) { for (var i = 0, length = item.ExternalUrls.length; i < length; i++) { var url = item.ExternalUrls[i]; - links.push('' + url.Name + ""); + links.push('' + url.Name + ''); } } if (links.length) { - html.push(links.join(", ")); + html.push(links.join(', ')); } - linksElem.innerHTML = html.join(", "); + linksElem.innerHTML = html.join(', '); if (html.length) { - linksElem.classList.remove("hide"); + linksElem.classList.remove('hide'); } else { - linksElem.classList.add("hide"); + linksElem.classList.add('hide'); } } function renderDetailImage(page, elem, item, apiClient, editable, imageLoader, indicators) { - if ("SeriesTimer" === item.Type || "Program" === item.Type) { + if ('SeriesTimer' === item.Type || 'Program' === item.Type) { editable = false; } - elem.classList.add("detailimg-hidemobile"); + elem.classList.add('detailimg-hidemobile'); var imageTags = item.ImageTags || {}; @@ -759,8 +746,8 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } var url; - var html = ""; - var shape = "portrait"; + var html = ''; + var shape = 'portrait'; var detectRatio = false; /* In the following section, getScreenWidth() is multiplied by 0.5 as the posters @@ -768,48 +755,48 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti // TODO: Find a reliable way to get the poster width if (imageTags.Primary) { url = apiClient.getScaledImageUrl(item.Id, { - type: "Primary", + type: 'Primary', maxWidth: Math.round(dom.getScreenWidth() * 0.5), tag: item.ImageTags.Primary }); detectRatio = true; } else if (item.BackdropImageTags && item.BackdropImageTags.length) { url = apiClient.getScaledImageUrl(item.Id, { - type: "Backdrop", + type: 'Backdrop', maxWidth: Math.round(dom.getScreenWidth() * 0.5), tag: item.BackdropImageTags[0] }); - shape = "thumb"; + shape = 'thumb'; } else if (imageTags.Thumb) { url = apiClient.getScaledImageUrl(item.Id, { - type: "Thumb", + type: 'Thumb', maxWidth: Math.round(dom.getScreenWidth() * 0.5), tag: item.ImageTags.Thumb }); - shape = "thumb"; + shape = 'thumb'; } else if (imageTags.Disc) { url = apiClient.getScaledImageUrl(item.Id, { - type: "Disc", + type: 'Disc', maxWidth: Math.round(dom.getScreenWidth() * 0.5), tag: item.ImageTags.Disc }); - shape = "square"; + shape = 'square'; } else if (item.AlbumId && item.AlbumPrimaryImageTag) { url = apiClient.getScaledImageUrl(item.AlbumId, { - type: "Primary", + type: 'Primary', maxWidth: Math.round(dom.getScreenWidth() * 0.5), tag: item.AlbumPrimaryImageTag }); - shape = "square"; + shape = 'square'; } else if (item.SeriesId && item.SeriesPrimaryImageTag) { url = apiClient.getScaledImageUrl(item.SeriesId, { - type: "Primary", + type: 'Primary', maxWidth: Math.round(dom.getScreenWidth() * 0.5), tag: item.SeriesPrimaryImageTag }); } else if (item.ParentPrimaryImageItemId && item.ParentPrimaryImageTag) { url = apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId, { - type: "Primary", + type: 'Primary', maxWidth: Math.round(dom.getScreenWidth() * 0.5), tag: item.ParentPrimaryImageTag }); @@ -832,81 +819,81 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } if (editable) { - html += ""; + html += ''; } else if (!editable && url === undefined) { - html += ""; + html += ''; } - var progressHtml = item.IsFolder || !item.UserData ? "" : indicators.getProgressBarHtml(item); + var progressHtml = item.IsFolder || !item.UserData ? '' : indicators.getProgressBarHtml(item); html += '
'; if (progressHtml) { html += progressHtml; } - html += "
"; + html += ''; elem.innerHTML = html; if (detectRatio && item.PrimaryImageAspectRatio) { if (item.PrimaryImageAspectRatio >= 1.48) { - shape = "thumb"; + shape = 'thumb'; } else if (item.PrimaryImageAspectRatio >= 0.85 && item.PrimaryImageAspectRatio <= 1.34) { - shape = "square"; + shape = 'square'; } } - if ("thumb" == shape) { - elem.classList.add("thumbDetailImageContainer"); - elem.classList.remove("portraitDetailImageContainer"); - elem.classList.remove("squareDetailImageContainer"); - } else if ("square" == shape) { - elem.classList.remove("thumbDetailImageContainer"); - elem.classList.remove("portraitDetailImageContainer"); - elem.classList.add("squareDetailImageContainer"); + if ('thumb' == shape) { + elem.classList.add('thumbDetailImageContainer'); + elem.classList.remove('portraitDetailImageContainer'); + elem.classList.remove('squareDetailImageContainer'); + } else if ('square' == shape) { + elem.classList.remove('thumbDetailImageContainer'); + elem.classList.remove('portraitDetailImageContainer'); + elem.classList.add('squareDetailImageContainer'); } else { - elem.classList.remove("thumbDetailImageContainer"); - elem.classList.add("portraitDetailImageContainer"); - elem.classList.remove("squareDetailImageContainer"); + elem.classList.remove('thumbDetailImageContainer'); + elem.classList.add('portraitDetailImageContainer'); + elem.classList.remove('squareDetailImageContainer'); } if (url) { - imageLoader.lazyImage(elem.querySelector("img"), url); + imageLoader.lazyImage(elem.querySelector('img'), url); } } function renderImage(page, item, apiClient, user) { renderDetailImage( page, - page.querySelector(".detailImageContainer"), + page.querySelector('.detailImageContainer'), item, apiClient, - user.Policy.IsAdministrator && "Photo" != item.MediaType, + user.Policy.IsAdministrator && 'Photo' != item.MediaType, imageLoader, indicators ); } function refreshDetailImageUserData(elem, item) { - elem.querySelector(".detailImageProgressContainer").innerHTML = indicators.getProgressBarHtml(item); + elem.querySelector('.detailImageProgressContainer').innerHTML = indicators.getProgressBarHtml(item); } function refreshImage(page, item) { - refreshDetailImageUserData(page.querySelector(".detailImageContainer"), item); + refreshDetailImageUserData(page.querySelector('.detailImageContainer'), item); } function setPeopleHeader(page, item) { - if ("Audio" == item.MediaType || "MusicAlbum" == item.Type || "Book" == item.MediaType || "Photo" == item.MediaType) { - page.querySelector("#peopleHeader").innerHTML = globalize.translate("HeaderPeople"); + if ('Audio' == item.MediaType || 'MusicAlbum' == item.Type || 'Book' == item.MediaType || 'Photo' == item.MediaType) { + page.querySelector('#peopleHeader').innerHTML = globalize.translate('HeaderPeople'); } else { - page.querySelector("#peopleHeader").innerHTML = globalize.translate("HeaderCastAndCrew"); + page.querySelector('#peopleHeader').innerHTML = globalize.translate('HeaderCastAndCrew'); } } function renderNextUp(page, item, user) { - var section = page.querySelector(".nextUpSection"); + var section = page.querySelector('.nextUpSection'); - if ("Series" != item.Type) { - return void section.classList.add("hide"); + if ('Series' != item.Type) { + return void section.classList.add('hide'); } connectionManager.getApiClient(item.ServerId).getNextUpEpisodes({ @@ -914,93 +901,93 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti UserId: user.Id }).then(function (result) { if (result.Items.length) { - section.classList.remove("hide"); + section.classList.remove('hide'); } else { - section.classList.add("hide"); + section.classList.add('hide'); } var html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "overflowBackdrop", + shape: 'overflowBackdrop', showTitle: true, - displayAsSpecial: "Season" == item.Type && item.IndexNumber, + displayAsSpecial: 'Season' == item.Type && item.IndexNumber, overlayText: false, centerText: true, overlayPlayButton: true }); - var itemsContainer = section.querySelector(".nextUpItems"); + var itemsContainer = section.querySelector('.nextUpItems'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); }); } function setInitialCollapsibleState(page, item, apiClient, context, user) { - page.querySelector(".collectionItems").innerHTML = ""; + page.querySelector('.collectionItems').innerHTML = ''; - if ("Playlist" == item.Type) { - page.querySelector("#childrenCollapsible").classList.remove("hide"); + if ('Playlist' == item.Type) { + page.querySelector('#childrenCollapsible').classList.remove('hide'); renderPlaylistItems(page, item); - } else if ("Studio" == item.Type || "Person" == item.Type || "Genre" == item.Type || "MusicGenre" == item.Type || "MusicArtist" == item.Type) { - page.querySelector("#childrenCollapsible").classList.remove("hide"); + } else if ('Studio' == item.Type || 'Person' == item.Type || 'Genre' == item.Type || 'MusicGenre' == item.Type || 'MusicArtist' == item.Type) { + page.querySelector('#childrenCollapsible').classList.remove('hide'); renderItemsByName(page, item); } else if (item.IsFolder) { - if ("BoxSet" == item.Type) { - page.querySelector("#childrenCollapsible").classList.add("hide"); + if ('BoxSet' == item.Type) { + page.querySelector('#childrenCollapsible').classList.add('hide'); } renderChildren(page, item); } else { - page.querySelector("#childrenCollapsible").classList.add("hide"); + page.querySelector('#childrenCollapsible').classList.add('hide'); } - if ("Series" == item.Type) { + if ('Series' == item.Type) { renderSeriesSchedule(page, item); renderNextUp(page, item, user); } else { - page.querySelector(".nextUpSection").classList.add("hide"); + page.querySelector('.nextUpSection').classList.add('hide'); } renderScenes(page, item); - if (item.SpecialFeatureCount && 0 != item.SpecialFeatureCount && "Series" != item.Type) { - page.querySelector("#specialsCollapsible").classList.remove("hide"); + if (item.SpecialFeatureCount && 0 != item.SpecialFeatureCount && 'Series' != item.Type) { + page.querySelector('#specialsCollapsible').classList.remove('hide'); renderSpecials(page, item, user, 6); } else { - page.querySelector("#specialsCollapsible").classList.add("hide"); + page.querySelector('#specialsCollapsible').classList.add('hide'); } renderCast(page, item); if (item.PartCount && item.PartCount > 1) { - page.querySelector("#additionalPartsCollapsible").classList.remove("hide"); + page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); renderAdditionalParts(page, item, user); } else { - page.querySelector("#additionalPartsCollapsible").classList.add("hide"); + page.querySelector('#additionalPartsCollapsible').classList.add('hide'); } - if ("MusicAlbum" == item.Type) { + if ('MusicAlbum' == item.Type) { renderMusicVideos(page, item, user); } else { - page.querySelector("#musicVideosCollapsible").classList.add("hide"); + page.querySelector('#musicVideosCollapsible').classList.add('hide'); } } function renderOverview(elems, item) { for (var i = 0, length = elems.length; i < length; i++) { var elem = elems[i]; - var overview = item.Overview || ""; + var overview = item.Overview || ''; if (overview) { elem.innerHTML = overview; - elem.classList.remove("hide"); - var anchors = elem.querySelectorAll("a"); + elem.classList.remove('hide'); + var anchors = elem.querySelectorAll('a'); for (var j = 0, length2 = anchors.length; j < length2; j++) { - anchors[j].setAttribute("target", "_blank"); + anchors[j].setAttribute('target', '_blank'); } } else { - elem.innerHTML = ""; - elem.classList.add("hide"); + elem.innerHTML = ''; + elem.classList.add('hide'); } } } @@ -1011,12 +998,12 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti var genres = item.GenreItems || []; switch (context) { - case "music": - type = "MusicGenre"; + case 'music': + type = 'MusicGenre'; break; default: - type = "Genre"; + type = 'Genre'; } var html = genres.map(function (p) { @@ -1027,47 +1014,47 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti Id: p.Id }, { context: context - }) + '">' + p.Name + ""; - }).join(", "); + }) + '">' + p.Name + ''; + }).join(', '); - var genresLabel = page.querySelector(".genresLabel"); - genresLabel.innerHTML = globalize.translate(genres.length > 1 ? "Genres" : "Genre"); - var genresValue = page.querySelector(".genres"); + var genresLabel = page.querySelector('.genresLabel'); + genresLabel.innerHTML = globalize.translate(genres.length > 1 ? 'Genres' : 'Genre'); + var genresValue = page.querySelector('.genres'); genresValue.innerHTML = html; - var genresGroup = page.querySelector(".genresGroup"); + var genresGroup = page.querySelector('.genresGroup'); if (genres.length) { - genresGroup.classList.remove("hide"); + genresGroup.classList.remove('hide'); } else { - genresGroup.classList.add("hide"); + genresGroup.classList.add('hide'); } } function renderDirector(page, item, context) { var directors = (item.People || []).filter(function (p) { - return "Director" === p.Type; + return 'Director' === p.Type; }); var html = directors.map(function (p) { return '' + p.Name + ""; - }).join(", "); + }) + '">' + p.Name + ''; + }).join(', '); - var directorsLabel = page.querySelector(".directorsLabel"); - directorsLabel.innerHTML = globalize.translate(directors.length > 1 ? "Directors" : "Director"); - var directorsValue = page.querySelector(".directors"); + var directorsLabel = page.querySelector('.directorsLabel'); + directorsLabel.innerHTML = globalize.translate(directors.length > 1 ? 'Directors' : 'Director'); + var directorsValue = page.querySelector('.directors'); directorsValue.innerHTML = html; - var directorsGroup = page.querySelector(".directorsGroup"); + var directorsGroup = page.querySelector('.directorsGroup'); if (directors.length) { - directorsGroup.classList.remove("hide"); + directorsGroup.classList.remove('hide'); } else { - directorsGroup.classList.add("hide"); + directorsGroup.classList.add('hide'); } } @@ -1078,22 +1065,22 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti renderDirector(page, item, context); renderGenres(page, item, context); renderChannelGuide(page, apiClient, item); - var taglineElement = page.querySelector(".tagline"); + var taglineElement = page.querySelector('.tagline'); if (item.Taglines && item.Taglines.length) { - taglineElement.classList.remove("hide"); + taglineElement.classList.remove('hide'); taglineElement.innerHTML = item.Taglines[0]; } else { - taglineElement.classList.add("hide"); + taglineElement.classList.add('hide'); } - var overview = page.querySelector(".overview"); - var externalLinksElem = page.querySelector(".itemExternalLinks"); + var overview = page.querySelector('.overview'); + var externalLinksElem = page.querySelector('.itemExternalLinks'); renderOverview([overview], item); var i; var itemMiscInfo; - itemMiscInfo = page.querySelectorAll(".itemMiscInfo-primary"); + itemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary'); for (i = 0; i < itemMiscInfo.length; i++) { mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, { @@ -1102,24 +1089,24 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti subtitles: false }); - if (itemMiscInfo[i].innerHTML && "SeriesTimer" !== item.Type) { - itemMiscInfo[i].classList.remove("hide"); + if (itemMiscInfo[i].innerHTML && 'SeriesTimer' !== item.Type) { + itemMiscInfo[i].classList.remove('hide'); } else { - itemMiscInfo[i].classList.add("hide"); + itemMiscInfo[i].classList.add('hide'); } } - itemMiscInfo = page.querySelectorAll(".itemMiscInfo-secondary"); + itemMiscInfo = page.querySelectorAll('.itemMiscInfo-secondary'); for (i = 0; i < itemMiscInfo.length; i++) { mediaInfo.fillSecondaryMediaInfo(itemMiscInfo[i], item, { interactive: true }); - if (itemMiscInfo[i].innerHTML && "SeriesTimer" !== item.Type) { - itemMiscInfo[i].classList.remove("hide"); + if (itemMiscInfo[i].innerHTML && 'SeriesTimer' !== item.Type) { + itemMiscInfo[i].classList.remove('hide'); } else { - itemMiscInfo[i].classList.add("hide"); + itemMiscInfo[i].classList.add('hide'); } } @@ -1138,7 +1125,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti scrollX = enableScrollX(); } - return scrollX ? "overflowPortrait" : "portrait"; + return scrollX ? 'overflowPortrait' : 'portrait'; } function getSquareShape(scrollX) { @@ -1146,35 +1133,35 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti scrollX = enableScrollX(); } - return scrollX ? "overflowSquare" : "square"; + return scrollX ? 'overflowSquare' : 'square'; } function renderMoreFromSeason(view, item, apiClient) { - var section = view.querySelector(".moreFromSeasonSection"); + var section = view.querySelector('.moreFromSeasonSection'); if (section) { - if ("Episode" !== item.Type || !item.SeasonId || !item.SeriesId) { - return void section.classList.add("hide"); + if ('Episode' !== item.Type || !item.SeasonId || !item.SeriesId) { + return void section.classList.add('hide'); } var userId = apiClient.getCurrentUserId(); apiClient.getEpisodes(item.SeriesId, { SeasonId: item.SeasonId, UserId: userId, - Fields: "ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount" + Fields: 'ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount' }).then(function (result) { if (result.Items.length < 2) { - return void section.classList.add("hide"); + return void section.classList.add('hide'); } - section.classList.remove("hide"); - section.querySelector("h2").innerHTML = globalize.translate("MoreFromValue", item.SeasonName); - var itemsContainer = section.querySelector(".itemsContainer"); + section.classList.remove('hide'); + section.querySelector('h2').innerHTML = globalize.translate('MoreFromValue', item.SeasonName); + var itemsContainer = section.querySelector('.itemsContainer'); cardBuilder.buildCards(result.Items, { parentContainer: section, itemsContainer: itemsContainer, - shape: "autooverflow", - sectionTitleTagName: "h2", + shape: 'autooverflow', + sectionTitleTagName: 'h2', scalable: true, showTitle: true, overlayText: false, @@ -1186,7 +1173,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti if (card) { setTimeout(function () { - section.querySelector(".emby-scroller").toStart(card.previousSibling || card, true); + section.querySelector('.emby-scroller').toStart(card.previousSibling || card, true); }, 100); } }); @@ -1194,28 +1181,28 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function renderMoreFromArtist(view, item, apiClient) { - var section = view.querySelector(".moreFromArtistSection"); + var section = view.querySelector('.moreFromArtistSection'); if (section) { - if ("MusicArtist" === item.Type) { - if (!apiClient.isMinServerVersion("3.4.1.19")) { - return void section.classList.add("hide"); + if ('MusicArtist' === item.Type) { + if (!apiClient.isMinServerVersion('3.4.1.19')) { + return void section.classList.add('hide'); } - } else if ("MusicAlbum" !== item.Type || !item.AlbumArtists || !item.AlbumArtists.length) { - return void section.classList.add("hide"); + } else if ('MusicAlbum' !== item.Type || !item.AlbumArtists || !item.AlbumArtists.length) { + return void section.classList.add('hide'); } var query = { - IncludeItemTypes: "MusicAlbum", + IncludeItemTypes: 'MusicAlbum', Recursive: true, ExcludeItemIds: item.Id, - SortBy: "ProductionYear,SortName", - SortOrder: "Descending" + SortBy: 'ProductionYear,SortName', + SortOrder: 'Descending' }; - if ("MusicArtist" === item.Type) { + if ('MusicArtist' === item.Type) { query.ContributingArtistIds = item.Id; - } else if (apiClient.isMinServerVersion("3.4.1.18")) { + } else if (apiClient.isMinServerVersion('3.4.1.18')) { query.AlbumArtistIds = item.AlbumArtists[0].Id; } else { query.ArtistIds = item.AlbumArtists[0].Id; @@ -1223,24 +1210,24 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti apiClient.getItems(apiClient.getCurrentUserId(), query).then(function (result) { if (!result.Items.length) { - return void section.classList.add("hide"); + return void section.classList.add('hide'); } - section.classList.remove("hide"); + section.classList.remove('hide'); - if ("MusicArtist" === item.Type) { - section.querySelector("h2").innerHTML = globalize.translate("HeaderAppearsOn"); + if ('MusicArtist' === item.Type) { + section.querySelector('h2').innerHTML = globalize.translate('HeaderAppearsOn'); } else { - section.querySelector("h2").innerHTML = globalize.translate("MoreFromValue", item.AlbumArtists[0].Name); + section.querySelector('h2').innerHTML = globalize.translate('MoreFromValue', item.AlbumArtists[0].Name); } cardBuilder.buildCards(result.Items, { parentContainer: section, - itemsContainer: section.querySelector(".itemsContainer"), - shape: "autooverflow", - sectionTitleTagName: "h2", + itemsContainer: section.querySelector('.itemsContainer'), + shape: 'autooverflow', + sectionTitleTagName: 'h2', scalable: true, - coverImage: "MusicArtist" === item.Type || "MusicAlbum" === item.Type, + coverImage: 'MusicArtist' === item.Type || 'MusicAlbum' === item.Type, showTitle: true, showParentTitle: false, centerText: true, @@ -1253,47 +1240,47 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function renderSimilarItems(page, item, context) { - var similarCollapsible = page.querySelector("#similarCollapsible"); + var similarCollapsible = page.querySelector('#similarCollapsible'); if (similarCollapsible) { - if ("Movie" != item.Type && "Trailer" != item.Type && "Series" != item.Type && "Program" != item.Type && "Recording" != item.Type && "MusicAlbum" != item.Type && "MusicArtist" != item.Type && "Playlist" != item.Type) { - return void similarCollapsible.classList.add("hide"); + if ('Movie' != item.Type && 'Trailer' != item.Type && 'Series' != item.Type && 'Program' != item.Type && 'Recording' != item.Type && 'MusicAlbum' != item.Type && 'MusicArtist' != item.Type && 'Playlist' != item.Type) { + return void similarCollapsible.classList.add('hide'); } - similarCollapsible.classList.remove("hide"); + similarCollapsible.classList.remove('hide'); var apiClient = connectionManager.getApiClient(item.ServerId); var options = { userId: apiClient.getCurrentUserId(), limit: 12, - fields: "PrimaryImageAspectRatio,UserData,CanDelete" + fields: 'PrimaryImageAspectRatio,UserData,CanDelete' }; - if ("MusicAlbum" == item.Type && item.AlbumArtists && item.AlbumArtists.length) { + if ('MusicAlbum' == item.Type && item.AlbumArtists && item.AlbumArtists.length) { options.ExcludeArtistIds = item.AlbumArtists[0].Id; } apiClient.getSimilarItems(item.Id, options).then(function (result) { if (!result.Items.length) { - return void similarCollapsible.classList.add("hide"); + return void similarCollapsible.classList.add('hide'); } - similarCollapsible.classList.remove("hide"); - var html = ""; + similarCollapsible.classList.remove('hide'); + var html = ''; html += cardBuilder.getCardsHtml({ items: result.Items, - shape: "autooverflow", - showParentTitle: "MusicAlbum" == item.Type, + shape: 'autooverflow', + showParentTitle: 'MusicAlbum' == item.Type, centerText: true, showTitle: true, context: context, lazy: true, showDetailsMenu: true, - coverImage: "MusicAlbum" == item.Type || "MusicArtist" == item.Type, + coverImage: 'MusicAlbum' == item.Type || 'MusicArtist' == item.Type, overlayPlayButton: true, overlayText: false, - showYear: "Movie" === item.Type || "Trailer" === item.Type || "Series" === item.Type + showYear: 'Movie' === item.Type || 'Trailer' === item.Type || 'Series' === item.Type }); - var similarContent = similarCollapsible.querySelector(".similarContent"); + var similarContent = similarCollapsible.querySelector('.similarContent'); similarContent.innerHTML = html; imageLoader.lazyChildren(similarContent); }); @@ -1301,52 +1288,52 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function renderSeriesAirTime(page, item, isStatic) { - var seriesAirTime = page.querySelector("#seriesAirTime"); - if ("Series" != item.Type) { - seriesAirTime.classList.add("hide"); + var seriesAirTime = page.querySelector('#seriesAirTime'); + if ('Series' != item.Type) { + seriesAirTime.classList.add('hide'); return; } - var html = ""; + var html = ''; if (item.AirDays && item.AirDays.length) { if (7 == item.AirDays.length) { - html += "daily"; + html += 'daily'; } else { html += item.AirDays.map(function (a) { - return a + "s"; - }).join(","); + return a + 's'; + }).join(','); } } if (item.AirTime) { - html += " at " + item.AirTime; + html += ' at ' + item.AirTime; } if (item.Studios.length) { if (isStatic) { - html += " on " + item.Studios[0].Name; + html += ' on ' + item.Studios[0].Name; } else { var context = inferContext(item); var href = appRouter.getRouteUrl(item.Studios[0], { context: context, - itemType: "Studio", + itemType: 'Studio', serverId: item.ServerId }); - html += ' on ' + item.Studios[0].Name + ""; + html += ' on ' + item.Studios[0].Name + ''; } } if (html) { - html = ("Ended" == item.Status ? "Aired " : "Airs ") + html; + html = ('Ended' == item.Status ? 'Aired ' : 'Airs ') + html; seriesAirTime.innerHTML = html; - seriesAirTime.classList.remove("hide"); + seriesAirTime.classList.remove('hide'); } else { - seriesAirTime.classList.add("hide"); + seriesAirTime.classList.add('hide'); } } function renderTags(page, item) { - var itemTags = page.querySelector(".itemTags"); + var itemTags = page.querySelector('.itemTags'); var tagElements = []; var tags = item.Tags || []; - if ("Program" === item.Type) { + if ('Program' === item.Type) { tags = []; } @@ -1355,93 +1342,93 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } if (tagElements.length) { - itemTags.innerHTML = globalize.translate("TagsValue", tagElements.join(", ")); - itemTags.classList.remove("hide"); + itemTags.innerHTML = globalize.translate('TagsValue', tagElements.join(', ')); + itemTags.classList.remove('hide'); } else { - itemTags.innerHTML = ""; - itemTags.classList.add("hide"); + itemTags.innerHTML = ''; + itemTags.classList.add('hide'); } } function renderChildren(page, item) { - var fields = "ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount"; + var fields = 'ItemCounts,PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount'; var query = { ParentId: item.Id, Fields: fields }; - if ("BoxSet" !== item.Type) { - query.SortBy = "SortName"; + if ('BoxSet' !== item.Type) { + query.SortBy = 'SortName'; } var promise; var apiClient = connectionManager.getApiClient(item.ServerId); var userId = apiClient.getCurrentUserId(); - if ("Series" == item.Type) { + if ('Series' == item.Type) { promise = apiClient.getSeasons(item.Id, { userId: userId, Fields: fields }); - } else if ("Season" == item.Type) { - fields += ",Overview"; + } else if ('Season' == item.Type) { + fields += ',Overview'; promise = apiClient.getEpisodes(item.SeriesId, { seasonId: item.Id, userId: userId, Fields: fields }); - } else if ("MusicArtist" == item.Type) { - query.SortBy = "ProductionYear,SortName"; + } else if ('MusicArtist' == item.Type) { + query.SortBy = 'ProductionYear,SortName'; } promise = promise || apiClient.getItems(apiClient.getCurrentUserId(), query); promise.then(function (result) { - var html = ""; + var html = ''; var scrollX = false; var isList = false; - var childrenItemsContainer = page.querySelector(".childrenItemsContainer"); + var childrenItemsContainer = page.querySelector('.childrenItemsContainer'); - if ("MusicAlbum" == item.Type) { + if ('MusicAlbum' == item.Type) { html = listView.getListViewHtml({ items: result.Items, smallIcon: true, showIndex: true, - index: "disc", + index: 'disc', showIndexNumberLeft: true, playFromHere: true, - action: "playallfromhere", + action: 'playallfromhere', image: false, - artist: "auto", + artist: 'auto', containerAlbumArtists: item.AlbumArtists, addToListButton: true }); isList = true; - } else if ("Series" == item.Type) { + } else if ('Series' == item.Type) { scrollX = enableScrollX(); html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "overflowPortrait", + shape: 'overflowPortrait', showTitle: true, centerText: true, lazy: true, overlayPlayButton: true, allowBottomPadding: !scrollX }); - } else if ("Season" == item.Type || "Episode" == item.Type) { - if ("Episode" !== item.Type) { + } else if ('Season' == item.Type || 'Episode' == item.Type) { + if ('Episode' !== item.Type) { isList = true; } - scrollX = "Episode" == item.Type; - if (result.Items.length < 2 && "Episode" === item.Type) { + scrollX = 'Episode' == item.Type; + if (result.Items.length < 2 && 'Episode' === item.Type) { return; } - if ("Episode" === item.Type) { + if ('Episode' === item.Type) { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "overflowBackdrop", + shape: 'overflowBackdrop', showTitle: true, - displayAsSpecial: "Season" == item.Type && item.IndexNumber, + displayAsSpecial: 'Season' == item.Type && item.IndexNumber, playFromHere: true, overlayText: true, lazy: true, @@ -1450,15 +1437,15 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti allowBottomPadding: !scrollX, includeParentInfoInTitle: false }); - } else if ("Season" === item.Type) { + } else if ('Season' === item.Type) { html = listView.getListViewHtml({ items: result.Items, showIndexNumber: false, enableOverview: true, - imageSize: "large", + imageSize: 'large', enableSideMediaInfo: false, highlight: false, - action: layoutManager.tv ? "resume" : "none", + action: layoutManager.tv ? 'resume' : 'none', infoButton: true, imagePlayButton: true, includeParentInfoInTitle: false @@ -1466,78 +1453,78 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } } - if ("BoxSet" !== item.Type) { - page.querySelector("#childrenCollapsible").classList.remove("hide"); + if ('BoxSet' !== item.Type) { + page.querySelector('#childrenCollapsible').classList.remove('hide'); } if (scrollX) { - childrenItemsContainer.classList.add("scrollX"); - childrenItemsContainer.classList.add("hiddenScrollX"); - childrenItemsContainer.classList.remove("vertical-wrap"); - childrenItemsContainer.classList.remove("vertical-list"); + childrenItemsContainer.classList.add('scrollX'); + childrenItemsContainer.classList.add('hiddenScrollX'); + childrenItemsContainer.classList.remove('vertical-wrap'); + childrenItemsContainer.classList.remove('vertical-list'); } else { - childrenItemsContainer.classList.remove("scrollX"); - childrenItemsContainer.classList.remove("hiddenScrollX"); - childrenItemsContainer.classList.remove("smoothScrollX"); + childrenItemsContainer.classList.remove('scrollX'); + childrenItemsContainer.classList.remove('hiddenScrollX'); + childrenItemsContainer.classList.remove('smoothScrollX'); if (isList) { - childrenItemsContainer.classList.add("vertical-list"); - childrenItemsContainer.classList.remove("vertical-wrap"); + childrenItemsContainer.classList.add('vertical-list'); + childrenItemsContainer.classList.remove('vertical-wrap'); } else { - childrenItemsContainer.classList.add("vertical-wrap"); - childrenItemsContainer.classList.remove("vertical-list"); + childrenItemsContainer.classList.add('vertical-wrap'); + childrenItemsContainer.classList.remove('vertical-list'); } } childrenItemsContainer.innerHTML = html; imageLoader.lazyChildren(childrenItemsContainer); - if ("BoxSet" == item.Type) { + if ('BoxSet' == item.Type) { var collectionItemTypes = [{ - name: globalize.translate("HeaderVideos"), - mediaType: "Video" + name: globalize.translate('HeaderVideos'), + mediaType: 'Video' }, { - name: globalize.translate("HeaderSeries"), - type: "Series" + name: globalize.translate('HeaderSeries'), + type: 'Series' }, { - name: globalize.translate("HeaderAlbums"), - type: "MusicAlbum" + name: globalize.translate('HeaderAlbums'), + type: 'MusicAlbum' }, { - name: globalize.translate("HeaderBooks"), - type: "Book" + name: globalize.translate('HeaderBooks'), + type: 'Book' }]; renderCollectionItems(page, item, collectionItemTypes, result.Items); } }); - if ("Season" == item.Type) { - page.querySelector("#childrenTitle").innerHTML = globalize.translate("HeaderEpisodes"); - } else if ("Series" == item.Type) { - page.querySelector("#childrenTitle").innerHTML = globalize.translate("HeaderSeasons"); - } else if ("MusicAlbum" == item.Type) { - page.querySelector("#childrenTitle").innerHTML = globalize.translate("HeaderTracks"); + if ('Season' == item.Type) { + page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderEpisodes'); + } else if ('Series' == item.Type) { + page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderSeasons'); + } else if ('MusicAlbum' == item.Type) { + page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderTracks'); } else { - page.querySelector("#childrenTitle").innerHTML = globalize.translate("HeaderItems"); + page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderItems'); } - if ("MusicAlbum" == item.Type || "Season" == item.Type) { - page.querySelector(".childrenSectionHeader").classList.add("hide"); - page.querySelector("#childrenCollapsible").classList.add("verticalSection-extrabottompadding"); + if ('MusicAlbum' == item.Type || 'Season' == item.Type) { + page.querySelector('.childrenSectionHeader').classList.add('hide'); + page.querySelector('#childrenCollapsible').classList.add('verticalSection-extrabottompadding'); } else { - page.querySelector(".childrenSectionHeader").classList.remove("hide"); + page.querySelector('.childrenSectionHeader').classList.remove('hide'); } } function renderItemsByName(page, item) { - require("scripts/itembynamedetailpage".split(","), function () { + require('scripts/itembynamedetailpage'.split(','), function () { window.ItemsByName.renderItems(page, item); }); } function renderPlaylistItems(page, item) { - require("scripts/playlistedit".split(","), function () { + require('scripts/playlistedit'.split(','), function () { PlaylistViewer.render(page, item); }); } function renderProgramsForChannel(page, result) { - var html = ""; + var html = ''; var currentItems = []; var currentStartDate = null; @@ -1549,10 +1536,10 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti if (currentItems.length) { html += '
'; html += '

' + datetime.toLocaleDateString(currentStartDate, { - weekday: "long", - month: "long", - day: "numeric" - }) + "

"; + weekday: 'long', + month: 'long', + day: 'numeric' + }) + ''; html += '
' + listView.getListViewHtml({ items: currentItems, enableUserDataButtons: false, @@ -1561,7 +1548,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti showProgramTime: true, mediaInfo: false, parentTitleWithTitle: true - }) + "
"; + }) + ''; } currentStartDate = itemStartDate; @@ -1574,10 +1561,10 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti if (currentItems.length) { html += '
'; html += '

' + datetime.toLocaleDateString(currentStartDate, { - weekday: "long", - month: "long", - day: "numeric" - }) + "

"; + weekday: 'long', + month: 'long', + day: 'numeric' + }) + ''; html += '
' + listView.getListViewHtml({ items: currentItems, enableUserDataButtons: false, @@ -1586,20 +1573,20 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti showProgramTime: true, mediaInfo: false, parentTitleWithTitle: true - }) + "
"; + }) + ''; } - page.querySelector(".programGuide").innerHTML = html; + page.querySelector('.programGuide').innerHTML = html; } function renderChannelGuide(page, apiClient, item) { - if ("TvChannel" === item.Type) { - page.querySelector(".programGuideSection").classList.remove("hide"); + if ('TvChannel' === item.Type) { + page.querySelector('.programGuideSection').classList.remove('hide'); apiClient.getLiveTvPrograms({ ChannelIds: item.Id, UserId: apiClient.getCurrentUserId(), HasAired: false, - SortBy: "StartDate", + SortBy: 'StartDate', EnableTotalRecordCount: false, EnableImages: false, ImageTypeLimit: 0, @@ -1615,7 +1602,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti apiClient.getLiveTvPrograms({ UserId: apiClient.getCurrentUserId(), HasAired: false, - SortBy: "StartDate", + SortBy: 'StartDate', EnableTotalRecordCount: false, EnableImages: false, ImageTypeLimit: 0, @@ -1624,12 +1611,12 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti LibrarySeriesId: item.Id }).then(function (result) { if (result.Items.length) { - page.querySelector("#seriesScheduleSection").classList.remove("hide"); + page.querySelector('#seriesScheduleSection').classList.remove('hide'); } else { - page.querySelector("#seriesScheduleSection").classList.add("hide"); + page.querySelector('#seriesScheduleSection').classList.add('hide'); } - page.querySelector("#seriesScheduleList").innerHTML = listView.getListViewHtml({ + page.querySelector('#seriesScheduleList').innerHTML = listView.getListViewHtml({ items: result.Items, enableUserDataButtons: false, showParentTitle: false, @@ -1638,27 +1625,27 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti mediaInfo: false, showTitle: true, moreButton: false, - action: "programdialog" + action: 'programdialog' }); loading.hide(); }); } function inferContext(item) { - if ("Movie" === item.Type || "BoxSet" === item.Type) { - return "movies"; + if ('Movie' === item.Type || 'BoxSet' === item.Type) { + return 'movies'; } - if ("Series" === item.Type || "Season" === item.Type || "Episode" === item.Type) { - return "tvshows"; + if ('Series' === item.Type || 'Season' === item.Type || 'Episode' === item.Type) { + return 'tvshows'; } - if ("MusicArtist" === item.Type || "MusicAlbum" === item.Type || "Audio" === item.Type || "AudioBook" === item.Type) { - return "music"; + if ('MusicArtist' === item.Type || 'MusicAlbum' === item.Type || 'Audio' === item.Type || 'AudioBook' === item.Type) { + return 'music'; } - if ("Program" === item.Type) { - return "livetv"; + if ('Program' === item.Type) { + return 'livetv'; } return null; @@ -1687,7 +1674,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function renderCollectionItems(page, parentItem, types, items) { - page.querySelector(".collectionItems").innerHTML = ""; + page.querySelector('.collectionItems').innerHTML = ''; var i; var length; @@ -1701,7 +1688,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } var otherType = { - name: globalize.translate("HeaderOtherItems") + name: globalize.translate('HeaderOtherItems') }; var otherTypeItems = items.filter(function (curr) { return !types.filter(function (t) { @@ -1715,11 +1702,11 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti if (!items.length) { renderCollectionItemType(page, parentItem, { - name: globalize.translate("HeaderItems") + name: globalize.translate('HeaderItems') }, items); } - var containers = page.querySelectorAll(".collectionItemsContainer"); + var containers = page.querySelectorAll('.collectionItemsContainer'); var notifyRefreshNeeded = function () { renderChildren(page, parentItem); @@ -1731,33 +1718,33 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti // if nothing in the collection can be played hide play and shuffle buttons if (!canPlaySomeItemInCollection(items)) { - hideAll(page, "btnPlay", false); - hideAll(page, "btnShuffle", false); + hideAll(page, 'btnPlay', false); + hideAll(page, 'btnShuffle', false); } // HACK: Call autoFocuser again because btnPlay may be hidden, but focused by reloadFromItem // FIXME: Sometimes focus does not move until all (?) sections are loaded - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); } function renderCollectionItemType(page, parentItem, type, items) { - var html = ""; + var html = ''; html += '
'; html += '
'; html += '

'; - html += "" + type.name + ""; - html += "

"; - html += ''; - html += "
"; + html += '' + type.name + ''; + html += ''; + html += ''; + html += '
'; html += '
'; - var shape = "MusicAlbum" == type.type ? getSquareShape(false) : getPortraitShape(false); + var shape = 'MusicAlbum' == type.type ? getSquareShape(false) : getPortraitShape(false); html += cardBuilder.getCardsHtml({ items: items, shape: shape, showTitle: true, - showYear: "Video" === type.mediaType || "Series" === type.type, + showYear: 'Video' === type.mediaType || 'Series' === type.type, centerText: true, lazy: true, showDetailsMenu: true, @@ -1766,16 +1753,16 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti showRemoveFromCollection: true, collectionId: parentItem.Id }); - html += "
"; - html += ""; - var collectionItems = page.querySelector(".collectionItems"); - collectionItems.insertAdjacentHTML("beforeend", html); + html += ''; + html += ''; + var collectionItems = page.querySelector('.collectionItems'); + collectionItems.insertAdjacentHTML('beforeend', html); imageLoader.lazyChildren(collectionItems); - collectionItems.querySelector(".btnAddToCollection").addEventListener("click", function () { - require(["alert"], function (alert) { + collectionItems.querySelector('.btnAddToCollection').addEventListener('click', function () { + require(['alert'], function (alert) { alert({ - text: globalize.translate("AddItemToCollectionHelp"), - html: globalize.translate("AddItemToCollectionHelp") + '

' + globalize.translate("ButtonLearnMore") + "" + text: globalize.translate('AddItemToCollectionHelp'), + html: globalize.translate('AddItemToCollectionHelp') + '

' + globalize.translate('ButtonLearnMore') + '' }); }); }); @@ -1783,20 +1770,20 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function renderMusicVideos(page, item, user) { connectionManager.getApiClient(item.ServerId).getItems(user.Id, { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "MusicVideo", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'MusicVideo', Recursive: true, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo,CanDelete,MediaSourceCount', AlbumIds: item.Id }).then(function (result) { if (result.Items.length) { - page.querySelector("#musicVideosCollapsible").classList.remove("hide"); - var musicVideosContent = page.querySelector(".musicVideosContent"); + page.querySelector('#musicVideosCollapsible').classList.remove('hide'); + var musicVideosContent = page.querySelector('.musicVideosContent'); musicVideosContent.innerHTML = getVideosHtml(result.Items, user); imageLoader.lazyChildren(musicVideosContent); } else { - page.querySelector("#musicVideosCollapsible").classList.add("hide"); + page.querySelector('#musicVideosCollapsible').classList.add('hide'); } }); } @@ -1804,12 +1791,12 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function renderAdditionalParts(page, item, user) { connectionManager.getApiClient(item.ServerId).getAdditionalVideoParts(user.Id, item.Id).then(function (result) { if (result.Items.length) { - page.querySelector("#additionalPartsCollapsible").classList.remove("hide"); - var additionalPartsContent = page.querySelector("#additionalPartsContent"); + page.querySelector('#additionalPartsCollapsible').classList.remove('hide'); + var additionalPartsContent = page.querySelector('#additionalPartsContent'); additionalPartsContent.innerHTML = getVideosHtml(result.Items, user); imageLoader.lazyChildren(additionalPartsContent); } else { - page.querySelector("#additionalPartsCollapsible").classList.add("hide"); + page.querySelector('#additionalPartsCollapsible').classList.add('hide'); } }); } @@ -1818,34 +1805,34 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti var chapters = item.Chapters || []; if (chapters.length && !chapters[0].ImageTag && (chapters = []), chapters.length) { - page.querySelector("#scenesCollapsible").classList.remove("hide"); - var scenesContent = page.querySelector("#scenesContent"); + page.querySelector('#scenesCollapsible').classList.remove('hide'); + var scenesContent = page.querySelector('#scenesContent'); - require(["chaptercardbuilder"], function (chaptercardbuilder) { + require(['chaptercardbuilder'], function (chaptercardbuilder) { chaptercardbuilder.buildChapterCards(item, chapters, { itemsContainer: scenesContent, - backdropShape: "overflowBackdrop", - squareShape: "overflowSquare" + backdropShape: 'overflowBackdrop', + squareShape: 'overflowSquare' }); }); } else { - page.querySelector("#scenesCollapsible").classList.add("hide"); + page.querySelector('#scenesCollapsible').classList.add('hide'); } } function getVideosHtml(items, user, limit, moreButtonClass) { var html = cardBuilder.getCardsHtml({ items: items, - shape: "auto", + shape: 'auto', showTitle: true, - action: "play", + action: 'play', overlayText: false, centerText: true, showRuntime: true }); if (limit && items.length > limit) { - html += '

"; + html += '

'; } return html; @@ -1853,30 +1840,30 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function renderSpecials(page, item, user, limit) { connectionManager.getApiClient(item.ServerId).getSpecialFeatures(user.Id, item.Id).then(function (specials) { - var specialsContent = page.querySelector("#specialsContent"); - specialsContent.innerHTML = getVideosHtml(specials, user, limit, "moreSpecials"); + var specialsContent = page.querySelector('#specialsContent'); + specialsContent.innerHTML = getVideosHtml(specials, user, limit, 'moreSpecials'); imageLoader.lazyChildren(specialsContent); }); } function renderCast(page, item) { var people = (item.People || []).filter(function (p) { - return "Director" !== p.Type; + return 'Director' !== p.Type; }); if (!people.length) { - return void page.querySelector("#castCollapsible").classList.add("hide"); + return void page.querySelector('#castCollapsible').classList.add('hide'); } - page.querySelector("#castCollapsible").classList.remove("hide"); - var castContent = page.querySelector("#castContent"); + page.querySelector('#castCollapsible').classList.remove('hide'); + var castContent = page.querySelector('#castContent'); - require(["peoplecardbuilder"], function (peoplecardbuilder) { + require(['peoplecardbuilder'], function (peoplecardbuilder) { peoplecardbuilder.buildPeopleCards(people, { itemsContainer: castContent, coverImage: true, serverId: item.ServerId, - shape: "overflowPortrait" + shape: 'overflowPortrait' }); }); } @@ -1918,12 +1905,12 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function splitVersions(instance, page, apiClient, params) { - require(["confirm"], function (confirm) { - confirm("Are you sure you wish to split the media sources into separate items?", "Split Media Apart").then(function () { + require(['confirm'], function (confirm) { + confirm('Are you sure you wish to split the media sources into separate items?', 'Split Media Apart').then(function () { loading.show(); apiClient.ajax({ - type: "DELETE", - url: apiClient.getUrl("Videos/" + params.id + "/AlternateSources") + type: 'DELETE', + url: apiClient.getUrl('Videos/' + params.id + '/AlternateSources') }).then(function () { loading.hide(); reload(instance, page, params); @@ -1933,12 +1920,12 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function getPlayOptions(startPosition) { - var audioStreamIndex = view.querySelector(".selectAudio").value || null; + var audioStreamIndex = view.querySelector('.selectAudio').value || null; return { startPositionTicks: startPosition, - mediaSourceId: view.querySelector(".selectSource").value, + mediaSourceId: view.querySelector('.selectSource').value, audioStreamIndex: audioStreamIndex, - subtitleStreamIndex: view.querySelector(".selectSubtitles").value + subtitleStreamIndex: view.querySelector('.selectSubtitles').value }; } @@ -1955,7 +1942,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function playCurrentItem(button, mode) { var item = currentItem; - if ("Program" === item.Type) { + if ('Program' === item.Type) { var apiClient = connectionManager.getApiClient(item.ServerId); return void apiClient.getLiveTvChannel(item.ChannelId, apiClient.getCurrentUserId()).then(function (channel) { playbackManager.play({ @@ -1964,11 +1951,11 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti }); } - playItem(item, item.UserData && "resume" === mode ? item.UserData.PlaybackPositionTicks : 0); + playItem(item, item.UserData && 'resume' === mode ? item.UserData.PlaybackPositionTicks : 0); } function onPlayClick() { - playCurrentItem(this, this.getAttribute("data-mode")); + playCurrentItem(this, this.getAttribute('data-mode')); } function onInstantMixClick() { @@ -1980,7 +1967,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function onDeleteClick() { - require(["deleteHelper"], function (deleteHelper) { + require(['deleteHelper'], function (deleteHelper) { deleteHelper.deleteItem({ item: currentItem, navigate: true @@ -1989,15 +1976,15 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti } function onCancelSeriesTimerClick() { - require(["recordingHelper"], function (recordingHelper) { + require(['recordingHelper'], function (recordingHelper) { recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () { - Dashboard.navigate("livetv.html"); + Dashboard.navigate('livetv.html'); }); }); } function onCancelTimerClick() { - require(["recordingHelper"], function (recordingHelper) { + require(['recordingHelper'], function (recordingHelper) { recordingHelper.cancelTimer(connectionManager.getApiClient(currentItem.ServerId), currentItem.TimerId).then(function () { reload(self, view, params); }); @@ -2039,7 +2026,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function editImages() { return new Promise(function (resolve, reject) { - require(["imageEditor"], function (imageEditor) { + require(['imageEditor'], function (imageEditor) { imageEditor.show({ itemId: currentItem.Id, serverId: currentItem.ServerId @@ -2051,7 +2038,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti function onWebSocketMessage(e, data) { var msg = data; - if ("UserDataChanged" === msg.MessageType && currentItem && msg.Data.UserId == apiClient.getCurrentUserId()) { + if ('UserDataChanged' === msg.MessageType && currentItem && msg.Data.UserId == apiClient.getCurrentUserId()) { var key = currentItem.UserData.Key; var userData = msg.Data.UserDataList.filter(function (u) { return u.Key == key; @@ -2068,46 +2055,45 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti var currentItem; var self = this; var apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient; - view.querySelectorAll(".btnPlay"); - bindAll(view, ".btnPlay", "click", onPlayClick); - bindAll(view, ".btnResume", "click", onPlayClick); - bindAll(view, ".btnInstantMix", "click", onInstantMixClick); - bindAll(view, ".btnShuffle", "click", onShuffleClick); - bindAll(view, ".btnPlayTrailer", "click", onPlayTrailerClick); - bindAll(view, ".btnCancelSeriesTimer", "click", onCancelSeriesTimerClick); - bindAll(view, ".btnCancelTimer", "click", onCancelTimerClick); - bindAll(view, ".btnDeleteItem", "click", onDeleteClick); - bindAll(view, ".btnDownload", "click", onDownloadClick); - view.querySelector(".btnMoreCommands i").innerHTML = ""; - view.querySelector(".trackSelections").addEventListener("submit", onTrackSelectionsSubmit); - view.querySelector(".btnSplitVersions").addEventListener("click", function () { + view.querySelectorAll('.btnPlay'); + bindAll(view, '.btnPlay', 'click', onPlayClick); + bindAll(view, '.btnResume', 'click', onPlayClick); + bindAll(view, '.btnInstantMix', 'click', onInstantMixClick); + bindAll(view, '.btnShuffle', 'click', onShuffleClick); + bindAll(view, '.btnPlayTrailer', 'click', onPlayTrailerClick); + bindAll(view, '.btnCancelSeriesTimer', 'click', onCancelSeriesTimerClick); + bindAll(view, '.btnCancelTimer', 'click', onCancelTimerClick); + bindAll(view, '.btnDeleteItem', 'click', onDeleteClick); + bindAll(view, '.btnDownload', 'click', onDownloadClick); + view.querySelector('.trackSelections').addEventListener('submit', onTrackSelectionsSubmit); + view.querySelector('.btnSplitVersions').addEventListener('click', function () { splitVersions(self, view, apiClient, params); }); - bindAll(view, ".btnMoreCommands", "click", onMoreCommandsClick); - view.querySelector(".selectSource").addEventListener("change", function () { + bindAll(view, '.btnMoreCommands', 'click', onMoreCommandsClick); + view.querySelector('.selectSource').addEventListener('change', function () { renderVideoSelections(view, self._currentPlaybackMediaSources); renderAudioSelections(view, self._currentPlaybackMediaSources); renderSubtitleSelections(view, self._currentPlaybackMediaSources); }); - view.addEventListener("click", function (e) { - if (dom.parentWithClass(e.target, "moreScenes")) { + view.addEventListener('click', function (e) { + if (dom.parentWithClass(e.target, 'moreScenes')) { renderScenes(view, currentItem); - } else if (dom.parentWithClass(e.target, "morePeople")) { + } else if (dom.parentWithClass(e.target, 'morePeople')) { renderCast(view, currentItem); - } else if (dom.parentWithClass(e.target, "moreSpecials")) { + } else if (dom.parentWithClass(e.target, 'moreSpecials')) { apiClient.getCurrentUser().then(function (user) { renderSpecials(view, currentItem, user); }); } }); - view.querySelector(".detailImageContainer").addEventListener("click", function (e) { - if (dom.parentWithClass(e.target, "itemDetailGalleryLink")) { + view.querySelector('.detailImageContainer').addEventListener('click', function (e) { + if (dom.parentWithClass(e.target, 'itemDetailGalleryLink')) { editImages().then(function () { reload(self, view, params); }); } }); - view.addEventListener("viewshow", function (e) { + view.addEventListener('viewshow', function (e) { var page = this; if (layoutManager.mobile) { @@ -2116,22 +2102,22 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti if (e.detail.isRestored) { if (currentItem) { - setTitle(currentItem, connectionManager.getApiClient(currentItem.ServerId)); + Emby.Page.setTitle(''); renderTrackSelections(page, self, currentItem, true); } } else { reload(self, page, params); } - events.on(apiClient, "message", onWebSocketMessage); - events.on(playbackManager, "playerchange", onPlayerChange); + events.on(apiClient, 'message', onWebSocketMessage); + events.on(playbackManager, 'playerchange', onPlayerChange); }); - view.addEventListener("viewbeforehide", function () { - events.off(apiClient, "message", onWebSocketMessage); - events.off(playbackManager, "playerchange", onPlayerChange); + view.addEventListener('viewbeforehide', function () { + events.off(apiClient, 'message', onWebSocketMessage); + events.off(playbackManager, 'playerchange', onPlayerChange); libraryMenu.setTransparentMenu(false); }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { currentItem = null; self._currentPlaybackMediaSources = null; self.currentRecordingFields = null; diff --git a/src/controllers/list.js b/src/controllers/list.js index bcc38f27c..edd446900 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -1,15 +1,15 @@ -define(["globalize", "listView", "layoutManager", "userSettings", "focusManager", "cardBuilder", "loading", "connectionManager", "alphaNumericShortcuts", "scroller", "playbackManager", "alphaPicker", "emby-itemscontainer", "emby-scroller"], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, scroller, playbackManager, alphaPicker) { - "use strict"; +define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'scroller', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, scroller, playbackManager, alphaPicker) { + 'use strict'; function getInitialLiveTvQuery(instance, params) { var query = { UserId: connectionManager.getApiClient(params.serverId).getCurrentUserId(), StartIndex: 0, - Fields: "ChannelInfo,PrimaryImageAspectRatio", + Fields: 'ChannelInfo,PrimaryImageAspectRatio', Limit: 300 }; - if ("Recordings" === params.type) { + if ('Recordings' === params.type) { query.IsInProgress = false; } else { query.HasAired = false; @@ -19,39 +19,39 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" query.GenreIds = params.genreId; } - if ("true" === params.IsMovie) { + if ('true' === params.IsMovie) { query.IsMovie = true; - } else if ("false" === params.IsMovie) { + } else if ('false' === params.IsMovie) { query.IsMovie = false; } - if ("true" === params.IsSeries) { + if ('true' === params.IsSeries) { query.IsSeries = true; - } else if ("false" === params.IsSeries) { + } else if ('false' === params.IsSeries) { query.IsSeries = false; } - if ("true" === params.IsNews) { + if ('true' === params.IsNews) { query.IsNews = true; - } else if ("false" === params.IsNews) { + } else if ('false' === params.IsNews) { query.IsNews = false; } - if ("true" === params.IsSports) { + if ('true' === params.IsSports) { query.IsSports = true; - } else if ("false" === params.IsSports) { + } else if ('false' === params.IsSports) { query.IsSports = false; } - if ("true" === params.IsKids) { + if ('true' === params.IsKids) { query.IsKids = true; - } else if ("false" === params.IsKids) { + } else if ('false' === params.IsKids) { query.IsKids = false; } - if ("true" === params.IsAiring) { + if ('true' === params.IsAiring) { query.IsAiring = true; - } else if ("false" === params.IsAiring) { + } else if ('false' === params.IsAiring) { query.IsAiring = false; } @@ -66,29 +66,29 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" query.SortOrder = sortValues.sortOrder; } - query.Fields = query.Fields ? query.Fields + ",PrimaryImageAspectRatio" : "PrimaryImageAspectRatio"; + query.Fields = query.Fields ? query.Fields + ',PrimaryImageAspectRatio' : 'PrimaryImageAspectRatio'; query.ImageTypeLimit = 1; var hasFilters; var queryFilters = []; var filters = instance.getFilters(); if (filters.IsPlayed) { - queryFilters.push("IsPlayed"); + queryFilters.push('IsPlayed'); hasFilters = true; } if (filters.IsUnplayed) { - queryFilters.push("IsUnplayed"); + queryFilters.push('IsUnplayed'); hasFilters = true; } if (filters.IsFavorite) { - queryFilters.push("IsFavorite"); + queryFilters.push('IsFavorite'); hasFilters = true; } if (filters.IsResumable) { - queryFilters.push("IsResumable"); + queryFilters.push('IsResumable'); hasFilters = true; } @@ -147,7 +147,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" hasFilters = true; } - query.Filters = queryFilters.length ? queryFilters.join(",") : null; + query.Filters = queryFilters.length ? queryFilters.join(',') : null; instance.setFilterStatus(hasFilters); if (instance.alphaPicker) { @@ -158,8 +158,8 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" } function setSortButtonIcon(btnSortIcon, icon) { - btnSortIcon.classList.remove("arrow_downward"); - btnSortIcon.classList.remove("arrow_upward"); + btnSortIcon.classList.remove('arrow_downward'); + btnSortIcon.classList.remove('arrow_upward'); btnSortIcon.classList.add(icon); } @@ -173,7 +173,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" for (var i = 0, length = options.length; i < length; i++) { if (sortBy === options[i].value) { - btnSortText.innerHTML = globalize.translate("SortByValue", options[i].name); + btnSortText.innerHTML = globalize.translate('SortByValue', options[i].name); break; } } @@ -181,18 +181,18 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" var btnSortIcon = instance.btnSortIcon; if (btnSortIcon) { - setSortButtonIcon(btnSortIcon, "Descending" === values.sortOrder ? "arrow_downward" : "arrow_upward"); + setSortButtonIcon(btnSortIcon, 'Descending' === values.sortOrder ? 'arrow_downward' : 'arrow_upward'); } } } function updateItemsContainerForViewType(instance) { - if ("list" === instance.getViewSettings().imageType) { - instance.itemsContainer.classList.remove("vertical-wrap"); - instance.itemsContainer.classList.add("vertical-list"); + if ('list' === instance.getViewSettings().imageType) { + instance.itemsContainer.classList.remove('vertical-wrap'); + instance.itemsContainer.classList.add('vertical-list'); } else { - instance.itemsContainer.classList.add("vertical-wrap"); - instance.itemsContainer.classList.remove("vertical-list"); + instance.itemsContainer.classList.add('vertical-wrap'); + instance.itemsContainer.classList.remove('vertical-list'); } } @@ -207,12 +207,12 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" numItems = 100; } - if ("SortName" === values.sortBy && "Ascending" === values.sortOrder && numItems > 40) { - alphaPicker.classList.remove("hide"); - instance.itemsContainer.parentNode.classList.add("padded-right-withalphapicker"); + if ('SortName' === values.sortBy && 'Ascending' === values.sortOrder && numItems > 40) { + alphaPicker.classList.remove('hide'); + instance.itemsContainer.parentNode.classList.add('padded-right-withalphapicker'); } else { - alphaPicker.classList.add("hide"); - instance.itemsContainer.parentNode.classList.remove("padded-right-withalphapicker"); + alphaPicker.classList.add('hide'); + instance.itemsContainer.parentNode.classList.remove('padded-right-withalphapicker'); } } } @@ -222,25 +222,25 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" var apiClient = connectionManager.getApiClient(params.serverId); instance.queryRecursive = false; - if ("Recordings" === params.type) { + if ('Recordings' === params.type) { return apiClient.getLiveTvRecordings(getInitialLiveTvQuery(instance, params)); } - if ("Programs" === params.type) { - if ("true" === params.IsAiring) { + if ('Programs' === params.type) { + if ('true' === params.IsAiring) { return apiClient.getLiveTvRecommendedPrograms(getInitialLiveTvQuery(instance, params)); } return apiClient.getLiveTvPrograms(getInitialLiveTvQuery(instance, params)); } - if ("nextup" === params.type) { + if ('nextup' === params.type) { return apiClient.getNextUpEpisodes(modifyQueryWithFilters(instance, { Limit: limit, - Fields: "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo', UserId: apiClient.getCurrentUserId(), ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", + EnableImageTypes: 'Primary,Backdrop,Thumb', EnableTotalRecordCount: false, SortBy: sortBy })); @@ -248,57 +248,57 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" if (!item) { instance.queryRecursive = true; - var method = "getItems"; + var method = 'getItems'; - if ("MusicArtist" === params.type) { - method = "getArtists"; - } else if ("Person" === params.type) { - method = "getPeople"; + if ('MusicArtist' === params.type) { + method = 'getArtists'; + } else if ('Person' === params.type) { + method = 'getPeople'; } return apiClient[method](apiClient.getCurrentUserId(), modifyQueryWithFilters(instance, { StartIndex: startIndex, Limit: limit, - Fields: "PrimaryImageAspectRatio,SortName", + Fields: 'PrimaryImageAspectRatio,SortName', ImageTypeLimit: 1, - IncludeItemTypes: "MusicArtist" === params.type || "Person" === params.type ? null : params.type, + IncludeItemTypes: 'MusicArtist' === params.type || 'Person' === params.type ? null : params.type, Recursive: true, - IsFavorite: "true" === params.IsFavorite || null, + IsFavorite: 'true' === params.IsFavorite || null, ArtistIds: params.artistId || null, SortBy: sortBy })); } - if ("Genre" === item.Type || "MusicGenre" === item.Type || "Studio" === item.Type || "Person" === item.Type) { + if ('Genre' === item.Type || 'MusicGenre' === item.Type || 'Studio' === item.Type || 'Person' === item.Type) { instance.queryRecursive = true; var query = { StartIndex: startIndex, Limit: limit, - Fields: "PrimaryImageAspectRatio,SortName", + Fields: 'PrimaryImageAspectRatio,SortName', Recursive: true, parentId: params.parentId, SortBy: sortBy }; - if ("Studio" === item.Type) { + if ('Studio' === item.Type) { query.StudioIds = item.Id; - } else if ("Genre" === item.Type || "MusicGenre" === item.Type) { + } else if ('Genre' === item.Type || 'MusicGenre' === item.Type) { query.GenreIds = item.Id; - } else if ("Person" === item.Type) { + } else if ('Person' === item.Type) { query.PersonIds = item.Id; } - if ("MusicGenre" === item.Type) { - query.IncludeItemTypes = "MusicAlbum"; - } else if ("GameGenre" === item.Type) { - query.IncludeItemTypes = "Game"; - } else if ("movies" === item.CollectionType) { - query.IncludeItemTypes = "Movie"; - } else if ("tvshows" === item.CollectionType) { - query.IncludeItemTypes = "Series"; - } else if ("Genre" === item.Type) { - query.IncludeItemTypes = "Movie,Series,Video"; - } else if ("Person" === item.Type) { + if ('MusicGenre' === item.Type) { + query.IncludeItemTypes = 'MusicAlbum'; + } else if ('GameGenre' === item.Type) { + query.IncludeItemTypes = 'Game'; + } else if ('movies' === item.CollectionType) { + query.IncludeItemTypes = 'Movie'; + } else if ('tvshows' === item.CollectionType) { + query.IncludeItemTypes = 'Series'; + } else if ('Genre' === item.Type) { + query.IncludeItemTypes = 'Movie,Series,Video'; + } else if ('Person' === item.Type) { query.IncludeItemTypes = params.type; } @@ -308,7 +308,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" return apiClient.getItems(apiClient.getCurrentUserId(), modifyQueryWithFilters(instance, { StartIndex: startIndex, Limit: limit, - Fields: "PrimaryImageAspectRatio,SortName", + Fields: 'PrimaryImageAspectRatio,SortName', ImageTypeLimit: 1, ParentId: item.Id, SortBy: sortBy @@ -316,7 +316,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" } function getItem(params) { - if ("Recordings" === params.type || "Programs" === params.type || "nextup" === params.type) { + if ('Recordings' === params.type || 'Programs' === params.type || 'nextup' === params.type) { return Promise.resolve(null); } @@ -333,7 +333,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" function showViewSettingsMenu() { var instance = this; - require(["viewSettings"], function (ViewSettings) { + require(['viewSettings'], function (ViewSettings) { new ViewSettings().show({ settingsKey: instance.getSettingsKey(), settings: instance.getViewSettings(), @@ -348,7 +348,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" function showFilterMenu() { var instance = this; - require(["filterMenu"], function (FilterMenu) { + require(['filterMenu'], function (FilterMenu) { new FilterMenu().show({ settingsKey: instance.getSettingsKey(), settings: instance.getFilters(), @@ -367,7 +367,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" function showSortMenu() { var instance = this; - require(["sortMenu"], function (SortMenu) { + require(['sortMenu'], function (SortMenu) { new SortMenu().show({ settingsKey: instance.getSettingsKey(), settings: instance.getSortValues(), @@ -385,7 +385,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" function onNewItemClick() { var instance = this; - require(["playlistEditor"], function (playlistEditor) { + require(['playlistEditor'], function (playlistEditor) { new playlistEditor().show({ items: [], serverId: instance.params.serverId @@ -396,9 +396,9 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" function hideOrShowAll(elems, hide) { for (var i = 0, length = elems.length; i < length; i++) { if (hide) { - elems[i].classList.add("hide"); + elems[i].classList.add('hide'); } else { - elems[i].classList.remove("hide"); + elems[i].classList.remove('hide'); } } } @@ -424,7 +424,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" function getItemsHtml(items) { var settings = self.getViewSettings(); - if ("list" === settings.imageType) { + if ('list' === settings.imageType) { return listView.getListViewHtml({ items: items }); @@ -438,26 +438,26 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" var item = self.currentItem; var lines = settings.showTitle ? 2 : 0; - if ("banner" === settings.imageType) { - shape = "banner"; - } else if ("disc" === settings.imageType) { - shape = "square"; + if ('banner' === settings.imageType) { + shape = 'banner'; + } else if ('disc' === settings.imageType) { + shape = 'square'; preferDisc = true; - } else if ("logo" === settings.imageType) { - shape = "backdrop"; + } else if ('logo' === settings.imageType) { + shape = 'backdrop'; preferLogo = true; - } else if ("thumb" === settings.imageType) { - shape = "backdrop"; + } else if ('thumb' === settings.imageType) { + shape = 'backdrop'; preferThumb = true; - } else if ("nextup" === params.type) { - shape = "backdrop"; - preferThumb = "thumb" === settings.imageType; - } else if ("Programs" === params.type || "Recordings" === params.type) { - shape = "true" === params.IsMovie ? "portrait" : "autoVertical"; - preferThumb = "true" !== params.IsMovie ? "auto" : false; - defaultShape = "true" === params.IsMovie ? "portrait" : "backdrop"; + } else if ('nextup' === params.type) { + shape = 'backdrop'; + preferThumb = 'thumb' === settings.imageType; + } else if ('Programs' === params.type || 'Recordings' === params.type) { + shape = 'true' === params.IsMovie ? 'portrait' : 'autoVertical'; + preferThumb = 'true' !== params.IsMovie ? 'auto' : false; + defaultShape = 'true' === params.IsMovie ? 'portrait' : 'backdrop'; } else { - shape = "autoVertical"; + shape = 'autoVertical'; } var posterOptions = { @@ -473,47 +473,47 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" overlayMoreButton: true, overlayText: !settings.showTitle, defaultShape: defaultShape, - action: "Audio" === params.type ? "playallfromhere" : null + action: 'Audio' === params.type ? 'playallfromhere' : null }; - if ("nextup" === params.type) { + if ('nextup' === params.type) { posterOptions.showParentTitle = settings.showTitle; - } else if ("Person" === params.type) { + } else if ('Person' === params.type) { posterOptions.showYear = false; posterOptions.showParentTitle = false; lines = 1; - } else if ("Audio" === params.type) { + } else if ('Audio' === params.type) { posterOptions.showParentTitle = settings.showTitle; - } else if ("MusicAlbum" === params.type) { + } else if ('MusicAlbum' === params.type) { posterOptions.showParentTitle = settings.showTitle; - } else if ("Episode" === params.type) { + } else if ('Episode' === params.type) { posterOptions.showParentTitle = settings.showTitle; - } else if ("MusicArtist" === params.type) { + } else if ('MusicArtist' === params.type) { posterOptions.showYear = false; lines = 1; - } else if ("Programs" === params.type) { + } else if ('Programs' === params.type) { lines = settings.showTitle ? 1 : 0; - var showParentTitle = settings.showTitle && "true" !== params.IsMovie; + var showParentTitle = settings.showTitle && 'true' !== params.IsMovie; if (showParentTitle) { lines++; } - var showAirTime = settings.showTitle && "Recordings" !== params.type; + var showAirTime = settings.showTitle && 'Recordings' !== params.type; if (showAirTime) { lines++; } - var showYear = settings.showTitle && "true" === params.IsMovie && "Recordings" === params.type; + var showYear = settings.showTitle && 'true' === params.IsMovie && 'Recordings' === params.type; if (showYear) { lines++; } posterOptions = Object.assign(posterOptions, { - inheritThumb: "Recordings" === params.type, - context: "livetv", + inheritThumb: 'Recordings' === params.type, + context: 'livetv', showParentTitle: showParentTitle, showAirTime: showAirTime, showAirDateTime: showAirTime, @@ -529,28 +529,28 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" posterOptions.lines = lines; posterOptions.items = items; - if (item && "folders" === item.CollectionType) { - posterOptions.context = "folders"; + if (item && 'folders' === item.CollectionType) { + posterOptions.context = 'folders'; } return cardBuilder.getCardsHtml(posterOptions); } function initAlphaPicker() { - self.scroller = view.querySelector(".scrollFrameY"); + self.scroller = view.querySelector('.scrollFrameY'); var alphaPickerElement = self.alphaPickerElement; - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - alphaPickerElement.classList.add("focuscontainer-right"); - self.itemsContainer.parentNode.classList.add("padded-right-withalphapicker"); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + alphaPickerElement.classList.add('focuscontainer-right'); + self.itemsContainer.parentNode.classList.add('padded-right-withalphapicker'); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, itemsContainer: layoutManager.tv ? self.itemsContainer : null, - itemClass: "card", - valueChangeEvent: layoutManager.tv ? null : "click" + itemClass: 'card', + valueChangeEvent: layoutManager.tv ? null : 'click' }); - self.alphaPicker.on("alphavaluechanged", onAlphaPickerValueChanged); + self.alphaPicker.on('alphavaluechanged', onAlphaPickerValueChanged); } function onAlphaPickerValueChanged() { @@ -559,90 +559,90 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" } function setTitle(item) { - Emby.Page.setTitle(getTitle(item) || ""); + Emby.Page.setTitle(getTitle(item) || ''); - if (item && "playlists" === item.CollectionType) { - hideOrShowAll(view.querySelectorAll(".btnNewItem"), false); + if (item && 'playlists' === item.CollectionType) { + hideOrShowAll(view.querySelectorAll('.btnNewItem'), false); } else { - hideOrShowAll(view.querySelectorAll(".btnNewItem"), true); + hideOrShowAll(view.querySelectorAll('.btnNewItem'), true); } } function getTitle(item) { - if ("Recordings" === params.type) { - return globalize.translate("Recordings"); + if ('Recordings' === params.type) { + return globalize.translate('Recordings'); } - if ("Programs" === params.type) { - if ("true" === params.IsMovie) { - return globalize.translate("Movies"); + if ('Programs' === params.type) { + if ('true' === params.IsMovie) { + return globalize.translate('Movies'); } - if ("true" === params.IsSports) { - return globalize.translate("Sports"); + if ('true' === params.IsSports) { + return globalize.translate('Sports'); } - if ("true" === params.IsKids) { - return globalize.translate("HeaderForKids"); + if ('true' === params.IsKids) { + return globalize.translate('HeaderForKids'); } - if ("true" === params.IsAiring) { - return globalize.translate("HeaderOnNow"); + if ('true' === params.IsAiring) { + return globalize.translate('HeaderOnNow'); } - if ("true" === params.IsSeries) { - return globalize.translate("Shows"); + if ('true' === params.IsSeries) { + return globalize.translate('Shows'); } - if ("true" === params.IsNews) { - return globalize.translate("News"); + if ('true' === params.IsNews) { + return globalize.translate('News'); } - return globalize.translate("Programs"); + return globalize.translate('Programs'); } - if ("nextup" === params.type) { - return globalize.translate("NextUp"); + if ('nextup' === params.type) { + return globalize.translate('NextUp'); } - if ("favoritemovies" === params.type) { - return globalize.translate("FavoriteMovies"); + if ('favoritemovies' === params.type) { + return globalize.translate('FavoriteMovies'); } if (item) { return item.Name; } - if ("Movie" === params.type) { - return globalize.translate("Movies"); + if ('Movie' === params.type) { + return globalize.translate('Movies'); } - if ("Series" === params.type) { - return globalize.translate("Shows"); + if ('Series' === params.type) { + return globalize.translate('Shows'); } - if ("Season" === params.type) { - return globalize.translate("Seasons"); + if ('Season' === params.type) { + return globalize.translate('Seasons'); } - if ("Episode" === params.type) { - return globalize.translate("Episodes"); + if ('Episode' === params.type) { + return globalize.translate('Episodes'); } - if ("MusicArtist" === params.type) { - return globalize.translate("Artists"); + if ('MusicArtist' === params.type) { + return globalize.translate('Artists'); } - if ("MusicAlbum" === params.type) { - return globalize.translate("Albums"); + if ('MusicAlbum' === params.type) { + return globalize.translate('Albums'); } - if ("Audio" === params.type) { - return globalize.translate("Songs"); + if ('Audio' === params.type) { + return globalize.translate('Songs'); } - if ("Video" === params.type) { - return globalize.translate("Videos"); + if ('Video' === params.type) { + return globalize.translate('Videos'); } return void 0; @@ -686,7 +686,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" if (currentItem && !self.hasFilters) { playbackManager.shuffle(currentItem); } else { - getItems(self, self.params, currentItem, "Random", null, 300).then(function (result) { + getItems(self, self.params, currentItem, 'Random', null, 300).then(function (result) { playbackManager.play({ items: result.Items }); @@ -696,59 +696,59 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" var self = this; self.params = params; - this.itemsContainer = view.querySelector(".itemsContainer"); + this.itemsContainer = view.querySelector('.itemsContainer'); if (params.parentId) { - this.itemsContainer.setAttribute("data-parentid", params.parentId); - } else if ("nextup" === params.type) { - this.itemsContainer.setAttribute("data-monitor", "videoplayback"); - } else if ("favoritemovies" === params.type) { - this.itemsContainer.setAttribute("data-monitor", "markfavorite"); - } else if ("Programs" === params.type) { - this.itemsContainer.setAttribute("data-refreshinterval", "300000"); + this.itemsContainer.setAttribute('data-parentid', params.parentId); + } else if ('nextup' === params.type) { + this.itemsContainer.setAttribute('data-monitor', 'videoplayback'); + } else if ('favoritemovies' === params.type) { + this.itemsContainer.setAttribute('data-monitor', 'markfavorite'); + } else if ('Programs' === params.type) { + this.itemsContainer.setAttribute('data-refreshinterval', '300000'); } var i; var length; - var btnViewSettings = view.querySelectorAll(".btnViewSettings"); + var btnViewSettings = view.querySelectorAll('.btnViewSettings'); for (i = 0, length = btnViewSettings.length; i < length; i++) { - btnViewSettings[i].addEventListener("click", showViewSettingsMenu.bind(this)); + btnViewSettings[i].addEventListener('click', showViewSettingsMenu.bind(this)); } - var filterButtons = view.querySelectorAll(".btnFilter"); + var filterButtons = view.querySelectorAll('.btnFilter'); this.filterButtons = filterButtons; var hasVisibleFilters = this.getVisibleFilters().length; for (i = 0, length = filterButtons.length; i < length; i++) { var btnFilter = filterButtons[i]; - btnFilter.addEventListener("click", showFilterMenu.bind(this)); + btnFilter.addEventListener('click', showFilterMenu.bind(this)); if (hasVisibleFilters) { - btnFilter.classList.remove("hide"); + btnFilter.classList.remove('hide'); } else { - btnFilter.classList.add("hide"); + btnFilter.classList.add('hide'); } } - var sortButtons = view.querySelectorAll(".btnSort"); + var sortButtons = view.querySelectorAll('.btnSort'); for (this.sortButtons = sortButtons, i = 0, length = sortButtons.length; i < length; i++) { var sortButton = sortButtons[i]; - sortButton.addEventListener("click", showSortMenu.bind(this)); + sortButton.addEventListener('click', showSortMenu.bind(this)); - if ("nextup" !== params.type) { - sortButton.classList.remove("hide"); + if ('nextup' !== params.type) { + sortButton.classList.remove('hide'); } } - this.btnSortText = view.querySelector(".btnSortText"); - this.btnSortIcon = view.querySelector(".btnSortIcon"); - bindAll(view.querySelectorAll(".btnNewItem"), "click", onNewItemClick.bind(this)); - this.alphaPickerElement = view.querySelector(".alphaPicker"); + this.btnSortText = view.querySelector('.btnSortText'); + this.btnSortIcon = view.querySelector('.btnSortIcon'); + bindAll(view.querySelectorAll('.btnNewItem'), 'click', onNewItemClick.bind(this)); + this.alphaPickerElement = view.querySelector('.alphaPicker'); self.itemsContainer.fetchData = fetchData; self.itemsContainer.getItemsHtml = getItemsHtml; - view.addEventListener("viewshow", function (e) { + view.addEventListener('viewshow', function (e) { var isRestored = e.detail.isRestored; if (!isRestored) { @@ -772,42 +772,42 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" } }); - if (!isRestored && item && "PhotoAlbum" !== item.Type) { + if (!isRestored && item && 'PhotoAlbum' !== item.Type) { initAlphaPicker(); } var itemType = item ? item.Type : null; - if ("MusicGenre" === itemType || "Programs" !== params.type && "Channel" !== itemType) { - hideOrShowAll(view.querySelectorAll(".btnPlay"), false); + if ('MusicGenre' === itemType || 'Programs' !== params.type && 'Channel' !== itemType) { + hideOrShowAll(view.querySelectorAll('.btnPlay'), false); } else { - hideOrShowAll(view.querySelectorAll(".btnPlay"), true); + hideOrShowAll(view.querySelectorAll('.btnPlay'), true); } - if ("MusicGenre" === itemType || "Programs" !== params.type && "nextup" !== params.type && "Channel" !== itemType) { - hideOrShowAll(view.querySelectorAll(".btnShuffle"), false); + if ('MusicGenre' === itemType || 'Programs' !== params.type && 'nextup' !== params.type && 'Channel' !== itemType) { + hideOrShowAll(view.querySelectorAll('.btnShuffle'), false); } else { - hideOrShowAll(view.querySelectorAll(".btnShuffle"), true); + hideOrShowAll(view.querySelectorAll('.btnShuffle'), true); } if (item && playbackManager.canQueue(item)) { - hideOrShowAll(view.querySelectorAll(".btnQueue"), false); + hideOrShowAll(view.querySelectorAll('.btnQueue'), false); } else { - hideOrShowAll(view.querySelectorAll(".btnQueue"), true); + hideOrShowAll(view.querySelectorAll('.btnQueue'), true); } }); if (!isRestored) { - bindAll(view.querySelectorAll(".btnPlay"), "click", play); - bindAll(view.querySelectorAll(".btnQueue"), "click", queue); - bindAll(view.querySelectorAll(".btnShuffle"), "click", shuffle); + bindAll(view.querySelectorAll('.btnPlay'), 'click', play); + bindAll(view.querySelectorAll('.btnQueue'), 'click', queue); + bindAll(view.querySelectorAll('.btnShuffle'), 'click', shuffle); } this.alphaNumericShortcuts = new AlphaNumericShortcuts({ itemsContainer: self.itemsContainer }); }); - view.addEventListener("viewhide", function (e) { + view.addEventListener('viewhide', function (e) { var itemsContainer = self.itemsContainer; if (itemsContainer) { @@ -821,13 +821,13 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" self.alphaNumericShortcuts = null; } }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { if (self.listController) { self.listController.destroy(); } if (self.alphaPicker) { - self.alphaPicker.off("alphavaluechanged", onAlphaPickerValueChanged); + self.alphaPicker.off('alphavaluechanged', onAlphaPickerValueChanged); self.alphaPicker.destroy(); } @@ -845,30 +845,30 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" ItemsView.prototype.getFilters = function () { var basekey = this.getSettingsKey(); return { - IsPlayed: "true" === userSettings.getFilter(basekey + "-filter-IsPlayed"), - IsUnplayed: "true" === userSettings.getFilter(basekey + "-filter-IsUnplayed"), - IsFavorite: "true" === userSettings.getFilter(basekey + "-filter-IsFavorite"), - IsResumable: "true" === userSettings.getFilter(basekey + "-filter-IsResumable"), - Is4K: "true" === userSettings.getFilter(basekey + "-filter-Is4K"), - IsHD: "true" === userSettings.getFilter(basekey + "-filter-IsHD"), - IsSD: "true" === userSettings.getFilter(basekey + "-filter-IsSD"), - Is3D: "true" === userSettings.getFilter(basekey + "-filter-Is3D"), - VideoTypes: userSettings.getFilter(basekey + "-filter-VideoTypes"), - SeriesStatus: userSettings.getFilter(basekey + "-filter-SeriesStatus"), - HasSubtitles: userSettings.getFilter(basekey + "-filter-HasSubtitles"), - HasTrailer: userSettings.getFilter(basekey + "-filter-HasTrailer"), - HasSpecialFeature: userSettings.getFilter(basekey + "-filter-HasSpecialFeature"), - HasThemeSong: userSettings.getFilter(basekey + "-filter-HasThemeSong"), - HasThemeVideo: userSettings.getFilter(basekey + "-filter-HasThemeVideo"), - GenreIds: userSettings.getFilter(basekey + "-filter-GenreIds") + IsPlayed: 'true' === userSettings.getFilter(basekey + '-filter-IsPlayed'), + IsUnplayed: 'true' === userSettings.getFilter(basekey + '-filter-IsUnplayed'), + IsFavorite: 'true' === userSettings.getFilter(basekey + '-filter-IsFavorite'), + IsResumable: 'true' === userSettings.getFilter(basekey + '-filter-IsResumable'), + Is4K: 'true' === userSettings.getFilter(basekey + '-filter-Is4K'), + IsHD: 'true' === userSettings.getFilter(basekey + '-filter-IsHD'), + IsSD: 'true' === userSettings.getFilter(basekey + '-filter-IsSD'), + Is3D: 'true' === userSettings.getFilter(basekey + '-filter-Is3D'), + VideoTypes: userSettings.getFilter(basekey + '-filter-VideoTypes'), + SeriesStatus: userSettings.getFilter(basekey + '-filter-SeriesStatus'), + HasSubtitles: userSettings.getFilter(basekey + '-filter-HasSubtitles'), + HasTrailer: userSettings.getFilter(basekey + '-filter-HasTrailer'), + HasSpecialFeature: userSettings.getFilter(basekey + '-filter-HasSpecialFeature'), + HasThemeSong: userSettings.getFilter(basekey + '-filter-HasThemeSong'), + HasThemeVideo: userSettings.getFilter(basekey + '-filter-HasThemeVideo'), + GenreIds: userSettings.getFilter(basekey + '-filter-GenreIds') }; }; ItemsView.prototype.getSortValues = function () { var basekey = this.getSettingsKey(); return { - sortBy: userSettings.getFilter(basekey + "-sortby") || this.getDefaultSortBy(), - sortOrder: "Descending" === userSettings.getFilter(basekey + "-sortorder") ? "Descending" : "Ascending" + sortBy: userSettings.getFilter(basekey + '-sortby') || this.getDefaultSortBy(), + sortOrder: 'Descending' === userSettings.getFilter(basekey + '-sortorder') ? 'Descending' : 'Ascending' }; }; @@ -880,17 +880,17 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" return sortNameOption.value; } - return "IsFolder," + sortNameOption.value; + return 'IsFolder,' + sortNameOption.value; }; ItemsView.prototype.getSortMenuOptions = function () { var sortBy = []; var params = this.params; - if ("Programs" === params.type) { + if ('Programs' === params.type) { sortBy.push({ - name: globalize.translate("AirDate"), - value: "StartDate,SortName" + name: globalize.translate('AirDate'), + value: 'StartDate,SortName' }); } @@ -912,10 +912,10 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" sortBy.push(option); } - if ("Programs" !== params.type) { + if ('Programs' !== params.type) { sortBy.push({ - name: globalize.translate("DateAdded"), - value: "DateCreated,SortName" + name: globalize.translate('DateAdded'), + value: 'DateCreated,SortName' }); } @@ -928,14 +928,14 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" if (!params.type) { option = this.getNameSortOption(params); sortBy.push({ - name: globalize.translate("Folders"), - value: "IsFolder," + option.value + name: globalize.translate('Folders'), + value: 'IsFolder,' + option.value }); } sortBy.push({ - name: globalize.translate("ParentalRating"), - value: "OfficialRating,SortName" + name: globalize.translate('ParentalRating'), + value: 'OfficialRating,SortName' }); option = this.getPlayCountSortOption(); @@ -944,67 +944,67 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" } sortBy.push({ - name: globalize.translate("ReleaseDate"), - value: "ProductionYear,PremiereDate,SortName" + name: globalize.translate('ReleaseDate'), + value: 'ProductionYear,PremiereDate,SortName' }); sortBy.push({ - name: globalize.translate("Runtime"), - value: "Runtime,SortName" + name: globalize.translate('Runtime'), + value: 'Runtime,SortName' }); return sortBy; }; ItemsView.prototype.getNameSortOption = function (params) { - if ("Episode" === params.type) { + if ('Episode' === params.type) { return { - name: globalize.translate("Name"), - value: "SeriesName,SortName" + name: globalize.translate('Name'), + value: 'SeriesName,SortName' }; } return { - name: globalize.translate("Name"), - value: "SortName" + name: globalize.translate('Name'), + value: 'SortName' }; }; ItemsView.prototype.getPlayCountSortOption = function () { - if ("Programs" === this.params.type) { + if ('Programs' === this.params.type) { return null; } return { - name: globalize.translate("PlayCount"), - value: "PlayCount,SortName" + name: globalize.translate('PlayCount'), + value: 'PlayCount,SortName' }; }; ItemsView.prototype.getDatePlayedSortOption = function () { - if ("Programs" === this.params.type) { + if ('Programs' === this.params.type) { return null; } return { - name: globalize.translate("DatePlayed"), - value: "DatePlayed,SortName" + name: globalize.translate('DatePlayed'), + value: 'DatePlayed,SortName' }; }; ItemsView.prototype.getCriticRatingSortOption = function () { - if ("Programs" === this.params.type) { + if ('Programs' === this.params.type) { return null; } return { - name: globalize.translate("CriticRating"), - value: "CriticRating,SortName" + name: globalize.translate('CriticRating'), + value: 'CriticRating,SortName' }; }; ItemsView.prototype.getCommunityRatingSortOption = function () { return { - name: globalize.translate("CommunityRating"), - value: "CommunityRating,SortName" + name: globalize.translate('CommunityRating'), + value: 'CommunityRating,SortName' }; }; @@ -1012,25 +1012,24 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" var filters = []; var params = this.params; - if (!("nextup" === params.type)) { - if ("Programs" === params.type) { - filters.push("Genres"); + if (!('nextup' === params.type)) { + if ('Programs' === params.type) { + filters.push('Genres'); } else { - params.type; - filters.push("IsUnplayed"); - filters.push("IsPlayed"); + filters.push('IsUnplayed'); + filters.push('IsPlayed'); if (!params.IsFavorite) { - filters.push("IsFavorite"); + filters.push('IsFavorite'); } - filters.push("IsResumable"); - filters.push("VideoType"); - filters.push("HasSubtitles"); - filters.push("HasTrailer"); - filters.push("HasSpecialFeature"); - filters.push("HasThemeSong"); - filters.push("HasThemeVideo"); + filters.push('IsResumable'); + filters.push('VideoType'); + filters.push('HasSubtitles'); + filters.push('HasTrailer'); + filters.push('HasSpecialFeature'); + filters.push('HasThemeSong'); + filters.push('HasThemeVideo'); } } @@ -1044,22 +1043,22 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" if (filterButtons.length) { for (var i = 0, length = filterButtons.length; i < length; i++) { var btnFilter = filterButtons[i]; - var bubble = btnFilter.querySelector(".filterButtonBubble"); + var bubble = btnFilter.querySelector('.filterButtonBubble'); if (!bubble) { if (!hasFilters) { continue; } - btnFilter.insertAdjacentHTML("afterbegin", '
!
'); - btnFilter.classList.add("btnFilterWithBubble"); - bubble = btnFilter.querySelector(".filterButtonBubble"); + btnFilter.insertAdjacentHTML('afterbegin', '
!
'); + btnFilter.classList.add('btnFilterWithBubble'); + bubble = btnFilter.querySelector('.filterButtonBubble'); } if (hasFilters) { - bubble.classList.remove("hide"); + bubble.classList.remove('hide'); } else { - bubble.classList.add("hide"); + bubble.classList.add('hide'); } } } @@ -1080,13 +1079,13 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" ItemsView.prototype.getVisibleViewSettings = function () { var item = (this.params, this.currentItem); - var fields = ["showTitle"]; + var fields = ['showTitle']; - if (!item || "PhotoAlbum" !== item.Type && "ChannelFolderItem" !== item.Type) { - fields.push("imageType"); + if (!item || 'PhotoAlbum' !== item.Type && 'ChannelFolderItem' !== item.Type) { + fields.push('imageType'); } - fields.push("viewType"); + fields.push('viewType'); return fields; }; @@ -1094,41 +1093,41 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" var basekey = this.getSettingsKey(); var params = this.params; var item = this.currentItem; - var showTitle = userSettings.get(basekey + "-showTitle"); + var showTitle = userSettings.get(basekey + '-showTitle'); - if ("true" === showTitle) { + if ('true' === showTitle) { showTitle = true; - } else if ("false" === showTitle) { + } else if ('false' === showTitle) { showTitle = false; - } else if ("Programs" === params.type || "Recordings" === params.type || "Person" === params.type || "nextup" === params.type || "Audio" === params.type || "MusicAlbum" === params.type || "MusicArtist" === params.type) { + } else if ('Programs' === params.type || 'Recordings' === params.type || 'Person' === params.type || 'nextup' === params.type || 'Audio' === params.type || 'MusicAlbum' === params.type || 'MusicArtist' === params.type) { showTitle = true; - } else if (item && "PhotoAlbum" !== item.Type) { + } else if (item && 'PhotoAlbum' !== item.Type) { showTitle = true; } - var imageType = userSettings.get(basekey + "-imageType"); + var imageType = userSettings.get(basekey + '-imageType'); - if (!imageType && "nextup" === params.type) { - imageType = "thumb"; + if (!imageType && 'nextup' === params.type) { + imageType = 'thumb'; } return { showTitle: showTitle, - showYear: "false" !== userSettings.get(basekey + "-showYear"), - imageType: imageType || "primary", - viewType: userSettings.get(basekey + "-viewType") || "images" + showYear: 'false' !== userSettings.get(basekey + '-showYear'), + imageType: imageType || 'primary', + viewType: userSettings.get(basekey + '-viewType') || 'images' }; }; ItemsView.prototype.getItemTypes = function () { var params = this.params; - if ("nextup" === params.type) { - return ["Episode"]; + if ('nextup' === params.type) { + return ['Episode']; } - if ("Programs" === params.type) { - return ["Program"]; + if ('Programs' === params.type) { + return ['Program']; } return []; @@ -1136,7 +1135,7 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" ItemsView.prototype.getSettingsKey = function () { var values = []; - values.push("items"); + values.push('items'); var params = this.params; if (params.type) { @@ -1146,54 +1145,54 @@ define(["globalize", "listView", "layoutManager", "userSettings", "focusManager" } if (params.IsAiring) { - values.push("IsAiring"); + values.push('IsAiring'); } if (params.IsMovie) { - values.push("IsMovie"); + values.push('IsMovie'); } if (params.IsKids) { - values.push("IsKids"); + values.push('IsKids'); } if (params.IsSports) { - values.push("IsSports"); + values.push('IsSports'); } if (params.IsNews) { - values.push("IsNews"); + values.push('IsNews'); } if (params.IsSeries) { - values.push("IsSeries"); + values.push('IsSeries'); } if (params.IsFavorite) { - values.push("IsFavorite"); + values.push('IsFavorite'); } if (params.genreId) { - values.push("Genre"); + values.push('Genre'); } if (params.musicGenreId) { - values.push("MusicGenre"); + values.push('MusicGenre'); } if (params.studioId) { - values.push("Studio"); + values.push('Studio'); } if (params.personId) { - values.push("Person"); + values.push('Person'); } if (params.parentId) { - values.push("Folder"); + values.push('Folder'); } - return values.join("-"); + return values.join('-'); }; return ItemsView; diff --git a/src/controllers/livetv/livetvchannels.js b/src/controllers/livetv/livetvchannels.js index 63e4b4728..7f22d3dd1 100644 --- a/src/controllers/livetv/livetvchannels.js +++ b/src/controllers/livetv/livetvchannels.js @@ -1,5 +1,5 @@ -define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "userSettings", "emby-itemscontainer"], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { - "use strict"; +define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) { + 'use strict'; return function (view, params, tabContent) { function getPageData() { @@ -7,7 +7,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us pageData = { query: { StartIndex: 0, - Fields: "PrimaryImageAspectRatio" + Fields: 'PrimaryImageAspectRatio' } }; } @@ -26,7 +26,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us function getChannelsHtml(channels) { return cardBuilder.getCardsHtml({ items: channels, - shape: "square", + shape: 'square', showTitle: true, lazy: true, cardLayout: true, @@ -60,7 +60,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us } var query = getQuery(); - context.querySelector(".paging").innerHTML = libraryBrowser.getQueryPagingHtml({ + context.querySelector('.paging').innerHTML = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -69,30 +69,30 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us filterButton: false }); var html = getChannelsHtml(result.Items); - var elem = context.querySelector("#items"); + var elem = context.querySelector('#items'); elem.innerHTML = html; imageLoader.lazyChildren(elem); var i; var length; var elems; - for (elems = context.querySelectorAll(".btnNextPage"), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + for (elems = context.querySelectorAll('.btnNextPage'), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener('click', onNextPageClick); } - for (elems = context.querySelectorAll(".btnPreviousPage"), i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + for (elems = context.querySelectorAll('.btnPreviousPage'), i = 0, length = elems.length; i < length; i++) { + elems[i].addEventListener('click', onPreviousPageClick); } } function showFilterMenu(context) { - require(["components/filterdialog/filterdialog"], function (filterDialogFactory) { + require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { var filterDialog = new filterDialogFactory({ query: getQuery(), - mode: "livetvchannels", + mode: 'livetvchannels', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { reloadItems(context); }); filterDialog.show(); @@ -110,7 +110,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(view); }); }); @@ -119,7 +119,7 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "us var pageData; var self = this; var isLoading = false; - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { showFilterMenu(tabContent); }); diff --git a/src/controllers/livetv/livetvguide.js b/src/controllers/livetv/livetvguide.js index f7c2f1baa..ec7a7a3f8 100644 --- a/src/controllers/livetv/livetvguide.js +++ b/src/controllers/livetv/livetvguide.js @@ -1,5 +1,5 @@ -define(["tvguide"], function (tvguide) { - "use strict"; +define(['tvguide'], function (tvguide) { + 'use strict'; return function (view, params, tabContent) { var guideInstance; diff --git a/src/controllers/livetv/livetvrecordings.js b/src/controllers/livetv/livetvrecordings.js index f8e49f259..d5cfe6667 100644 --- a/src/controllers/livetv/livetvrecordings.js +++ b/src/controllers/livetv/livetvrecordings.js @@ -1,5 +1,5 @@ -define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "scripts/livetvcomponents", "listViewStyle", "emby-itemscontainer"], function (layoutManager, loading, cardBuilder, appHost, imageLoader) { - "use strict"; +define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'scripts/livetvcomponents', 'listViewStyle', 'emby-itemscontainer'], function (layoutManager, loading, cardBuilder, appHost, imageLoader) { + 'use strict'; function renderRecordings(elem, recordings, cardOptions, scrollX) { if (!elem) { @@ -7,35 +7,35 @@ define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "sc } if (recordings.length) { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } else { - elem.classList.add("hide"); + elem.classList.add('hide'); } - var recordingItems = elem.querySelector(".recordingItems"); + var recordingItems = elem.querySelector('.recordingItems'); if (scrollX) { - recordingItems.classList.add("scrollX"); - recordingItems.classList.add("hiddenScrollX"); - recordingItems.classList.remove("vertical-wrap"); + recordingItems.classList.add('scrollX'); + recordingItems.classList.add('hiddenScrollX'); + recordingItems.classList.remove('vertical-wrap'); } else { - recordingItems.classList.remove("scrollX"); - recordingItems.classList.remove("hiddenScrollX"); - recordingItems.classList.add("vertical-wrap"); + recordingItems.classList.remove('scrollX'); + recordingItems.classList.remove('hiddenScrollX'); + recordingItems.classList.add('vertical-wrap'); } - appHost.supports("imageanalysis"); + appHost.supports('imageanalysis'); recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ items: recordings, - shape: scrollX ? "autooverflow" : "auto", - defaultShape: scrollX ? "overflowBackdrop" : "backdrop", + shape: scrollX ? 'autooverflow' : 'auto', + defaultShape: scrollX ? 'overflowBackdrop' : 'backdrop', showTitle: true, showParentTitle: true, coverImage: true, cardLayout: false, centerText: true, allowBottomPadding: !scrollX, - preferThumb: "auto", + preferThumb: 'auto', overlayText: false }, cardOptions || {})); imageLoader.lazyChildren(recordingItems); @@ -43,7 +43,7 @@ define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "sc function renderLatestRecordings(context, promise) { promise.then(function (result) { - renderRecordings(context.querySelector("#latestRecordings"), result.Items, { + renderRecordings(context.querySelector('#latestRecordings'), result.Items, { showYear: true, lines: 2 }, false); @@ -53,7 +53,7 @@ define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "sc function renderRecordingFolders(context, promise) { promise.then(function (result) { - renderRecordings(context.querySelector("#recordingFolders"), result.Items, { + renderRecordings(context.querySelector('#recordingFolders'), result.Items, { showYear: false, showParentTitle: false }, false); @@ -61,12 +61,12 @@ define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "sc } function onMoreClick(e) { - var type = this.getAttribute("data-type"); + var type = this.getAttribute('data-type'); var serverId = ApiClient.serverId(); switch (type) { - case "latest": - Dashboard.navigate("list.html?type=Recordings&serverId=" + serverId); + case 'latest': + Dashboard.navigate('list.html?type=Recordings&serverId=' + serverId); } } @@ -79,10 +79,10 @@ define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "sc var latestPromise; var self = this; var lastFullRender = 0; - var moreButtons = tabContent.querySelectorAll(".more"); + var moreButtons = tabContent.querySelectorAll('.more'); for (var i = 0, length = moreButtons.length; i < length; i++) { - moreButtons[i].addEventListener("click", onMoreClick); + moreButtons[i].addEventListener('click', onMoreClick); } self.preRender = function () { @@ -90,9 +90,9 @@ define(["layoutManager", "loading", "cardBuilder", "apphost", "imageLoader", "sc latestPromise = ApiClient.getLiveTvRecordings({ UserId: Dashboard.getCurrentUserId(), Limit: 12, - Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', EnableTotalRecordCount: false, - EnableImageTypes: "Primary,Thumb,Backdrop" + EnableImageTypes: 'Primary,Thumb,Backdrop' }); foldersPromise = ApiClient.getRecordingFolders(Dashboard.getCurrentUserId()); } diff --git a/src/controllers/livetv/livetvschedule.js b/src/controllers/livetv/livetvschedule.js index 3bb85598c..a6f509c6f 100644 --- a/src/controllers/livetv/livetvschedule.js +++ b/src/controllers/livetv/livetvschedule.js @@ -1,5 +1,5 @@ -define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "scripts/livetvcomponents", "emby-button", "emby-itemscontainer"], function (layoutManager, cardBuilder, appHost, imageLoader, loading) { - "use strict"; +define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'scripts/livetvcomponents', 'emby-button', 'emby-itemscontainer'], function (layoutManager, cardBuilder, appHost, imageLoader, loading) { + 'use strict'; function enableScrollX() { return !layoutManager.desktop; @@ -7,54 +7,54 @@ define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "sc function renderRecordings(elem, recordings, cardOptions) { if (recordings.length) { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } else { - elem.classList.add("hide"); + elem.classList.add('hide'); } - var recordingItems = elem.querySelector(".recordingItems"); + var recordingItems = elem.querySelector('.recordingItems'); if (enableScrollX()) { - recordingItems.classList.add("scrollX"); + recordingItems.classList.add('scrollX'); if (layoutManager.tv) { - recordingItems.classList.add("smoothScrollX"); + recordingItems.classList.add('smoothScrollX'); } - recordingItems.classList.add("hiddenScrollX"); - recordingItems.classList.remove("vertical-wrap"); + recordingItems.classList.add('hiddenScrollX'); + recordingItems.classList.remove('vertical-wrap'); } else { - recordingItems.classList.remove("scrollX"); - recordingItems.classList.remove("smoothScrollX"); - recordingItems.classList.remove("hiddenScrollX"); - recordingItems.classList.add("vertical-wrap"); + recordingItems.classList.remove('scrollX'); + recordingItems.classList.remove('smoothScrollX'); + recordingItems.classList.remove('hiddenScrollX'); + recordingItems.classList.add('vertical-wrap'); } - var supportsImageAnalysis = appHost.supports("imageanalysis"); + var supportsImageAnalysis = appHost.supports('imageanalysis'); var cardLayout = appHost.preferVisualCards || supportsImageAnalysis; cardLayout = false; recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ items: recordings, - shape: enableScrollX() ? "autooverflow" : "auto", + shape: enableScrollX() ? 'autooverflow' : 'auto', showTitle: true, showParentTitle: true, coverImage: true, cardLayout: cardLayout, centerText: !cardLayout, allowBottomPadding: !enableScrollX(), - preferThumb: "auto" + preferThumb: 'auto' }, cardOptions || {})); imageLoader.lazyChildren(recordingItems); } function getBackdropShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop"; + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function renderActiveRecordings(context, promise) { promise.then(function (result) { - renderRecordings(context.querySelector("#activeRecordings"), result.Items, { - shape: enableScrollX() ? "autooverflow" : "auto", + renderRecordings(context.querySelector('#activeRecordings'), result.Items, { + shape: enableScrollX() ? 'autooverflow' : 'auto', defaultShape: getBackdropShape(), showParentTitle: false, showParentTitleOrTitle: true, @@ -74,19 +74,19 @@ define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "sc var elem = context; if (html) { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } else { - elem.classList.add("hide"); + elem.classList.add('hide'); } - elem.querySelector(".recordingItems").innerHTML = html; + elem.querySelector('.recordingItems').innerHTML = html; imageLoader.lazyChildren(elem); }); } function renderUpcomingRecordings(context, promise) { promise.then(function (result) { - renderTimers(context.querySelector("#upcomingRecordings"), result.Items); + renderTimers(context.querySelector('#upcomingRecordings'), result.Items); loading.hide(); }); } @@ -95,7 +95,7 @@ define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "sc var activeRecordingsPromise; var upcomingRecordingsPromise; var self = this; - tabContent.querySelector("#upcomingRecordings .recordingItems").addEventListener("timercancelled", function () { + tabContent.querySelector('#upcomingRecordings .recordingItems').addEventListener('timercancelled', function () { self.preRender(); self.renderTab(); }); @@ -104,9 +104,9 @@ define(["layoutManager", "cardBuilder", "apphost", "imageLoader", "loading", "sc activeRecordingsPromise = ApiClient.getLiveTvRecordings({ UserId: Dashboard.getCurrentUserId(), IsInProgress: true, - Fields: "CanDelete,PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'CanDelete,PrimaryImageAspectRatio,BasicSyncInfo', EnableTotalRecordCount: false, - EnableImageTypes: "Primary,Thumb,Backdrop" + EnableImageTypes: 'Primary,Thumb,Backdrop' }); upcomingRecordingsPromise = ApiClient.getLiveTvTimers({ IsActive: false, diff --git a/src/controllers/livetv/livetvseriestimers.js b/src/controllers/livetv/livetvseriestimers.js index 9c95cfa91..27daca198 100644 --- a/src/controllers/livetv/livetvseriestimers.js +++ b/src/controllers/livetv/livetvseriestimers.js @@ -1,16 +1,16 @@ -define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-icon-button-light", "emby-button"], function (datetime, cardBuilder, imageLoader, appHost, loading) { - "use strict"; +define(['datetime', 'cardBuilder', 'imageLoader', 'apphost', 'loading', 'paper-icon-button-light', 'emby-button'], function (datetime, cardBuilder, imageLoader, appHost, loading) { + 'use strict'; function renderTimers(context, timers) { - var html = ""; - appHost.supports("imageanalysis"); + var html = ''; + appHost.supports('imageanalysis'); html += cardBuilder.getCardsHtml({ items: timers, - shape: "auto", - defaultShape: "portrait", + shape: 'auto', + defaultShape: 'portrait', showTitle: true, cardLayout: false, - preferThumb: "auto", + preferThumb: 'auto', coverImage: true, overlayText: false, showSeriesTimerTime: true, @@ -19,7 +19,7 @@ define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-i overlayMoreButton: true, lines: 3 }); - var elem = context.querySelector("#items"); + var elem = context.querySelector('#items'); elem.innerHTML = html; imageLoader.lazyChildren(elem); loading.hide(); @@ -33,8 +33,8 @@ define(["datetime", "cardBuilder", "imageLoader", "apphost", "loading", "paper-i } var query = { - SortBy: "SortName", - SortOrder: "Ascending" + SortBy: 'SortName', + SortOrder: 'Ascending' }; return function (view, params, tabContent) { var timersPromise; diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js index 8f65df7e6..036eee9fc 100644 --- a/src/controllers/livetv/livetvsuggested.js +++ b/src/controllers/livetv/livetvsuggested.js @@ -1,5 +1,5 @@ -define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", "libraryBrowser", "mainTabsManager", "cardBuilder", "apphost", "imageLoader", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button"], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) { - "use strict"; +define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', 'libraryBrowser', 'mainTabsManager', 'cardBuilder', 'apphost', 'imageLoader', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) { + 'use strict'; function enableScrollX() { return !layoutManager.desktop; @@ -7,16 +7,16 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", function getBackdropShape() { if (enableScrollX()) { - return "overflowBackdrop"; + return 'overflowBackdrop'; } - return "backdrop"; + return 'backdrop'; } function getPortraitShape() { if (enableScrollX()) { - return "overflowPortrait"; + return 'overflowPortrait'; } - return "portrait"; + return 'portrait'; } function getLimit() { @@ -40,17 +40,17 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", IsAiring: true, limit: limit, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Thumb,Backdrop", + EnableImageTypes: 'Primary,Thumb,Backdrop', EnableTotalRecordCount: false, - Fields: "ChannelInfo,PrimaryImageAspectRatio" + Fields: 'ChannelInfo,PrimaryImageAspectRatio' }).then(function (result) { - renderItems(page, result.Items, "activeProgramItems", "play", { + renderItems(page, result.Items, 'activeProgramItems', 'play', { showAirDateTime: false, showAirEndTime: true }); loading.hide(); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -69,10 +69,10 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", IsNews: false, IsSeries: true, EnableTotalRecordCount: false, - Fields: "ChannelInfo,PrimaryImageAspectRatio", - EnableImageTypes: "Primary,Thumb" + Fields: 'ChannelInfo,PrimaryImageAspectRatio', + EnableImageTypes: 'Primary,Thumb' }).then(function (result) { - renderItems(page, result.Items, "upcomingEpisodeItems"); + renderItems(page, result.Items, 'upcomingEpisodeItems'); }); ApiClient.getLiveTvPrograms({ userId: Dashboard.getCurrentUserId(), @@ -80,10 +80,10 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", limit: getLimit(), IsMovie: true, EnableTotalRecordCount: false, - Fields: "ChannelInfo", - EnableImageTypes: "Primary,Thumb" + Fields: 'ChannelInfo', + EnableImageTypes: 'Primary,Thumb' }).then(function (result) { - renderItems(page, result.Items, "upcomingTvMovieItems", null, { + renderItems(page, result.Items, 'upcomingTvMovieItems', null, { shape: getPortraitShape(), preferThumb: null, showParentTitle: false @@ -95,10 +95,10 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", limit: getLimit(), IsSports: true, EnableTotalRecordCount: false, - Fields: "ChannelInfo,PrimaryImageAspectRatio", - EnableImageTypes: "Primary,Thumb" + Fields: 'ChannelInfo,PrimaryImageAspectRatio', + EnableImageTypes: 'Primary,Thumb' }).then(function (result) { - renderItems(page, result.Items, "upcomingSportsItems"); + renderItems(page, result.Items, 'upcomingSportsItems'); }); ApiClient.getLiveTvPrograms({ userId: Dashboard.getCurrentUserId(), @@ -106,10 +106,10 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", limit: getLimit(), IsKids: true, EnableTotalRecordCount: false, - Fields: "ChannelInfo,PrimaryImageAspectRatio", - EnableImageTypes: "Primary,Thumb" + Fields: 'ChannelInfo,PrimaryImageAspectRatio', + EnableImageTypes: 'Primary,Thumb' }).then(function (result) { - renderItems(page, result.Items, "upcomingKidsItems"); + renderItems(page, result.Items, 'upcomingKidsItems'); }); ApiClient.getLiveTvPrograms({ userId: Dashboard.getCurrentUserId(), @@ -117,10 +117,10 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", limit: getLimit(), IsNews: true, EnableTotalRecordCount: false, - Fields: "ChannelInfo,PrimaryImageAspectRatio", - EnableImageTypes: "Primary,Thumb" + Fields: 'ChannelInfo,PrimaryImageAspectRatio', + EnableImageTypes: 'Primary,Thumb' }).then(function (result) { - renderItems(page, result.Items, "upcomingNewsItems", null, { + renderItems(page, result.Items, 'upcomingNewsItems', null, { showParentTitleOrTitle: true, showTitle: false, showParentTitle: false @@ -132,9 +132,9 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", function renderItems(page, items, sectionClass, overlayButton, cardOptions) { var html = cardBuilder.getCardsHtml(Object.assign({ items: items, - preferThumb: "auto", + preferThumb: 'auto', inheritThumb: false, - shape: enableScrollX() ? "autooverflow" : "auto", + shape: enableScrollX() ? 'autooverflow' : 'auto', defaultShape: getBackdropShape(), showParentTitle: true, showTitle: true, @@ -142,57 +142,57 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", coverImage: true, overlayText: false, lazy: true, - overlayPlayButton: "play" === overlayButton, - overlayMoreButton: "more" === overlayButton, - overlayInfoButton: "info" === overlayButton, + overlayPlayButton: 'play' === overlayButton, + overlayMoreButton: 'more' === overlayButton, + overlayInfoButton: 'info' === overlayButton, allowBottomPadding: !enableScrollX(), showAirTime: true, showAirDateTime: true }, cardOptions || {})); - var elem = page.querySelector("." + sectionClass); + var elem = page.querySelector('.' + sectionClass); elem.innerHTML = html; imageLoader.lazyChildren(elem); } function getTabs() { return [{ - name: globalize.translate("Programs") + name: globalize.translate('Programs') }, { - name: globalize.translate("TabGuide") + name: globalize.translate('TabGuide') }, { - name: globalize.translate("TabChannels") + name: globalize.translate('TabChannels') }, { - name: globalize.translate("TabRecordings") + name: globalize.translate('TabRecordings') }, { - name: globalize.translate("HeaderSchedule") + name: globalize.translate('HeaderSchedule') }, { - name: globalize.translate("TabSeries") + name: globalize.translate('TabSeries') }, { - name: globalize.translate("ButtonSearch"), - cssClass: "searchTabButton" + name: globalize.translate('ButtonSearch'), + cssClass: 'searchTabButton' }]; } function setScrollClasses(elem, scrollX) { if (scrollX) { - elem.classList.add("hiddenScrollX"); + elem.classList.add('hiddenScrollX'); if (layoutManager.tv) { - elem.classList.add("smoothScrollX"); + elem.classList.add('smoothScrollX'); } - elem.classList.add("scrollX"); - elem.classList.remove("vertical-wrap"); + elem.classList.add('scrollX'); + elem.classList.remove('vertical-wrap'); } else { - elem.classList.remove("hiddenScrollX"); - elem.classList.remove("smoothScrollX"); - elem.classList.remove("scrollX"); - elem.classList.add("vertical-wrap"); + elem.classList.remove('hiddenScrollX'); + elem.classList.remove('smoothScrollX'); + elem.classList.remove('scrollX'); + elem.classList.add('vertical-wrap'); } } function getDefaultTabIndex(folderId) { - if (userSettings.get("landing-" + folderId) === "guide") { + if (userSettings.get('landing-' + folderId) === 'guide') { return 1; } @@ -219,7 +219,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", } function getTabContainers() { - return view.querySelectorAll(".pageTabContent"); + return view.querySelectorAll('.pageTabContent'); } function initTabs() { @@ -235,27 +235,27 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", break; case 1: - depends.push("controllers/livetv/livetvguide"); + depends.push('controllers/livetv/livetvguide'); break; case 2: - depends.push("controllers/livetv/livetvchannels"); + depends.push('controllers/livetv/livetvchannels'); break; case 3: - depends.push("controllers/livetv/livetvrecordings"); + depends.push('controllers/livetv/livetvrecordings'); break; case 4: - depends.push("controllers/livetv/livetvschedule"); + depends.push('controllers/livetv/livetvschedule'); break; case 5: - depends.push("controllers/livetv/livetvseriestimers"); + depends.push('controllers/livetv/livetvseriestimers'); break; case 6: - depends.push("scripts/searchtab"); + depends.push('scripts/searchtab'); } require(depends, function (controllerFactory) { @@ -275,7 +275,7 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", controller = self; } else if (6 === index) { controller = new controllerFactory(view, tabContent, { - collectionType: "livetv" + collectionType: 'livetv' }); } else { controller = new controllerFactory(view, params, tabContent); @@ -320,28 +320,28 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", } function onInputCommand(evt) { - if (evt.detail.command === "search") { + if (evt.detail.command === 'search') { evt.preventDefault(); - Dashboard.navigate("search.html?collectionType=livetv"); + Dashboard.navigate('search.html?collectionType=livetv'); } } var isViewRestored; var self = this; - var currentTabIndex = parseInt(params.tab || getDefaultTabIndex("livetv")); + var currentTabIndex = parseInt(params.tab || getDefaultTabIndex('livetv')); var initialTabIndex = currentTabIndex; var lastFullRender = 0; - [].forEach.call(view.querySelectorAll(".sectionTitleTextButton-programs"), function (link) { + [].forEach.call(view.querySelectorAll('.sectionTitleTextButton-programs'), function (link) { var href = link.href; if (href) { - link.href = href + "&serverId=" + ApiClient.serverId(); + link.href = href + '&serverId=' + ApiClient.serverId(); } }); self.initTab = function () { var tabContent = view.querySelector(".pageTabContent[data-index='0']"); - var containers = tabContent.querySelectorAll(".itemsContainer"); + var containers = tabContent.querySelectorAll('.itemsContainer'); for (var i = 0, length = containers.length; i < length; i++) { setScrollClasses(containers[i], enableScrollX()); @@ -362,11 +362,11 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", var currentTabController; var tabControllers = []; var renderedTabs = []; - view.addEventListener("viewbeforeshow", function (evt) { + view.addEventListener('viewbeforeshow', function (evt) { isViewRestored = evt.detail.isRestored; initTabs(); }); - view.addEventListener("viewshow", function (evt) { + view.addEventListener('viewshow', function (evt) { isViewRestored = evt.detail.isRestored; if (!isViewRestored) { @@ -375,14 +375,14 @@ define(["layoutManager", "userSettings", "inputManager", "loading", "globalize", inputManager.on(window, onInputCommand); }); - view.addEventListener("viewbeforehide", function (e) { + view.addEventListener('viewbeforehide', function (e) { if (currentTabController && currentTabController.onHide) { currentTabController.onHide(); } inputManager.off(window, onInputCommand); }); - view.addEventListener("viewdestroy", function (evt) { + view.addEventListener('viewdestroy', function (evt) { tabControllers.forEach(function (tabController) { if (tabController.destroy) { tabController.destroy(); diff --git a/src/controllers/livetvguideprovider.js b/src/controllers/livetvguideprovider.js index b58000adc..e83036992 100644 --- a/src/controllers/livetvguideprovider.js +++ b/src/controllers/livetvguideprovider.js @@ -1,30 +1,30 @@ -define(["events", "loading", "globalize"], function (events, loading, globalize) { - "use strict"; +define(['events', 'loading', 'globalize'], function (events, loading, globalize) { + 'use strict'; function onListingsSubmitted() { - Dashboard.navigate("livetvstatus.html"); + Dashboard.navigate('livetvstatus.html'); } function init(page, type, providerId) { - var url = "components/tvproviders/" + type + ".js"; + var url = 'components/tvproviders/' + type + '.js'; require([url], function (factory) { var instance = new factory(page, providerId, {}); - events.on(instance, "submitted", onListingsSubmitted); + events.on(instance, 'submitted', onListingsSubmitted); instance.init(); }); } function loadTemplate(page, type, providerId) { - require(["text!./components/tvproviders/" + type + ".template.html"], function (html) { - page.querySelector(".providerTemplate").innerHTML = globalize.translateDocument(html); + require(['text!./components/tvproviders/' + type + '.template.html'], function (html) { + page.querySelector('.providerTemplate').innerHTML = globalize.translateDocument(html); init(page, type, providerId); }); } - pageIdOn("pageshow", "liveTvGuideProviderPage", function () { + pageIdOn('pageshow', 'liveTvGuideProviderPage', function () { loading.show(); - var providerId = getParameterByName("id"); - loadTemplate(this, getParameterByName("type"), providerId); + var providerId = getParameterByName('id'); + loadTemplate(this, getParameterByName('type'), providerId); }); }); diff --git a/src/controllers/livetvsettings.js b/src/controllers/livetvsettings.js index e86f08ca6..7a8552b9a 100644 --- a/src/controllers/livetvsettings.js +++ b/src/controllers/livetvsettings.js @@ -1,38 +1,38 @@ -define(["jQuery", "loading", "globalize", "fnchecked", "emby-button"], function ($, loading, globalize) { - "use strict"; +define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-button'], function ($, loading, globalize) { + 'use strict'; function loadPage(page, config) { - $(".liveTvSettingsForm", page).show(); - $(".noLiveTvServices", page).hide(); - $("#selectGuideDays", page).val(config.GuideDays || ""); - $("#txtPrePaddingMinutes", page).val(config.PrePaddingSeconds / 60); - $("#txtPostPaddingMinutes", page).val(config.PostPaddingSeconds / 60); - page.querySelector("#txtRecordingPath").value = config.RecordingPath || ""; - page.querySelector("#txtMovieRecordingPath").value = config.MovieRecordingPath || ""; - page.querySelector("#txtSeriesRecordingPath").value = config.SeriesRecordingPath || ""; - page.querySelector("#txtPostProcessor").value = config.RecordingPostProcessor || ""; - page.querySelector("#txtPostProcessorArguments").value = config.RecordingPostProcessorArguments || ""; + $('.liveTvSettingsForm', page).show(); + $('.noLiveTvServices', page).hide(); + $('#selectGuideDays', page).val(config.GuideDays || ''); + $('#txtPrePaddingMinutes', page).val(config.PrePaddingSeconds / 60); + $('#txtPostPaddingMinutes', page).val(config.PostPaddingSeconds / 60); + page.querySelector('#txtRecordingPath').value = config.RecordingPath || ''; + page.querySelector('#txtMovieRecordingPath').value = config.MovieRecordingPath || ''; + page.querySelector('#txtSeriesRecordingPath').value = config.SeriesRecordingPath || ''; + page.querySelector('#txtPostProcessor').value = config.RecordingPostProcessor || ''; + page.querySelector('#txtPostProcessorArguments').value = config.RecordingPostProcessorArguments || ''; loading.hide(); } function onSubmit() { loading.show(); var form = this; - ApiClient.getNamedConfiguration("livetv").then(function (config) { - config.GuideDays = $("#selectGuideDays", form).val() || null; - var recordingPath = form.querySelector("#txtRecordingPath").value || null; - var movieRecordingPath = form.querySelector("#txtMovieRecordingPath").value || null; - var seriesRecordingPath = form.querySelector("#txtSeriesRecordingPath").value || null; + ApiClient.getNamedConfiguration('livetv').then(function (config) { + config.GuideDays = $('#selectGuideDays', form).val() || null; + var recordingPath = form.querySelector('#txtRecordingPath').value || null; + var movieRecordingPath = form.querySelector('#txtMovieRecordingPath').value || null; + var seriesRecordingPath = form.querySelector('#txtSeriesRecordingPath').value || null; var recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath; config.RecordingPath = recordingPath; config.MovieRecordingPath = movieRecordingPath; config.SeriesRecordingPath = seriesRecordingPath; - config.RecordingEncodingFormat = "mkv"; - config.PrePaddingSeconds = 60 * $("#txtPrePaddingMinutes", form).val(); - config.PostPaddingSeconds = 60 * $("#txtPostPaddingMinutes", form).val(); - config.RecordingPostProcessor = $("#txtPostProcessor", form).val(); - config.RecordingPostProcessorArguments = $("#txtPostProcessorArguments", form).val(); - ApiClient.updateNamedConfiguration("livetv", config).then(function () { + config.RecordingEncodingFormat = 'mkv'; + config.PrePaddingSeconds = 60 * $('#txtPrePaddingMinutes', form).val(); + config.PostPaddingSeconds = 60 * $('#txtPostPaddingMinutes', form).val(); + config.RecordingPostProcessor = $('#txtPostProcessor', form).val(); + config.RecordingPostProcessorArguments = $('#txtPostProcessorArguments', form).val(); + ApiClient.updateNamedConfiguration('livetv', config).then(function () { Dashboard.processServerConfigurationUpdateResult(); showSaveMessage(recordingPathChanged); }); @@ -41,29 +41,29 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-button"], function } function showSaveMessage(recordingPathChanged) { - var msg = ""; + var msg = ''; if (recordingPathChanged) { - msg += globalize.translate("RecordingPathChangeMessage"); + msg += globalize.translate('RecordingPathChangeMessage'); } if (msg) { - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert(msg); }); } } - $(document).on("pageinit", "#liveTvSettingsPage", function () { + $(document).on('pageinit', '#liveTvSettingsPage', function () { var page = this; - $(".liveTvSettingsForm").off("submit", onSubmit).on("submit", onSubmit); - $("#btnSelectRecordingPath", page).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { + $('.liveTvSettingsForm').off('submit', onSubmit).on('submit', onSubmit); + $('#btnSelectRecordingPath', page).on('click.selectDirectory', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ callback: function (path) { if (path) { - $("#txtRecordingPath", page).val(path); + $('#txtRecordingPath', page).val(path); } picker.close(); @@ -72,13 +72,13 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-button"], function }); }); }); - $("#btnSelectMovieRecordingPath", page).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { + $('#btnSelectMovieRecordingPath', page).on('click.selectDirectory', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ callback: function (path) { if (path) { - $("#txtMovieRecordingPath", page).val(path); + $('#txtMovieRecordingPath', page).val(path); } picker.close(); @@ -87,13 +87,13 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-button"], function }); }); }); - $("#btnSelectSeriesRecordingPath", page).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { + $('#btnSelectSeriesRecordingPath', page).on('click.selectDirectory', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ callback: function (path) { if (path) { - $("#txtSeriesRecordingPath", page).val(path); + $('#txtSeriesRecordingPath', page).val(path); } picker.close(); @@ -102,14 +102,14 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-button"], function }); }); }); - $("#btnSelectPostProcessorPath", page).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { + $('#btnSelectPostProcessorPath', page).on('click.selectDirectory', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ includeFiles: true, callback: function (path) { if (path) { - $("#txtPostProcessor", page).val(path); + $('#txtPostProcessor', page).val(path); } picker.close(); @@ -117,10 +117,10 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-button"], function }); }); }); - }).on("pageshow", "#liveTvSettingsPage", function () { + }).on('pageshow', '#liveTvSettingsPage', function () { loading.show(); var page = this; - ApiClient.getNamedConfiguration("livetv").then(function (config) { + ApiClient.getNamedConfiguration('livetv').then(function (config) { loadPage(page, config); }); }); diff --git a/src/controllers/livetvstatus.js b/src/controllers/livetvstatus.js index adc436070..053e5d3d4 100644 --- a/src/controllers/livetvstatus.js +++ b/src/controllers/livetvstatus.js @@ -1,23 +1,23 @@ -define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layoutManager", "loading", "browser", "listViewStyle", "flexStyles", "emby-itemscontainer", "cardStyle", "material-icons", "emby-button"], function ($, globalize, taskButton, dom, libraryMenu, layoutManager, loading, browser) { - "use strict"; +define(['jQuery', 'globalize', 'scripts/taskbutton', 'dom', 'libraryMenu', 'layoutManager', 'loading', 'browser', 'listViewStyle', 'flexStyles', 'emby-itemscontainer', 'cardStyle', 'material-icons', 'emby-button'], function ($, globalize, taskButton, dom, libraryMenu, layoutManager, loading, browser) { + 'use strict'; var enableFocusTransform = !browser.slow && !browser.edge; function getDeviceHtml(device) { var padderClass; - var html = ""; - var cssClass = "card scalableCard"; - var cardBoxCssClass = "cardBox visualCardBox"; - cssClass += " backdropCard backdropCard-scalable"; - padderClass = "cardPadder-backdrop"; + var html = ''; + var cssClass = 'card scalableCard'; + var cardBoxCssClass = 'cardBox visualCardBox'; + cssClass += ' backdropCard backdropCard-scalable'; + padderClass = 'cardPadder-backdrop'; // TODO move card creation code to Card component if (layoutManager.tv) { - cssClass += " show-focus"; + cssClass += ' show-focus'; if (enableFocusTransform) { - cssClass += " show-animation"; + cssClass += ' show-animation'; } } @@ -26,34 +26,34 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo html += '
'; html += '
'; html += '
'; - html += '
dvr
'; - html += "
"; - html += "
"; + html += '
'; + html += ''; + html += ''; html += '
'; - html += ''; - html += '
' + (device.FriendlyName || getTunerName(device.Type)) + "
"; + html += ''; + html += '
' + (device.FriendlyName || getTunerName(device.Type)) + '
'; html += '
'; - html += device.Url || " "; - html += "
"; - html += "
"; - html += ""; - return html += ""; + html += device.Url || ' '; + html += ''; + html += ''; + html += ''; + return html += ''; } function renderDevices(page, devices) { - var html = devices.map(getDeviceHtml).join(""); - page.querySelector(".devicesList").innerHTML = html; + var html = devices.map(getDeviceHtml).join(''); + page.querySelector('.devicesList').innerHTML = html; } function deleteDevice(page, id) { - var message = globalize.translate("MessageConfirmDeleteTunerDevice"); + var message = globalize.translate('MessageConfirmDeleteTunerDevice'); - require(["confirm"], function (confirm) { - confirm(message, globalize.translate("HeaderDeleteDevice")).then(function () { + require(['confirm'], function (confirm) { + confirm(message, globalize.translate('HeaderDeleteDevice')).then(function () { loading.show(); ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl("LiveTv/TunerHosts", { + type: 'DELETE', + url: ApiClient.getUrl('LiveTv/TunerHosts', { Id: id }) }).then(function () { @@ -65,7 +65,7 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo function reload(page) { loading.show(); - ApiClient.getNamedConfiguration("livetv").then(function (config) { + ApiClient.getNamedConfiguration('livetv').then(function (config) { renderDevices(page, config.TunerHosts); renderProviders(page, config.ListingProviders); }); @@ -73,27 +73,27 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo } function submitAddDeviceForm(page) { - page.querySelector(".dlgAddDevice").close(); + page.querySelector('.dlgAddDevice').close(); loading.show(); ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("LiveTv/TunerHosts"), + type: 'POST', + url: ApiClient.getUrl('LiveTv/TunerHosts'), data: JSON.stringify({ - Type: $("#selectTunerDeviceType", page).val(), - Url: $("#txtDevicePath", page).val() + Type: $('#selectTunerDeviceType', page).val(), + Url: $('#txtDevicePath', page).val() }), - contentType: "application/json" + contentType: 'application/json' }).then(function () { reload(page); }, function () { Dashboard.alert({ - message: globalize.translate("ErrorAddingTunerDevice") + message: globalize.translate('ErrorAddingTunerDevice') }); }); } function renderProviders(page, providers) { - var html = ""; + var html = ''; if (providers.length) { html += '
'; @@ -101,27 +101,27 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo for (var i = 0, length = providers.length; i < length; i++) { var provider = providers[i]; html += '"; + html += provider.Path || provider.ListingsId || ''; + html += '
'; + html += ''; + html += ''; + html += ''; + html += ''; } - html += ""; + html += ''; } - var elem = $(".providerList", page).html(html); - $(".btnOptions", elem).on("click", function () { - var id = this.getAttribute("data-id"); + var elem = $('.providerList', page).html(html); + $('.btnOptions', elem).on('click', function () { + var id = this.getAttribute('data-id'); showProviderOptions(page, id, this); }); } @@ -129,25 +129,25 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo function showProviderOptions(page, providerId, button) { var items = []; items.push({ - name: globalize.translate("ButtonDelete"), - id: "delete" + name: globalize.translate('ButtonDelete'), + id: 'delete' }); items.push({ - name: globalize.translate("MapChannels"), - id: "map" + name: globalize.translate('MapChannels'), + id: 'map' }); - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: items, positionTo: button }).then(function (id) { switch (id) { - case "delete": + case 'delete': deleteProvider(page, providerId); break; - case "map": + case 'map': mapChannels(page, providerId); } }); @@ -155,7 +155,7 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo } function mapChannels(page, providerId) { - require(["components/channelmapper/channelmapper"], function (channelmapper) { + require(['components/channelmapper/channelmapper'], function (channelmapper) { new channelmapper({ serverId: ApiClient.serverInfo().Id, providerId: providerId @@ -164,14 +164,14 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo } function deleteProvider(page, id) { - var message = globalize.translate("MessageConfirmDeleteGuideProvider"); + var message = globalize.translate('MessageConfirmDeleteGuideProvider'); - require(["confirm"], function (confirm) { - confirm(message, globalize.translate("HeaderDeleteProvider")).then(function () { + require(['confirm'], function (confirm) { + confirm(message, globalize.translate('HeaderDeleteProvider')).then(function () { loading.show(); ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl("LiveTv/ListingProviders", { + type: 'DELETE', + url: ApiClient.getUrl('LiveTv/ListingProviders', { Id: id }) }).then(function () { @@ -185,51 +185,51 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo function getTunerName(providerId) { switch (providerId = providerId.toLowerCase()) { - case "m3u": - return "M3U"; - case "hdhomerun": - return "HDHomeRun"; - case "hauppauge": - return "Hauppauge"; - case "satip": - return "DVB"; + case 'm3u': + return 'M3U'; + case 'hdhomerun': + return 'HDHomeRun'; + case 'hauppauge': + return 'Hauppauge'; + case 'satip': + return 'DVB'; default: - return "Unknown"; + return 'Unknown'; } } function getProviderName(providerId) { switch (providerId = providerId.toLowerCase()) { - case "schedulesdirect": - return "Schedules Direct"; - case "xmltv": - return "XMLTV"; + case 'schedulesdirect': + return 'Schedules Direct'; + case 'xmltv': + return 'XMLTV'; default: - return "Unknown"; + return 'Unknown'; } } function getProviderConfigurationUrl(providerId) { switch (providerId = providerId.toLowerCase()) { - case "xmltv": - return "livetvguideprovider.html?type=xmltv"; - case "schedulesdirect": - return "livetvguideprovider.html?type=schedulesdirect"; + case 'xmltv': + return 'livetvguideprovider.html?type=xmltv'; + case 'schedulesdirect': + return 'livetvguideprovider.html?type=schedulesdirect'; } } function addProvider(button) { var menuItems = []; menuItems.push({ - name: "Schedules Direct", - id: "SchedulesDirect" + name: 'Schedules Direct', + id: 'SchedulesDirect' }); menuItems.push({ - name: "XMLTV", - id: "xmltv" + name: 'XMLTV', + id: 'xmltv' }); - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: menuItems, positionTo: button, @@ -241,81 +241,81 @@ define(["jQuery", "globalize", "scripts/taskbutton", "dom", "libraryMenu", "layo } function addDevice(button) { - Dashboard.navigate("livetvtuner.html"); + Dashboard.navigate('livetvtuner.html'); } function showDeviceMenu(button, tunerDeviceId) { var items = []; items.push({ - name: globalize.translate("ButtonDelete"), - id: "delete" + name: globalize.translate('ButtonDelete'), + id: 'delete' }); items.push({ - name: globalize.translate("ButtonEdit"), - id: "edit" + name: globalize.translate('ButtonEdit'), + id: 'edit' }); - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: items, positionTo: button }).then(function (id) { switch (id) { - case "delete": - deleteDevice(dom.parentWithClass(button, "page"), tunerDeviceId); + case 'delete': + deleteDevice(dom.parentWithClass(button, 'page'), tunerDeviceId); break; - case "edit": - Dashboard.navigate("livetvtuner.html?id=" + tunerDeviceId); + case 'edit': + Dashboard.navigate('livetvtuner.html?id=' + tunerDeviceId); } }); }); } function onDevicesListClick(e) { - var card = dom.parentWithClass(e.target, "card"); + var card = dom.parentWithClass(e.target, 'card'); if (card) { - var id = card.getAttribute("data-id"); - var btnCardOptions = dom.parentWithClass(e.target, "btnCardOptions"); + var id = card.getAttribute('data-id'); + var btnCardOptions = dom.parentWithClass(e.target, 'btnCardOptions'); if (btnCardOptions) { showDeviceMenu(btnCardOptions, id); } else { - Dashboard.navigate("livetvtuner.html?id=" + id); + Dashboard.navigate('livetvtuner.html?id=' + id); } } } - $(document).on("pageinit", "#liveTvStatusPage", function () { + $(document).on('pageinit', '#liveTvStatusPage', function () { var page = this; - $(".btnAddDevice", page).on("click", function () { + $('.btnAddDevice', page).on('click', function () { addDevice(this); }); - $(".formAddDevice", page).on("submit", function () { + $('.formAddDevice', page).on('submit', function () { submitAddDeviceForm(page); return false; }); - $(".btnAddProvider", page).on("click", function () { + $('.btnAddProvider', page).on('click', function () { addProvider(this); }); - page.querySelector(".devicesList").addEventListener("click", onDevicesListClick); - }).on("pageshow", "#liveTvStatusPage", function () { + page.querySelector('.devicesList').addEventListener('click', onDevicesListClick); + }).on('pageshow', '#liveTvStatusPage', function () { var page = this; reload(page); taskButton({ - mode: "on", - progressElem: page.querySelector(".refreshGuideProgress"), - taskKey: "RefreshGuide", - button: page.querySelector(".btnRefresh") + mode: 'on', + progressElem: page.querySelector('.refreshGuideProgress'), + taskKey: 'RefreshGuide', + button: page.querySelector('.btnRefresh') }); - }).on("pagehide", "#liveTvStatusPage", function () { + }).on('pagehide', '#liveTvStatusPage', function () { var page = this; taskButton({ - mode: "off", - progressElem: page.querySelector(".refreshGuideProgress"), - taskKey: "RefreshGuide", - button: page.querySelector(".btnRefresh") + mode: 'off', + progressElem: page.querySelector('.refreshGuideProgress'), + taskKey: 'RefreshGuide', + button: page.querySelector('.btnRefresh') }); }); }); diff --git a/src/controllers/livetvtuner.js b/src/controllers/livetvtuner.js index 55a86d4be..d7a4d92db 100644 --- a/src/controllers/livetvtuner.js +++ b/src/controllers/livetvtuner.js @@ -1,34 +1,34 @@ -define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button", "emby-checkbox", "emby-select"], function (globalize, loading, libraryMenu, dom) { - "use strict"; +define(['globalize', 'loading', 'libraryMenu', 'dom', 'emby-input', 'emby-button', 'emby-checkbox', 'emby-select'], function (globalize, loading, libraryMenu, dom) { + 'use strict'; function isM3uVariant(type) { - return ["nextpvr"].indexOf(type || "") !== -1; + return ['nextpvr'].indexOf(type || '') !== -1; } function fillTypes(view, currentId) { - return ApiClient.getJSON(ApiClient.getUrl("LiveTv/TunerHosts/Types")).then(function (types) { - var selectType = view.querySelector(".selectType"); - var html = ""; + return ApiClient.getJSON(ApiClient.getUrl('LiveTv/TunerHosts/Types')).then(function (types) { + var selectType = view.querySelector('.selectType'); + var html = ''; html += types.map(function (tuner) { - return '"; - }).join(""); + return ''; + }).join(''); html += '"; + html += globalize.translate('TabOther'); + html += ''; selectType.innerHTML = html; selectType.disabled = null != currentId; - selectType.value = ""; + selectType.value = ''; onTypeChange.call(selectType); }); } function reload(view, providerId) { - view.querySelector(".txtDevicePath").value = ""; - view.querySelector(".chkFavorite").checked = false; - view.querySelector(".txtDevicePath").value = ""; + view.querySelector('.txtDevicePath').value = ''; + view.querySelector('.chkFavorite').checked = false; + view.querySelector('.txtDevicePath').value = ''; if (providerId) { - ApiClient.getNamedConfiguration("livetv").then(function (config) { + ApiClient.getNamedConfiguration('livetv').then(function (config) { var info = config.TunerHosts.filter(function (i) { return i.Id === providerId; })[0]; @@ -38,8 +38,8 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button } function fillTunerHostInfo(view, info) { - var selectType = view.querySelector(".selectType"); - var type = info.Type || ""; + var selectType = view.querySelector('.selectType'); + var type = info.Type || ''; if (info.Source && isM3uVariant(info.Source)) { type = info.Source; @@ -47,54 +47,53 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button selectType.value = type; onTypeChange.call(selectType); - view.querySelector(".txtDevicePath").value = info.Url || ""; - view.querySelector(".txtFriendlyName").value = info.FriendlyName || ""; - view.querySelector(".txtUserAgent").value = info.UserAgent || ""; - view.querySelector(".fldDeviceId").value = info.DeviceId || ""; - view.querySelector(".chkFavorite").checked = info.ImportFavoritesOnly; - view.querySelector(".chkTranscode").checked = info.AllowHWTranscoding; - view.querySelector(".chkStreamLoop").checked = info.EnableStreamLooping; - view.querySelector(".txtTunerCount").value = info.TunerCount || "0"; + view.querySelector('.txtDevicePath').value = info.Url || ''; + view.querySelector('.txtFriendlyName').value = info.FriendlyName || ''; + view.querySelector('.txtUserAgent').value = info.UserAgent || ''; + view.querySelector('.fldDeviceId').value = info.DeviceId || ''; + view.querySelector('.chkFavorite').checked = info.ImportFavoritesOnly; + view.querySelector('.chkTranscode').checked = info.AllowHWTranscoding; + view.querySelector('.chkStreamLoop').checked = info.EnableStreamLooping; + view.querySelector('.txtTunerCount').value = info.TunerCount || '0'; } function submitForm(page) { loading.show(); var info = { - Type: page.querySelector(".selectType").value, - Url: page.querySelector(".txtDevicePath").value || null, - UserAgent: page.querySelector(".txtUserAgent").value || null, - FriendlyName: page.querySelector(".txtFriendlyName").value || null, - DeviceId: page.querySelector(".fldDeviceId").value || null, - TunerCount: page.querySelector(".txtTunerCount").value || 0, - ImportFavoritesOnly: page.querySelector(".chkFavorite").checked, - AllowHWTranscoding: page.querySelector(".chkTranscode").checked, - EnableStreamLooping: page.querySelector(".chkStreamLoop").checked + Type: page.querySelector('.selectType').value, + Url: page.querySelector('.txtDevicePath').value || null, + UserAgent: page.querySelector('.txtUserAgent').value || null, + FriendlyName: page.querySelector('.txtFriendlyName').value || null, + DeviceId: page.querySelector('.fldDeviceId').value || null, + TunerCount: page.querySelector('.txtTunerCount').value || 0, + ImportFavoritesOnly: page.querySelector('.chkFavorite').checked, + AllowHWTranscoding: page.querySelector('.chkTranscode').checked, + EnableStreamLooping: page.querySelector('.chkStreamLoop').checked }; if (isM3uVariant(info.Type)) { info.Source = info.Type; - info.Type = "m3u"; + info.Type = 'm3u'; } - var id = getParameterByName("id"); + var id = getParameterByName('id'); if (id) { info.Id = id; } - info.Id; ApiClient.ajax({ - type: "POST", - url: ApiClient.getUrl("LiveTv/TunerHosts"), + type: 'POST', + url: ApiClient.getUrl('LiveTv/TunerHosts'), data: JSON.stringify(info), - contentType: "application/json" + contentType: 'application/json' }).then(function (result) { Dashboard.processServerConfigurationUpdateResult(); - Dashboard.navigate("livetvstatus.html"); + Dashboard.navigate('livetvstatus.html'); }, function () { loading.hide(); Dashboard.alert({ - message: globalize.translate("ErrorSavingTvProvider") + message: globalize.translate('ErrorSavingTvProvider') }); }); } @@ -106,7 +105,7 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button } function getDetectedDevice() { - return getRequirePromise(["tunerPicker"]).then(function (tunerPicker) { + return getRequirePromise(['tunerPicker']).then(function (tunerPicker) { return new tunerPicker().show({ serverId: ApiClient.serverId() }); @@ -115,113 +114,113 @@ define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button function onTypeChange() { var value = this.value; - var view = dom.parentWithClass(this, "page"); - var mayIncludeUnsupportedDrmChannels = "hdhomerun" === value; - var supportsTranscoding = "hdhomerun" === value; - var supportsFavorites = "hdhomerun" === value; - var supportsTunerIpAddress = "hdhomerun" === value; - var supportsTunerFileOrUrl = "m3u" === value; - var supportsStreamLooping = "m3u" === value; - var supportsTunerCount = "m3u" === value; - var supportsUserAgent = "m3u" === value; - var suppportsSubmit = "other" !== value; + var view = dom.parentWithClass(this, 'page'); + var mayIncludeUnsupportedDrmChannels = 'hdhomerun' === value; + var supportsTranscoding = 'hdhomerun' === value; + var supportsFavorites = 'hdhomerun' === value; + var supportsTunerIpAddress = 'hdhomerun' === value; + var supportsTunerFileOrUrl = 'm3u' === value; + var supportsStreamLooping = 'm3u' === value; + var supportsTunerCount = 'm3u' === value; + var supportsUserAgent = 'm3u' === value; + var suppportsSubmit = 'other' !== value; var supportsSelectablePath = supportsTunerFileOrUrl; - var txtDevicePath = view.querySelector(".txtDevicePath"); + var txtDevicePath = view.querySelector('.txtDevicePath'); if (supportsTunerIpAddress) { - txtDevicePath.label(globalize.translate("LabelTunerIpAddress")); - view.querySelector(".fldPath").classList.remove("hide"); + txtDevicePath.label(globalize.translate('LabelTunerIpAddress')); + view.querySelector('.fldPath').classList.remove('hide'); } else if (supportsTunerFileOrUrl) { - txtDevicePath.label(globalize.translate("LabelFileOrUrl")); - view.querySelector(".fldPath").classList.remove("hide"); + txtDevicePath.label(globalize.translate('LabelFileOrUrl')); + view.querySelector('.fldPath').classList.remove('hide'); } else { - view.querySelector(".fldPath").classList.add("hide"); + view.querySelector('.fldPath').classList.add('hide'); } if (supportsSelectablePath) { - view.querySelector(".btnSelectPath").classList.remove("hide"); - view.querySelector(".txtDevicePath").setAttribute("required", "required"); + view.querySelector('.btnSelectPath').classList.remove('hide'); + view.querySelector('.txtDevicePath').setAttribute('required', 'required'); } else { - view.querySelector(".btnSelectPath").classList.add("hide"); - view.querySelector(".txtDevicePath").removeAttribute("required"); + view.querySelector('.btnSelectPath').classList.add('hide'); + view.querySelector('.txtDevicePath').removeAttribute('required'); } if (supportsUserAgent) { - view.querySelector(".fldUserAgent").classList.remove("hide"); + view.querySelector('.fldUserAgent').classList.remove('hide'); } else { - view.querySelector(".fldUserAgent").classList.add("hide"); + view.querySelector('.fldUserAgent').classList.add('hide'); } if (supportsFavorites) { - view.querySelector(".fldFavorites").classList.remove("hide"); + view.querySelector('.fldFavorites').classList.remove('hide'); } else { - view.querySelector(".fldFavorites").classList.add("hide"); + view.querySelector('.fldFavorites').classList.add('hide'); } if (supportsTranscoding) { - view.querySelector(".fldTranscode").classList.remove("hide"); + view.querySelector('.fldTranscode').classList.remove('hide'); } else { - view.querySelector(".fldTranscode").classList.add("hide"); + view.querySelector('.fldTranscode').classList.add('hide'); } if (supportsStreamLooping) { - view.querySelector(".fldStreamLoop").classList.remove("hide"); + view.querySelector('.fldStreamLoop').classList.remove('hide'); } else { - view.querySelector(".fldStreamLoop").classList.add("hide"); + view.querySelector('.fldStreamLoop').classList.add('hide'); } if (supportsTunerCount) { - view.querySelector(".fldTunerCount").classList.remove("hide"); - view.querySelector(".txtTunerCount").setAttribute("required", "required"); + view.querySelector('.fldTunerCount').classList.remove('hide'); + view.querySelector('.txtTunerCount').setAttribute('required', 'required'); } else { - view.querySelector(".fldTunerCount").classList.add("hide"); - view.querySelector(".txtTunerCount").removeAttribute("required"); + view.querySelector('.fldTunerCount').classList.add('hide'); + view.querySelector('.txtTunerCount').removeAttribute('required'); } if (mayIncludeUnsupportedDrmChannels) { - view.querySelector(".drmMessage").classList.remove("hide"); + view.querySelector('.drmMessage').classList.remove('hide'); } else { - view.querySelector(".drmMessage").classList.add("hide"); + view.querySelector('.drmMessage').classList.add('hide'); } if (suppportsSubmit) { - view.querySelector(".button-submit").classList.remove("hide"); + view.querySelector('.button-submit').classList.remove('hide'); } else { - view.querySelector(".button-submit").classList.add("hide"); + view.querySelector('.button-submit').classList.add('hide'); } } return function (view, params) { if (!params.id) { - view.querySelector(".btnDetect").classList.remove("hide"); + view.querySelector('.btnDetect').classList.remove('hide'); } - view.addEventListener("viewshow", function () { + view.addEventListener('viewshow', function () { var currentId = params.id; fillTypes(view, currentId).then(function () { reload(view, currentId); }); }); - view.querySelector("form").addEventListener("submit", function (e) { + view.querySelector('form').addEventListener('submit', function (e) { submitForm(view); e.preventDefault(); e.stopPropagation(); return false; }); - view.querySelector(".selectType").addEventListener("change", onTypeChange); - view.querySelector(".btnDetect").addEventListener("click", function () { + view.querySelector('.selectType').addEventListener('change', onTypeChange); + view.querySelector('.btnDetect').addEventListener('click', function () { getDetectedDevice().then(function (info) { fillTunerHostInfo(view, info); }); }); - view.querySelector(".btnSelectPath").addEventListener("click", function () { - require(["directorybrowser"], function (directoryBrowser) { + view.querySelector('.btnSelectPath').addEventListener('click', function () { + require(['directorybrowser'], function (directoryBrowser) { var picker = new directoryBrowser(); picker.show({ includeFiles: true, callback: function (path) { if (path) { - view.querySelector(".txtDevicePath").value = path; + view.querySelector('.txtDevicePath').value = path; } picker.close(); diff --git a/src/controllers/movies/moviecollections.js b/src/controllers/movies/moviecollections.js index 4dfe23e7a..e9ae599b9 100644 --- a/src/controllers/movies/moviecollections.js +++ b/src/controllers/movies/moviecollections.js @@ -1,5 +1,5 @@ -define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "globalize", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) { - "use strict"; +define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -9,16 +9,16 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "BoxSet", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'BoxSet', Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName", + Fields: 'PrimaryImageAspectRatio,SortName', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -38,7 +38,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey("moviecollections"); + context.savedQueryKey = libraryBrowser.getSavedQueryKey('moviecollections'); } return context.savedQueryKey; @@ -46,17 +46,17 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems(page) { @@ -99,45 +99,45 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "Thumb") { + if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "movies", + context: 'movies', overlayPlayButton: true, centerText: true, showTitle: true }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "movies", + context: 'movies', lazy: true, cardLayout: true, showTitle: true }); - } else if (viewStyle == "Banner") { + } else if (viewStyle == 'Banner') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "banner", + shape: 'banner', preferBanner: true, - context: "movies", + context: 'movies', lazy: true }); - } else if (viewStyle == "List") { + } else if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, - context: "movies", + context: 'movies', sortBy: query.SortBy }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "auto", - context: "movies", + shape: 'auto', + context: 'movies', showTitle: true, centerText: false, cardLayout: true @@ -145,8 +145,8 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "auto", - context: "movies", + shape: 'auto', + context: 'movies', centerText: true, overlayPlayButton: true, showTitle: true @@ -154,34 +154,34 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB } var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } if (!result.Items.length) { - html = '

' + globalize.translate("MessageNoCollectionsAvailable") + "

"; + html = '

' + globalize.translate('MessageNoCollectionsAvailable') + '

'; } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -196,23 +196,23 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB }; function initPage(tabContent) { - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate("OptionNameSort"), - id: "SortName" + name: globalize.translate('OptionNameSort'), + id: 'SortName' }, { - name: globalize.translate("OptionImdbRating"), - id: "CommunityRating,SortName" + name: globalize.translate('OptionImdbRating'), + id: 'CommunityRating,SortName' }, { - name: globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName" + name: globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName' }, { - name: globalize.translate("OptionParentalRating"), - id: "OfficialRating,SortName" + name: globalize.translate('OptionParentalRating'), + id: 'OfficialRating,SortName' }, { - name: globalize.translate("OptionReleaseDate"), - id: "PremiereDate,SortName" + name: globalize.translate('OptionReleaseDate'), + id: 'PremiereDate,SortName' }], callback: function () { getQuery(tabContent).StartIndex = 0; @@ -222,11 +222,11 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB button: e.target }); }); - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard,Thumb,ThumbCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); @@ -234,8 +234,8 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB onViewStyleChange(); reloadItems(tabContent); }); - tabContent.querySelector(".btnNewCollection").addEventListener("click", function () { - require(["collectionEditor"], function (collectionEditor) { + tabContent.querySelector('.btnNewCollection').addEventListener('click', function () { + require(['collectionEditor'], function (collectionEditor) { var serverId = ApiClient.serverInfo().Id; new collectionEditor().show({ items: [], diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index bb395f337..e8e49ff9d 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -1,5 +1,5 @@ -define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { - "use strict"; +define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'appRouter', 'dom', 'emby-button'], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { + 'use strict'; return function (view, params, tabContent) { function getPageData() { @@ -9,13 +9,13 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Movie", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Movie', Recursive: true, EnableTotalRecordCount: false }, - view: "Poster" + view: 'Poster' }; pageData.query.ParentId = params.topParentId; libraryBrowser.loadSavedQueryValues(key, pageData.query); @@ -29,7 +29,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader } function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey("moviegenres"); + return libraryBrowser.getSavedQueryKey('moviegenres'); } function getPromise() { @@ -43,29 +43,30 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader } function getThumbShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop"; + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function getPortraitShape() { - return enableScrollX() ? "overflowPortrait" : "portrait"; + return enableScrollX() ? 'overflowPortrait' : 'portrait'; } - function fillItemsContainer(elem) { - var id = elem.getAttribute("data-id"); + function fillItemsContainer(entry) { + var elem = entry.target; + var id = elem.getAttribute('data-id'); var viewStyle = self.getCurrentViewStyle(); - var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9; + var limit = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 5 : 9; if (enableScrollX()) { limit = 10; } - var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary"; + var enableImageTypes = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 'Primary,Backdrop,Thumb' : 'Primary'; var query = { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Movie", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Movie', Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', ImageTypeLimit: 1, EnableImageTypes: enableImageTypes, Limit: limit, @@ -74,9 +75,9 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader ParentId: params.topParentId }; ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { - var supportsImageAnalysis = appHost.supports("imageanalysis"); + var supportsImageAnalysis = appHost.supports('imageanalysis'); - if (viewStyle == "Thumb") { + if (viewStyle == 'Thumb') { cardBuilder.buildCards(result.Items, { itemsContainer: elem, shape: getThumbShape(), @@ -87,7 +88,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader overlayMoreButton: true, allowBottomPadding: false }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { cardBuilder.buildCards(result.Items, { itemsContainer: elem, shape: getThumbShape(), @@ -98,7 +99,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader cardLayout: true, showYear: true }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { cardBuilder.buildCards(result.Items, { itemsContainer: elem, shape: getPortraitShape(), @@ -108,7 +109,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader cardLayout: true, showYear: true }); - } else if (viewStyle == "Poster") { + } else if (viewStyle == 'Poster') { cardBuilder.buildCards(result.Items, { itemsContainer: elem, shape: getPortraitShape(), @@ -121,7 +122,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader }); } if (result.Items.length >= query.Limit) { - tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide"); + tabContent.querySelector('.btnMoreFromGenre' + id + ' .material-icons').classList.remove('hide'); } }); } @@ -129,8 +130,8 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader function reloadItems(context, promise) { var query = getQuery(); promise.then(function (result) { - var elem = context.querySelector("#items"); - var html = ""; + var elem = context.querySelector('#items'); + var html = ''; var items = result.Items; for (var i = 0, length = items.length; i < length; i++) { @@ -139,20 +140,20 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader html += '
'; html += '"; + html += ''; + html += ''; + html += ''; + html += '
'; if (enableScrollX()) { - var scrollXClass = "scrollX hiddenScrollX"; + var scrollXClass = 'scrollX hiddenScrollX'; if (layoutManager.tv) { - scrollXClass += "smoothScrollX padded-top-focusscale padded-bottom-focusscale"; + scrollXClass += 'smoothScrollX padded-top-focusscale padded-bottom-focusscale'; } html += '
'; @@ -160,8 +161,8 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader html += '
'; } - html += "
"; - html += "
"; + html += ''; + html += ''; } elem.innerHTML = html; @@ -180,7 +181,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader var data = {}; self.getViewStyles = function () { - return "Poster,PosterCard,Thumb,ThumbCard".split(","); + return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); }; self.getCurrentViewStyle = function () { diff --git a/src/controllers/movies/movies.js b/src/controllers/movies/movies.js index 9748da62d..89bcc215e 100644 --- a/src/controllers/movies/movies.js +++ b/src/controllers/movies/movies.js @@ -1,17 +1,17 @@ -define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", "alphaPicker", "listView", "cardBuilder", "globalize", "emby-itemscontainer"], function (loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder, globalize) { - "use strict"; +define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', 'alphaPicker', 'listView', 'cardBuilder', 'globalize', 'emby-itemscontainer'], function (loading, layoutManager, userSettings, events, libraryBrowser, alphaPicker, listView, cardBuilder, globalize) { + 'use strict'; return function (view, params, tabContent, options) { function onViewStyleChange() { - if (self.getCurrentViewStyle() == "List") { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if (self.getCurrentViewStyle() == 'List') { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function updateFilterControls() { @@ -63,26 +63,26 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", }); var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } isLoading = false; loading.hide(); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(tabContent); }); } @@ -91,49 +91,49 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", var html; var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "Thumb") { + if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ items: items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "movies", + context: 'movies', lazy: true, overlayPlayButton: true, showTitle: true, showYear: true, centerText: true }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { html = cardBuilder.getCardsHtml({ items: items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "movies", + context: 'movies', lazy: true, cardLayout: true, showTitle: true, showYear: true, centerText: true }); - } else if (viewStyle == "Banner") { + } else if (viewStyle == 'Banner') { html = cardBuilder.getCardsHtml({ items: items, - shape: "banner", + shape: 'banner', preferBanner: true, - context: "movies", + context: 'movies', lazy: true }); - } else if (viewStyle == "List") { + } else if (viewStyle == 'List') { html = listView.getListViewHtml({ items: items, - context: "movies", + context: 'movies', sortBy: query.SortBy }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: items, - shape: "portrait", - context: "movies", + shape: 'portrait', + context: 'movies', showTitle: true, showYear: true, centerText: true, @@ -143,8 +143,8 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", } else { html = cardBuilder.getCardsHtml({ items: items, - shape: "portrait", - context: "movies", + shape: 'portrait', + context: 'movies', overlayPlayButton: true, showTitle: true, showYear: true, @@ -159,10 +159,10 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", itemsContainer.fetchData = fetchData; itemsContainer.getItemsHtml = getItemsHtml; itemsContainer.afterRefresh = afterRefresh; - var alphaPickerElement = tabContent.querySelector(".alphaPicker"); + var alphaPickerElement = tabContent.querySelector('.alphaPicker'); if (alphaPickerElement) { - alphaPickerElement.addEventListener("alphavaluechanged", function (e) { + alphaPickerElement.addEventListener('alphavaluechanged', function (e) { var newValue = e.detail.value; query.NameStartsWithOrGreater = newValue; query.StartIndex = 0; @@ -170,53 +170,53 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: "click" + valueChangeEvent: 'click' }); - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - itemsContainer.classList.add("padded-right-withalphapicker"); + tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + itemsContainer.classList.add('padded-right-withalphapicker'); } - var btnFilter = tabContent.querySelector(".btnFilter"); + var btnFilter = tabContent.querySelector('.btnFilter'); if (btnFilter) { - btnFilter.addEventListener("click", function () { + btnFilter.addEventListener('click', function () { self.showFilterMenu(); }); } - var btnSort = tabContent.querySelector(".btnSort"); + var btnSort = tabContent.querySelector('.btnSort'); if (btnSort) { - btnSort.addEventListener("click", function (e) { + btnSort.addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate("OptionNameSort"), - id: "SortName,ProductionYear" + name: globalize.translate('OptionNameSort'), + id: 'SortName,ProductionYear' }, { - name: globalize.translate("OptionImdbRating"), - id: "CommunityRating,SortName,ProductionYear" + name: globalize.translate('OptionImdbRating'), + id: 'CommunityRating,SortName,ProductionYear' }, { - name: globalize.translate("OptionCriticRating"), - id: "CriticRating,SortName,ProductionYear" + name: globalize.translate('OptionCriticRating'), + id: 'CriticRating,SortName,ProductionYear' }, { - name: globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName,ProductionYear" + name: globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName,ProductionYear' }, { - name: globalize.translate("OptionDatePlayed"), - id: "DatePlayed,SortName,ProductionYear" + name: globalize.translate('OptionDatePlayed'), + id: 'DatePlayed,SortName,ProductionYear' }, { - name: globalize.translate("OptionParentalRating"), - id: "OfficialRating,SortName,ProductionYear" + name: globalize.translate('OptionParentalRating'), + id: 'OfficialRating,SortName,ProductionYear' }, { - name: globalize.translate("OptionPlayCount"), - id: "PlayCount,SortName,ProductionYear" + name: globalize.translate('OptionPlayCount'), + id: 'PlayCount,SortName,ProductionYear' }, { - name: globalize.translate("OptionReleaseDate"), - id: "PremiereDate,SortName,ProductionYear" + name: globalize.translate('OptionReleaseDate'), + id: 'PremiereDate,SortName,ProductionYear' }, { - name: globalize.translate("OptionRuntime"), - id: "Runtime,SortName,ProductionYear" + name: globalize.translate('OptionRuntime'), + id: 'Runtime,SortName,ProductionYear' }], callback: function () { query.StartIndex = 0; @@ -228,11 +228,11 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", }); }); } - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; userSettings.set(savedViewKey, viewStyle); query.StartIndex = 0; @@ -242,17 +242,17 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", } var self = this; - var itemsContainer = tabContent.querySelector(".itemsContainer"); - var savedQueryKey = params.topParentId + "-" + options.mode; - var savedViewKey = savedQueryKey + "-view"; + var itemsContainer = tabContent.querySelector('.itemsContainer'); + var savedQueryKey = params.topParentId + '-' + options.mode; + var savedViewKey = savedQueryKey + '-view'; var query = { - SortBy: "SortName,ProductionYear", - SortOrder: "Ascending", - IncludeItemTypes: "Movie", + SortBy: 'SortName,ProductionYear', + SortOrder: 'Ascending', + IncludeItemTypes: 'Movie', Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0, ParentId: params.topParentId }; @@ -263,20 +263,20 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", var isLoading = false; - if (options.mode === "favorites") { + if (options.mode === 'favorites') { query.IsFavorite = true; } query = userSettings.loadQuerySettings(savedQueryKey, query); self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function (filterDialogFactory) { + require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { var filterDialog = new filterDialogFactory({ query: query, - mode: "movies", + mode: 'movies', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { query.StartIndex = 0; itemsContainer.refreshItems(); }); @@ -285,7 +285,7 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser", }; self.getCurrentViewStyle = function () { - return userSettings.get(savedViewKey) || "Poster"; + return userSettings.get(savedViewKey) || 'Poster'; }; self.initTab = function () { diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index 5f341d3e3..d948c1cef 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -1,31 +1,31 @@ -define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu", "mainTabsManager", "cardBuilder", "dom", "imageLoader", "playbackManager", "globalize", "emby-scroller", "emby-itemscontainer", "emby-tabs", "emby-button"], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager, globalize) { - "use strict"; +define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu', 'mainTabsManager', 'cardBuilder', 'dom', 'imageLoader', 'playbackManager', 'globalize', 'emby-scroller', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager, globalize) { + 'use strict'; function enableScrollX() { return !layoutManager.desktop; } function getPortraitShape() { - return enableScrollX() ? "overflowPortrait" : "portrait"; + return enableScrollX() ? 'overflowPortrait' : 'portrait'; } function getThumbShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop"; + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function loadLatest(page, userId, parentId) { var options = { - IncludeItemTypes: "Movie", + IncludeItemTypes: 'Movie', Limit: 18, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', ParentId: parentId, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', EnableTotalRecordCount: false }; - ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) { + ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { var allowBottomPadding = !enableScrollX(); - var container = page.querySelector("#recentlyAddedItems"); + var container = page.querySelector('#recentlyAddedItems'); cardBuilder.buildCards(items, { itemsContainer: container, shape: getPortraitShape(), @@ -45,28 +45,28 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" function loadResume(page, userId, parentId) { var screenWidth = dom.getWindowSize().innerWidth; var options = { - SortBy: "DatePlayed", - SortOrder: "Descending", - IncludeItemTypes: "Movie", - Filters: "IsResumable", + SortBy: 'DatePlayed', + SortOrder: 'Descending', + IncludeItemTypes: 'Movie', + Filters: 'IsResumable', Limit: screenWidth >= 1920 ? 5 : screenWidth >= 1600 ? 5 : 3, Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', CollapseBoxSetItems: false, ParentId: parentId, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', EnableTotalRecordCount: false }; ApiClient.getItems(userId, options).then(function (result) { if (result.Items.length) { - page.querySelector("#resumableSection").classList.remove("hide"); + page.querySelector('#resumableSection').classList.remove('hide'); } else { - page.querySelector("#resumableSection").classList.add("hide"); + page.querySelector('#resumableSection').classList.add('hide'); } var allowBottomPadding = !enableScrollX(); - var container = page.querySelector("#resumableItems"); + var container = page.querySelector('#resumableItems'); cardBuilder.buildCards(result.Items, { itemsContainer: container, preferThumb: true, @@ -86,31 +86,31 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" } function getRecommendationHtml(recommendation) { - var html = ""; - var title = ""; + var html = ''; + var title = ''; switch (recommendation.RecommendationType) { - case "SimilarToRecentlyPlayed": - title = globalize.translate("RecommendationBecauseYouWatched", recommendation.BaselineItemName); + case 'SimilarToRecentlyPlayed': + title = globalize.translate('RecommendationBecauseYouWatched', recommendation.BaselineItemName); break; - case "SimilarToLikedItem": - title = globalize.translate("RecommendationBecauseYouLike", recommendation.BaselineItemName); + case 'SimilarToLikedItem': + title = globalize.translate('RecommendationBecauseYouLike', recommendation.BaselineItemName); break; - case "HasDirectorFromRecentlyPlayed": - case "HasLikedDirector": - title = globalize.translate("RecommendationDirectedBy", recommendation.BaselineItemName); + case 'HasDirectorFromRecentlyPlayed': + case 'HasLikedDirector': + title = globalize.translate('RecommendationDirectedBy', recommendation.BaselineItemName); break; - case "HasActorFromRecentlyPlayed": - case "HasLikedActor": - title = globalize.translate("RecommendationStarring", recommendation.BaselineItemName); + case 'HasActorFromRecentlyPlayed': + case 'HasLikedActor': + title = globalize.translate('RecommendationStarring', recommendation.BaselineItemName); break; } html += '
'; - html += '

' + title + "

"; + html += '

' + title + '

'; var allowBottomPadding = true; if (enableScrollX()) { @@ -133,31 +133,31 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" if (enableScrollX()) { html += '
'; } - html += ""; - html += ""; + html += ''; + html += ''; return html; } function loadSuggestions(page, userId, parentId) { var screenWidth = dom.getWindowSize().innerWidth; - var url = ApiClient.getUrl("Movies/Recommendations", { + var url = ApiClient.getUrl('Movies/Recommendations', { userId: userId, categoryLimit: 6, ItemLimit: screenWidth >= 1920 ? 8 : screenWidth >= 1600 ? 8 : screenWidth >= 1200 ? 6 : 5, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb' }); ApiClient.getJSON(url).then(function (recommendations) { if (!recommendations.length) { - page.querySelector(".noItemsMessage").classList.remove("hide"); - page.querySelector(".recommendations").innerHTML = ""; + page.querySelector('.noItemsMessage').classList.remove('hide'); + page.querySelector('.recommendations').innerHTML = ''; return; } - var html = recommendations.map(getRecommendationHtml).join(""); - page.querySelector(".noItemsMessage").classList.add("hide"); - var recs = page.querySelector(".recommendations"); + var html = recommendations.map(getRecommendationHtml).join(''); + page.querySelector('.noItemsMessage').classList.add('hide'); + var recs = page.querySelector('.recommendations'); recs.innerHTML = html; imageLoader.lazyChildren(recs); @@ -167,33 +167,33 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" } function autoFocus(page) { - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); } function setScrollClasses(elem, scrollX) { if (scrollX) { - elem.classList.add("hiddenScrollX"); + elem.classList.add('hiddenScrollX'); if (layoutManager.tv) { - elem.classList.add("smoothScrollX"); - elem.classList.add("padded-top-focusscale"); - elem.classList.add("padded-bottom-focusscale"); + elem.classList.add('smoothScrollX'); + elem.classList.add('padded-top-focusscale'); + elem.classList.add('padded-bottom-focusscale'); } - elem.classList.add("scrollX"); - elem.classList.remove("vertical-wrap"); + elem.classList.add('scrollX'); + elem.classList.remove('vertical-wrap'); } else { - elem.classList.remove("hiddenScrollX"); - elem.classList.remove("smoothScrollX"); - elem.classList.remove("scrollX"); - elem.classList.add("vertical-wrap"); + elem.classList.remove('hiddenScrollX'); + elem.classList.remove('smoothScrollX'); + elem.classList.remove('scrollX'); + elem.classList.add('vertical-wrap'); } } function initSuggestedTab(page, tabContent) { - var containers = tabContent.querySelectorAll(".itemsContainer"); + var containers = tabContent.querySelectorAll('.itemsContainer'); for (var i = 0, length = containers.length; i < length; i++) { setScrollClasses(containers[i], enableScrollX()); @@ -203,7 +203,7 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" function loadSuggestionsTab(view, params, tabContent) { var parentId = params.topParentId; var userId = ApiClient.getCurrentUserId(); - console.debug("loadSuggestionsTab"); + console.debug('loadSuggestionsTab'); loadResume(tabContent, userId, parentId); loadLatest(tabContent, userId, parentId); loadSuggestions(tabContent, userId, parentId); @@ -211,35 +211,35 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" function getTabs() { return [{ - name: globalize.translate("Movies") + name: globalize.translate('Movies') }, { - name: globalize.translate("TabSuggestions") + name: globalize.translate('TabSuggestions') }, { - name: globalize.translate("TabTrailers") + name: globalize.translate('TabTrailers') }, { - name: globalize.translate("TabFavorites") + name: globalize.translate('TabFavorites') }, { - name: globalize.translate("TabCollections") + name: globalize.translate('TabCollections') }, { - name: globalize.translate("TabGenres") + name: globalize.translate('TabGenres') }, { - name: globalize.translate("ButtonSearch"), - cssClass: "searchTabButton" + name: globalize.translate('ButtonSearch'), + cssClass: 'searchTabButton' }]; } function getDefaultTabIndex(folderId) { - switch (userSettings.get("landing-" + folderId)) { - case "suggestions": + switch (userSettings.get('landing-' + folderId)) { + case 'suggestions': return 1; - case "favorites": + case 'favorites': return 3; - case "collections": + case 'collections': return 4; - case "genres": + case 'genres': return 5; default: @@ -258,7 +258,7 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" } function getTabContainers() { - return view.querySelectorAll(".pageTabContent"); + return view.querySelectorAll('.pageTabContent'); } function initTabs() { @@ -270,30 +270,30 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" switch (index) { case 0: - depends.push("controllers/movies/movies"); + depends.push('controllers/movies/movies'); break; case 1: break; case 2: - depends.push("controllers/movies/movietrailers"); + depends.push('controllers/movies/movietrailers'); break; case 3: - depends.push("controllers/movies/movies"); + depends.push('controllers/movies/movies'); break; case 4: - depends.push("controllers/movies/moviecollections"); + depends.push('controllers/movies/moviecollections'); break; case 5: - depends.push("controllers/movies/moviegenres"); + depends.push('controllers/movies/moviegenres'); break; case 6: - depends.push("scripts/searchtab"); + depends.push('scripts/searchtab'); } require(depends, function (controllerFactory) { @@ -313,12 +313,12 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" controller = self; } else if (index === 6) { controller = new controllerFactory(view, tabContent, { - collectionType: "movies", + collectionType: 'movies', parentId: params.topParentId }); } else if (index == 0 || index == 3) { controller = new controllerFactory(view, params, tabContent, { - mode: index ? "favorites" : "movies" + mode: index ? 'favorites' : 'movies' }); } else { controller = new controllerFactory(view, params, tabContent); @@ -356,7 +356,7 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" } function onPlaybackStop(e, state) { - if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") { + if (state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { renderedTabs = []; mainTabsManager.getTabsElement().triggerTabChange(); } @@ -364,9 +364,9 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" function onInputCommand(e) { switch (e.detail.command) { - case "search": + case 'search': e.preventDefault(); - Dashboard.navigate("search.html?collectionType=movies&parentId=" + params.topParentId); + Dashboard.navigate('search.html?collectionType=movies&parentId=' + params.topParentId); } } @@ -388,28 +388,28 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" var tabControllers = []; var renderedTabs = []; - view.addEventListener("viewshow", function (e) { - if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute("data-title")) { + view.addEventListener('viewshow', function (e) { + if (isViewRestored = e.detail.isRestored, initTabs(), !view.getAttribute('data-title')) { var parentId = params.topParentId; if (parentId) { ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) { - view.setAttribute("data-title", item.Name); + view.setAttribute('data-title', item.Name); libraryMenu.setTitle(item.Name); }); } else { - view.setAttribute("data-title", globalize.translate("TabMovies")); - libraryMenu.setTitle(globalize.translate("TabMovies")); + view.setAttribute('data-title', globalize.translate('TabMovies')); + libraryMenu.setTitle(globalize.translate('TabMovies')); } } - events.on(playbackManager, "playbackstop", onPlaybackStop); + events.on(playbackManager, 'playbackstop', onPlaybackStop); inputManager.on(window, onInputCommand); }); - view.addEventListener("viewbeforehide", function (e) { + view.addEventListener('viewbeforehide', function (e) { inputManager.off(window, onInputCommand); }); - view.addEventListener("viewdestroy", function (e) { + view.addEventListener('viewdestroy', function (e) { tabControllers.forEach(function (t) { if (t.destroy) { t.destroy(); diff --git a/src/controllers/movies/movietrailers.js b/src/controllers/movies/movietrailers.js index 590b204b2..25d41d4fb 100644 --- a/src/controllers/movies/movietrailers.js +++ b/src/controllers/movies/movietrailers.js @@ -1,5 +1,5 @@ -define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "globalize", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { - "use strict"; +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -9,16 +9,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Trailer", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Trailer', Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -37,7 +37,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey("trailers"); + context.savedQueryKey = libraryBrowser.getSavedQueryKey('trailers'); } return context.savedQueryKey; @@ -85,43 +85,43 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var html; var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "Thumb") { + if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "movies", + context: 'movies', overlayPlayButton: true }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "movies", + context: 'movies', cardLayout: true, showTitle: true, showYear: true, centerText: true }); - } else if (viewStyle == "Banner") { + } else if (viewStyle == 'Banner') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "banner", + shape: 'banner', preferBanner: true, - context: "movies" + context: 'movies' }); - } else if (viewStyle == "List") { + } else if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, - context: "movies", + context: 'movies', sortBy: query.SortBy }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "portrait", - context: "movies", + shape: 'portrait', + context: 'movies', showTitle: true, showYear: true, cardLayout: true, @@ -130,8 +130,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "portrait", - context: "movies", + shape: 'portrait', + context: 'movies', centerText: true, overlayPlayButton: true, showTitle: true, @@ -141,27 +141,27 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } if (!result.Items.length) { - html = '

' + globalize.translate("MessageNoTrailersFound") + "

"; + html = '

' + globalize.translate('MessageNoTrailersFound') + '

'; } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(tabContent), query); @@ -180,13 +180,13 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function (filterDialogFactory) { + require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: "movies", + mode: 'movies', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery(tabContent).StartIndex = 0; reloadItems(); }); @@ -199,9 +199,9 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector(".alphaPicker"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); - alphaPickerElement.addEventListener("alphavaluechanged", function (e) { + var alphaPickerElement = tabContent.querySelector('.alphaPicker'); + var itemsContainer = tabContent.querySelector('.itemsContainer'); + alphaPickerElement.addEventListener('alphavaluechanged', function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; @@ -210,39 +210,39 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: "click" + valueChangeEvent: 'click' }); - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - itemsContainer.classList.add("padded-right-withalphapicker"); + tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate("OptionNameSort"), - id: "SortName" + name: globalize.translate('OptionNameSort'), + id: 'SortName' }, { - name: globalize.translate("OptionImdbRating"), - id: "CommunityRating,SortName" + name: globalize.translate('OptionImdbRating'), + id: 'CommunityRating,SortName' }, { - name: globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName" + name: globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName' }, { - name: globalize.translate("OptionDatePlayed"), - id: "DatePlayed,SortName" + name: globalize.translate('OptionDatePlayed'), + id: 'DatePlayed,SortName' }, { - name: globalize.translate("OptionParentalRating"), - id: "OfficialRating,SortName" + name: globalize.translate('OptionParentalRating'), + id: 'OfficialRating,SortName' }, { - name: globalize.translate("OptionPlayCount"), - id: "PlayCount,SortName" + name: globalize.translate('OptionPlayCount'), + id: 'PlayCount,SortName' }, { - name: globalize.translate("OptionReleaseDate"), - id: "PremiereDate,SortName" + name: globalize.translate('OptionReleaseDate'), + id: 'PremiereDate,SortName' }], callback: function () { getQuery(tabContent).StartIndex = 0; diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 580f30bce..ecb51f9dc 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -1,5 +1,5 @@ -define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "globalize", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { - "use strict"; +define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings, globalize) { + 'use strict'; return function (view, params, tabContent) { function playAll() { @@ -23,16 +23,16 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser if (!pageData) { pageData = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "MusicAlbum", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'MusicAlbum', Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -52,7 +52,7 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser function getSavedQueryKey() { if (!savedQueryKey) { - savedQueryKey = libraryBrowser.getSavedQueryKey("musicalbums"); + savedQueryKey = libraryBrowser.getSavedQueryKey('musicalbums'); } return savedQueryKey; @@ -60,17 +60,17 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems(page) { @@ -114,18 +114,18 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "List") { + if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, - context: "music", + context: 'music', sortBy: query.SortBy, addToListButton: true }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", - context: "music", + shape: 'square', + context: 'music', showTitle: true, coverImage: true, showParentTitle: true, @@ -135,8 +135,8 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", - context: "music", + shape: 'square', + context: 'music', showTitle: true, showParentTitle: true, lazy: true, @@ -146,30 +146,30 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser } var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(tabContent); }); }); @@ -186,13 +186,13 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function (filterDialogFactory) { + require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { var filterDialog = new filterDialogFactory({ query: getQuery(), - mode: "albums", + mode: 'albums', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery().StartIndex = 0; reloadItems(tabContent); }); @@ -205,10 +205,10 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector(".alphaPicker"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var alphaPickerElement = tabContent.querySelector('.alphaPicker'); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - alphaPickerElement.addEventListener("alphavaluechanged", function (e) { + alphaPickerElement.addEventListener('alphavaluechanged', function (e) { var newValue = e.detail.value; var query = getQuery(); query.NameStartsWithOrGreater = newValue; @@ -217,39 +217,39 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: "click" + valueChangeEvent: 'click' }); - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - itemsContainer.classList.add("padded-right-withalphapicker"); + tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate("OptionNameSort"), - id: "SortName" + name: globalize.translate('OptionNameSort'), + id: 'SortName' }, { - name: globalize.translate("OptionAlbumArtist"), - id: "AlbumArtist,SortName" + name: globalize.translate('OptionAlbumArtist'), + id: 'AlbumArtist,SortName' }, { - name: globalize.translate("OptionCommunityRating"), - id: "CommunityRating,SortName" + name: globalize.translate('OptionCommunityRating'), + id: 'CommunityRating,SortName' }, { - name: globalize.translate("OptionCriticRating"), - id: "CriticRating,SortName" + name: globalize.translate('OptionCriticRating'), + id: 'CriticRating,SortName' }, { - name: globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName" + name: globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName' }, { - name: globalize.translate("OptionReleaseDate"), - id: "ProductionYear,PremiereDate,SortName" + name: globalize.translate('OptionReleaseDate'), + id: 'ProductionYear,PremiereDate,SortName' }, { - name: globalize.translate("OptionRandom"), - id: "Random,SortName" + name: globalize.translate('OptionRandom'), + id: 'Random,SortName' }], callback: function () { getQuery().StartIndex = 0; @@ -259,11 +259,11 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser button: e.target }); }); - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; getPageData().view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); @@ -271,8 +271,8 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser onViewStyleChange(); reloadItems(tabContent); }); - tabContent.querySelector(".btnPlayAll").addEventListener("click", playAll); - tabContent.querySelector(".btnShuffle").addEventListener("click", shuffle); + tabContent.querySelector('.btnPlayAll').addEventListener('click', playAll); + tabContent.querySelector('.btnShuffle').addEventListener('click', shuffle); } initPage(tabContent); diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index 6048b9920..bd9341be6 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -1,5 +1,5 @@ -define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost, userSettings) { - "use strict"; +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost, userSettings) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -8,13 +8,13 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " if (!pageData) { var queryValues = { - SortBy: "SortName", - SortOrder: "Ascending", + SortBy: 'SortName', + SortOrder: 'Ascending', Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,SortName,BasicSyncInfo', StartIndex: 0, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb" + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb' }; if (userSettings.libraryPageSize() > 0) { @@ -23,7 +23,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " pageData = data[key] = { query: queryValues, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; pageData.query.ParentId = params.topParentId; libraryBrowser.loadSavedQueryValues(key, pageData.query); @@ -46,17 +46,17 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems(page) { @@ -103,16 +103,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "List") { + if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, sortBy: query.SortBy }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", - context: "music", + shape: 'square', + context: 'music', showTitle: true, coverImage: true, cardLayout: true @@ -120,8 +120,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", - context: "music", + shape: 'square', + context: 'music', showTitle: true, coverImage: true, lazy: true, @@ -131,30 +131,30 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(tabContent); }); }); @@ -170,13 +170,13 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function (filterDialogFactory) { + require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: self.mode, serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery(tabContent).StartIndex = 0; reloadItems(tabContent); }); @@ -189,10 +189,10 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector(".alphaPicker"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var alphaPickerElement = tabContent.querySelector('.alphaPicker'); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - alphaPickerElement.addEventListener("alphavaluechanged", function (e) { + alphaPickerElement.addEventListener('alphavaluechanged', function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; @@ -201,21 +201,21 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: "click" + valueChangeEvent: 'click' }); - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - itemsContainer.classList.add("padded-right-withalphapicker"); + tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); diff --git a/src/controllers/music/musicgenres.js b/src/controllers/music/musicgenres.js index c1338bc22..82f2eba57 100644 --- a/src/controllers/music/musicgenres.js +++ b/src/controllers/music/musicgenres.js @@ -1,5 +1,5 @@ -define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { - "use strict"; +define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { + 'use strict'; return function (view, params, tabContent) { function getPageData() { @@ -9,13 +9,13 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", + SortBy: 'SortName', + SortOrder: 'Ascending', Recursive: true, - Fields: "PrimaryImageAspectRatio,ItemCounts", + Fields: 'PrimaryImageAspectRatio,ItemCounts', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; pageData.query.ParentId = params.topParentId; libraryBrowser.loadSavedQueryValues(key, pageData.query); @@ -29,7 +29,7 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f } function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey("genres"); + return libraryBrowser.getSavedQueryKey('genres'); } function getPromise() { @@ -41,40 +41,40 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f function reloadItems(context, promise) { var query = getQuery(); promise.then(function (result) { - var html = ""; + var html = ''; var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "Thumb") { + if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, context: 'music', centerText: true, overlayMoreButton: true, showTitle: true }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, context: 'music', cardLayout: true, showTitle: true }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "auto", + shape: 'auto', context: 'music', cardLayout: true, showTitle: true }); - } else if (viewStyle == "Poster") { + } else if (viewStyle == 'Poster') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "auto", + shape: 'auto', context: 'music', centerText: true, overlayMoreButton: true, @@ -82,13 +82,13 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f }); } - var elem = context.querySelector("#items"); + var elem = context.querySelector('#items'); elem.innerHTML = html; imageLoader.lazyChildren(elem); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(context); }); }); @@ -103,7 +103,7 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f var data = {}; self.getViewStyles = function () { - return "Poster,PosterCard,Thumb,ThumbCard".split(","); + return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); }; self.getCurrentViewStyle = function () { diff --git a/src/controllers/music/musicplaylists.js b/src/controllers/music/musicplaylists.js index 795eaba79..f50848921 100644 --- a/src/controllers/music/musicplaylists.js +++ b/src/controllers/music/musicplaylists.js @@ -1,5 +1,5 @@ -define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { - "use strict"; +define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { + 'use strict'; return function (view, params, tabContent) { function getPageData() { @@ -9,14 +9,14 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Playlist", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Playlist', Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,CanDelete", + Fields: 'PrimaryImageAspectRatio,SortName,CanDelete', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; pageData.query.ParentId = params.topParentId; libraryBrowser.loadSavedQueryValues(key, pageData.query); @@ -30,7 +30,7 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f } function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey("genres"); + return libraryBrowser.getSavedQueryKey('genres'); } function getPromise() { @@ -42,10 +42,10 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f function reloadItems(context, promise) { var query = getQuery(); promise.then(function (result) { - var html = ""; + var html = ''; html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", + shape: 'square', showTitle: true, coverImage: true, centerText: true, @@ -53,13 +53,13 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f allowBottomPadding: true, cardLayout: false }); - var elem = context.querySelector("#items"); + var elem = context.querySelector('#items'); elem.innerHTML = html; imageLoader.lazyChildren(elem); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(context); }); }); diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index 14a231a34..3f025799f 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -1,5 +1,5 @@ -define(["browser", "layoutManager", "userSettings", "inputManager", "loading", "cardBuilder", "dom", "apphost", "imageLoader", "libraryMenu", "playbackManager", "mainTabsManager", "globalize", "scrollStyles", "emby-itemscontainer", "emby-tabs", "emby-button", "flexStyles"], function (browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager, globalize) { - "use strict"; +define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', 'cardBuilder', 'dom', 'apphost', 'imageLoader', 'libraryMenu', 'playbackManager', 'mainTabsManager', 'globalize', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button', 'flexStyles'], function (browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager, globalize) { + 'use strict'; function itemsPerRow() { var screenWidth = dom.getWindowSize().innerWidth; @@ -24,24 +24,24 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " } function getSquareShape() { - return enableScrollX() ? "overflowSquare" : "square"; + return enableScrollX() ? 'overflowSquare' : 'square'; } function loadLatest(page, parentId) { loading.show(); var userId = ApiClient.getCurrentUserId(); var options = { - IncludeItemTypes: "Audio", + IncludeItemTypes: 'Audio', Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(), - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', ParentId: parentId, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', EnableTotalRecordCount: false }; - ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)).then(function (items) { - var elem = page.querySelector("#recentlyAddedSongs"); - var supportsImageAnalysis = appHost.supports("imageanalysis"); + ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { + var elem = page.querySelector('#recentlyAddedSongs'); + var supportsImageAnalysis = appHost.supports('imageanalysis'); supportsImageAnalysis = false; elem.innerHTML = cardBuilder.getCardsHtml({ items: items, @@ -60,7 +60,7 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " imageLoader.lazyChildren(elem); loading.hide(); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -68,29 +68,29 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " function loadRecentlyPlayed(page, parentId) { var options = { - SortBy: "DatePlayed", - SortOrder: "Descending", - IncludeItemTypes: "Audio", + SortBy: 'DatePlayed', + SortOrder: 'Descending', + IncludeItemTypes: 'Audio', Limit: itemsPerRow(), Recursive: true, - Fields: "PrimaryImageAspectRatio,AudioInfo", - Filters: "IsPlayed", + Fields: 'PrimaryImageAspectRatio,AudioInfo', + Filters: 'IsPlayed', ParentId: parentId, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', EnableTotalRecordCount: false }; ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) { - var elem = page.querySelector("#recentlyPlayed"); + var elem = page.querySelector('#recentlyPlayed'); if (result.Items.length) { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } else { - elem.classList.add("hide"); + elem.classList.add('hide'); } - var itemsContainer = elem.querySelector(".itemsContainer"); - var supportsImageAnalysis = appHost.supports("imageanalysis"); + var itemsContainer = elem.querySelector('.itemsContainer'); + var supportsImageAnalysis = appHost.supports('imageanalysis'); supportsImageAnalysis = false; itemsContainer.innerHTML = cardBuilder.getCardsHtml({ items: result.Items, @@ -98,7 +98,7 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " shape: getSquareShape(), showTitle: true, showParentTitle: true, - action: "instantmix", + action: 'instantmix', lazy: true, centerText: !supportsImageAnalysis, overlayMoreButton: !supportsImageAnalysis, @@ -112,29 +112,29 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " function loadFrequentlyPlayed(page, parentId) { var options = { - SortBy: "PlayCount", - SortOrder: "Descending", - IncludeItemTypes: "Audio", + SortBy: 'PlayCount', + SortOrder: 'Descending', + IncludeItemTypes: 'Audio', Limit: itemsPerRow(), Recursive: true, - Fields: "PrimaryImageAspectRatio,AudioInfo", - Filters: "IsPlayed", + Fields: 'PrimaryImageAspectRatio,AudioInfo', + Filters: 'IsPlayed', ParentId: parentId, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', EnableTotalRecordCount: false }; ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) { - var elem = page.querySelector("#topPlayed"); + var elem = page.querySelector('#topPlayed'); if (result.Items.length) { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } else { - elem.classList.add("hide"); + elem.classList.add('hide'); } - var itemsContainer = elem.querySelector(".itemsContainer"); - var supportsImageAnalysis = appHost.supports("imageanalysis"); + var itemsContainer = elem.querySelector('.itemsContainer'); + var supportsImageAnalysis = appHost.supports('imageanalysis'); supportsImageAnalysis = false; itemsContainer.innerHTML = cardBuilder.getCardsHtml({ items: result.Items, @@ -142,7 +142,7 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " shape: getSquareShape(), showTitle: true, showParentTitle: true, - action: "instantmix", + action: 'instantmix', lazy: true, centerText: !supportsImageAnalysis, overlayMoreButton: !supportsImageAnalysis, @@ -155,55 +155,55 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " } function loadSuggestionsTab(page, tabContent, parentId) { - console.debug("loadSuggestionsTab"); + console.debug('loadSuggestionsTab'); loadLatest(tabContent, parentId); loadRecentlyPlayed(tabContent, parentId); loadFrequentlyPlayed(tabContent, parentId); - require(["components/favoriteitems"], function (favoriteItems) { - favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ["favoriteArtists", "favoriteAlbums", "favoriteSongs"]); + require(['components/favoriteitems'], function (favoriteItems) { + favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ['favoriteArtists', 'favoriteAlbums', 'favoriteSongs']); }); } function getTabs() { return [{ - name: globalize.translate("TabSuggestions") + name: globalize.translate('TabSuggestions') }, { - name: globalize.translate("TabAlbums") + name: globalize.translate('TabAlbums') }, { - name: globalize.translate("TabAlbumArtists") + name: globalize.translate('TabAlbumArtists') }, { - name: globalize.translate("TabArtists") + name: globalize.translate('TabArtists') }, { - name: globalize.translate("TabPlaylists") + name: globalize.translate('TabPlaylists') }, { - name: globalize.translate("TabSongs") + name: globalize.translate('TabSongs') }, { - name: globalize.translate("TabGenres") + name: globalize.translate('TabGenres') }, { - name: globalize.translate("ButtonSearch"), - cssClass: "searchTabButton" + name: globalize.translate('ButtonSearch'), + cssClass: 'searchTabButton' }]; } function getDefaultTabIndex(folderId) { - switch (userSettings.get("landing-" + folderId)) { - case "albums": + switch (userSettings.get('landing-' + folderId)) { + case 'albums': return 1; - case "albumartists": + case 'albumartists': return 2; - case "artists": + case 'artists': return 3; - case "playlists": + case 'playlists': return 4; - case "songs": + case 'songs': return 5; - case "genres": + case 'genres': return 6; default: @@ -224,19 +224,19 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " function setScrollClasses(elem, scrollX) { if (scrollX) { - elem.classList.add("hiddenScrollX"); + elem.classList.add('hiddenScrollX'); if (layoutManager.tv) { - elem.classList.add("smoothScrollX"); + elem.classList.add('smoothScrollX'); } - elem.classList.add("scrollX"); - elem.classList.remove("vertical-wrap"); + elem.classList.add('scrollX'); + elem.classList.remove('vertical-wrap'); } else { - elem.classList.remove("hiddenScrollX"); - elem.classList.remove("smoothScrollX"); - elem.classList.remove("scrollX"); - elem.classList.add("vertical-wrap"); + elem.classList.remove('hiddenScrollX'); + elem.classList.remove('smoothScrollX'); + elem.classList.remove('scrollX'); + elem.classList.add('vertical-wrap'); } } @@ -249,7 +249,7 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " } function getTabContainers() { - return view.querySelectorAll(".pageTabContent"); + return view.querySelectorAll('.pageTabContent'); } function initTabs() { @@ -264,28 +264,28 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " break; case 1: - depends.push("controllers/music/musicalbums"); + depends.push('controllers/music/musicalbums'); break; case 2: case 3: - depends.push("controllers/music/musicartists"); + depends.push('controllers/music/musicartists'); break; case 4: - depends.push("controllers/music/musicplaylists"); + depends.push('controllers/music/musicplaylists'); break; case 5: - depends.push("controllers/music/songs"); + depends.push('controllers/music/songs'); break; case 6: - depends.push("controllers/music/musicgenres"); + depends.push('controllers/music/musicgenres'); break; case 7: - depends.push("scripts/searchtab"); + depends.push('scripts/searchtab'); } require(depends, function (controllerFactory) { @@ -305,7 +305,7 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " controller = self; } else if (index === 7) { controller = new controllerFactory(view, tabContent, { - collectionType: "music", + collectionType: 'music', parentId: params.topParentId }); } else { @@ -313,9 +313,9 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " } if (index == 2) { - controller.mode = "albumartists"; + controller.mode = 'albumartists'; } else if (index == 3) { - controller.mode = "artists"; + controller.mode = 'artists'; } tabControllers[index] = controller; @@ -350,9 +350,9 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " function onInputCommand(e) { switch (e.detail.command) { - case "search": + case 'search': e.preventDefault(); - Dashboard.navigate("search.html?collectionType=music&parentId=" + params.topParentId); + Dashboard.navigate('search.html?collectionType=music&parentId=' + params.topParentId); } } @@ -363,7 +363,7 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " self.initTab = function () { var tabContent = view.querySelector(".pageTabContent[data-index='0']"); - var containers = tabContent.querySelectorAll(".itemsContainer"); + var containers = tabContent.querySelectorAll('.itemsContainer'); for (var i = 0, length = containers.length; i < length; i++) { setScrollClasses(containers[i], enableScrollX()); @@ -376,29 +376,29 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " var tabControllers = []; var renderedTabs = []; - view.addEventListener("viewshow", function (e) { + view.addEventListener('viewshow', function (e) { isViewRestored = e.detail.isRestored; initTabs(); - if (!view.getAttribute("data-title")) { + if (!view.getAttribute('data-title')) { var parentId = params.topParentId; if (parentId) { ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) { - view.setAttribute("data-title", item.Name); + view.setAttribute('data-title', item.Name); libraryMenu.setTitle(item.Name); }); } else { - view.setAttribute("data-title", globalize.translate("TabMusic")); - libraryMenu.setTitle(globalize.translate("TabMusic")); + view.setAttribute('data-title', globalize.translate('TabMusic')); + libraryMenu.setTitle(globalize.translate('TabMusic')); } } inputManager.on(window, onInputCommand); }); - view.addEventListener("viewbeforehide", function (e) { + view.addEventListener('viewbeforehide', function (e) { inputManager.off(window, onInputCommand); }); - view.addEventListener("viewdestroy", function (e) { + view.addEventListener('viewdestroy', function (e) { tabControllers.forEach(function (t) { if (t.destroy) { t.destroy(); diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index 29d21b077..8e50cd720 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -1,5 +1,5 @@ -define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userSettings", "globalize", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading, userSettings, globalize) { - "use strict"; +define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userSettings', 'globalize', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, loading, userSettings, globalize) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -9,14 +9,14 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS if (!pageData) { pageData = data[key] = { query: { - SortBy: "Album,SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Audio", + SortBy: 'Album,SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Audio', Recursive: true, - Fields: "AudioInfo,ParentId", + Fields: 'AudioInfo,ParentId', StartIndex: 0, ImageTypeLimit: 1, - EnableImageTypes: "Primary" + EnableImageTypes: 'Primary' } }; @@ -37,7 +37,7 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey("songs"); + context.savedQueryKey = libraryBrowser.getSavedQueryKey('songs'); } return context.savedQueryKey; @@ -85,35 +85,35 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS }); var html = listView.getListViewHtml({ items: result.Items, - action: "playallfromhere", + action: 'playallfromhere', smallIcon: true, artist: true, addToListButton: true }); - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -124,13 +124,13 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function (filterDialogFactory) { + require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: "songs", + mode: 'songs', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery(tabContent).StartIndex = 0; reloadItems(tabContent); }); @@ -143,38 +143,38 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userS }; function initPage(tabContent) { - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate("OptionTrackName"), - id: "Name" + name: globalize.translate('OptionTrackName'), + id: 'Name' }, { - name: globalize.translate("OptionAlbum"), - id: "Album,SortName" + name: globalize.translate('OptionAlbum'), + id: 'Album,SortName' }, { - name: globalize.translate("OptionAlbumArtist"), - id: "AlbumArtist,Album,SortName" + name: globalize.translate('OptionAlbumArtist'), + id: 'AlbumArtist,Album,SortName' }, { - name: globalize.translate("OptionArtist"), - id: "Artist,Album,SortName" + name: globalize.translate('OptionArtist'), + id: 'Artist,Album,SortName' }, { - name: globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName" + name: globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName' }, { - name: globalize.translate("OptionDatePlayed"), - id: "DatePlayed,SortName" + name: globalize.translate('OptionDatePlayed'), + id: 'DatePlayed,SortName' }, { - name: globalize.translate("OptionPlayCount"), - id: "PlayCount,SortName" + name: globalize.translate('OptionPlayCount'), + id: 'PlayCount,SortName' }, { - name: globalize.translate("OptionReleaseDate"), - id: "PremiereDate,AlbumArtist,Album,SortName" + name: globalize.translate('OptionReleaseDate'), + id: 'PremiereDate,AlbumArtist,Album,SortName' }, { - name: globalize.translate("OptionRuntime"), - id: "Runtime,AlbumArtist,Album,SortName" + name: globalize.translate('OptionRuntime'), + id: 'Runtime,AlbumArtist,Album,SortName' }], callback: function () { getQuery(tabContent).StartIndex = 0; diff --git a/src/controllers/playback/nowplaying.js b/src/controllers/playback/nowplaying.js index 6fcdb2a79..98c9945e8 100644 --- a/src/controllers/playback/nowplaying.js +++ b/src/controllers/playback/nowplaying.js @@ -1,17 +1,17 @@ -define(["components/remotecontrol/remotecontrol", "libraryMenu", "emby-button"], function (remotecontrolFactory, libraryMenu) { - "use strict"; +define(['components/remotecontrol/remotecontrol', 'libraryMenu', 'emby-button'], function (remotecontrolFactory, libraryMenu) { + 'use strict'; return function (view, params) { var remoteControl = new remotecontrolFactory(); - remoteControl.init(view, view.querySelector(".remoteControlContent")); - view.addEventListener("viewshow", function (e) { + remoteControl.init(view, view.querySelector('.remoteControlContent')); + view.addEventListener('viewshow', function (e) { libraryMenu.setTransparentMenu(true); if (remoteControl) { remoteControl.onShow(); } }); - view.addEventListener("viewbeforehide", function (e) { + view.addEventListener('viewbeforehide', function (e) { libraryMenu.setTransparentMenu(false); if (remoteControl) { diff --git a/src/controllers/playback/videoosd.js b/src/controllers/playback/videoosd.js index 555e34c5b..e9923d779 100644 --- a/src/controllers/playback/videoosd.js +++ b/src/controllers/playback/videoosd.js @@ -1,19 +1,19 @@ -define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "mediaInfo", "focusManager", "imageLoader", "scrollHelper", "events", "connectionManager", "browser", "globalize", "apphost", "layoutManager", "userSettings", "keyboardnavigation", "scrollStyles", "emby-slider", "paper-icon-button-light", "css!assets/css/videoosd"], function (playbackManager, dom, inputManager, datetime, itemHelper, mediaInfo, focusManager, imageLoader, scrollHelper, events, connectionManager, browser, globalize, appHost, layoutManager, userSettings, keyboardnavigation) { - "use strict"; +define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'mediaInfo', 'focusManager', 'imageLoader', 'scrollHelper', 'events', 'connectionManager', 'browser', 'globalize', 'apphost', 'layoutManager', 'userSettings', 'keyboardnavigation', 'scrollStyles', 'emby-slider', 'paper-icon-button-light', 'css!assets/css/videoosd'], function (playbackManager, dom, inputManager, datetime, itemHelper, mediaInfo, focusManager, imageLoader, scrollHelper, events, connectionManager, browser, globalize, appHost, layoutManager, userSettings, keyboardnavigation) { + 'use strict'; function seriesImageUrl(item, options) { - if ("Episode" !== item.Type) { + if ('Episode' !== item.Type) { return null; } options = options || {}; - options.type = options.type || "Primary"; - if ("Primary" === options.type && item.SeriesPrimaryImageTag) { + options.type = options.type || 'Primary'; + if ('Primary' === options.type && item.SeriesPrimaryImageTag) { options.tag = item.SeriesPrimaryImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } - if ("Thumb" === options.type) { + if ('Thumb' === options.type) { if (item.SeriesThumbImageTag) { options.tag = item.SeriesThumbImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); @@ -30,14 +30,14 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med function imageUrl(item, options) { options = options || {}; - options.type = options.type || "Primary"; + options.type = options.type || 'Primary'; if (item.ImageTags && item.ImageTags[options.type]) { options.tag = item.ImageTags[options.type]; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); } - if ("Primary" === options.type && item.AlbumId && item.AlbumPrimaryImageTag) { + if ('Primary' === options.type && item.AlbumId && item.AlbumPrimaryImageTag) { options.tag = item.AlbumPrimaryImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); } @@ -45,23 +45,6 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med return null; } - function logoImageUrl(item, apiClient, options) { - options = options || {}; - options.type = "Logo"; - - if (item.ImageTags && item.ImageTags.Logo) { - options.tag = item.ImageTags.Logo; - return apiClient.getScaledImageUrl(item.Id, options); - } - - if (item.ParentLogoImageTag) { - options.tag = item.ParentLogoImageTag; - return apiClient.getScaledImageUrl(item.ParentLogoItemId, options); - } - - return null; - } - return function (view, params) { function onVerticalSwipe(e, elem, data) { var player = currentPlayer; @@ -110,7 +93,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function getDisplayItem(item) { - if ("TvChannel" === item.Type) { + if ('TvChannel' === item.Type) { var apiClient = connectionManager.getApiClient(item.ServerId); return apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (refreshedItem) { return { @@ -126,27 +109,27 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function updateRecordingButton(item) { - if (!item || "Program" !== item.Type) { + if (!item || 'Program' !== item.Type) { if (recordingButtonManager) { recordingButtonManager.destroy(); recordingButtonManager = null; } - return void view.querySelector(".btnRecord").classList.add("hide"); + return void view.querySelector('.btnRecord').classList.add('hide'); } connectionManager.getApiClient(item.ServerId).getCurrentUser().then(function (user) { if (user.Policy.EnableLiveTvManagement) { - require(["recordingButton"], function (RecordingButton) { + require(['recordingButton'], function (RecordingButton) { if (recordingButtonManager) { return void recordingButtonManager.refreshItem(item); } recordingButtonManager = new RecordingButton({ item: item, - button: view.querySelector(".btnRecord") + button: view.querySelector('.btnRecord') }); - view.querySelector(".btnRecord").classList.remove("hide"); + view.querySelector('.btnRecord').classList.remove('hide'); }); } }); @@ -166,11 +149,11 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med setTitle(displayItem, parentName); var titleElement; - var osdTitle = view.querySelector(".osdTitle"); + var osdTitle = view.querySelector('.osdTitle'); titleElement = osdTitle; var displayName = itemHelper.getDisplayName(displayItem, { - includeParentInfo: "Program" !== displayItem.Type, - includeIndexNumber: "Program" !== displayItem.Type + includeParentInfo: 'Program' !== displayItem.Type, + includeIndexNumber: 'Program' !== displayItem.Type }); if (!displayName) { @@ -180,9 +163,9 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med titleElement.innerHTML = displayName; if (displayName) { - titleElement.classList.remove("hide"); + titleElement.classList.remove('hide'); } else { - titleElement.classList.add("hide"); + titleElement.classList.add('hide'); } var mediaInfoHtml = mediaInfo.getPrimaryMediaInfoHtml(displayItem, { @@ -191,20 +174,20 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med tomatoes: false, endsAt: false, episodeTitle: false, - originalAirDate: "Program" !== displayItem.Type, - episodeTitleIndexNumber: "Program" !== displayItem.Type, + originalAirDate: 'Program' !== displayItem.Type, + episodeTitleIndexNumber: 'Program' !== displayItem.Type, programIndicator: false }); - var osdMediaInfo = view.querySelector(".osdMediaInfo"); + var osdMediaInfo = view.querySelector('.osdMediaInfo'); osdMediaInfo.innerHTML = mediaInfoHtml; if (mediaInfoHtml) { - osdMediaInfo.classList.remove("hide"); + osdMediaInfo.classList.remove('hide'); } else { - osdMediaInfo.classList.add("hide"); + osdMediaInfo.classList.add('hide'); } - var secondaryMediaInfo = view.querySelector(".osdSecondaryMediaInfo"); + var secondaryMediaInfo = view.querySelector('.osdSecondaryMediaInfo'); var secondaryMediaInfoHtml = mediaInfo.getSecondaryMediaInfoHtml(displayItem, { startDate: false, programTime: false @@ -212,29 +195,29 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med secondaryMediaInfo.innerHTML = secondaryMediaInfoHtml; if (secondaryMediaInfoHtml) { - secondaryMediaInfo.classList.remove("hide"); + secondaryMediaInfo.classList.remove('hide'); } else { - secondaryMediaInfo.classList.add("hide"); + secondaryMediaInfo.classList.add('hide'); } if (displayName) { - view.querySelector(".osdMainTextContainer").classList.remove("hide"); + view.querySelector('.osdMainTextContainer').classList.remove('hide'); } else { - view.querySelector(".osdMainTextContainer").classList.add("hide"); + view.querySelector('.osdMainTextContainer').classList.add('hide'); } if (enableProgressByTimeOfDay) { setDisplayTime(startTimeText, displayItem.StartDate); setDisplayTime(endTimeText, displayItem.EndDate); - startTimeText.classList.remove("hide"); - endTimeText.classList.remove("hide"); + startTimeText.classList.remove('hide'); + endTimeText.classList.remove('hide'); programStartDateMs = displayItem.StartDate ? datetime.parseISO8601Date(displayItem.StartDate).getTime() : 0; programEndDateMs = displayItem.EndDate ? datetime.parseISO8601Date(displayItem.EndDate).getTime() : 0; } else { - startTimeText.classList.add("hide"); - endTimeText.classList.add("hide"); - startTimeText.innerHTML = ""; - endTimeText.innerHTML = ""; + startTimeText.classList.add('hide'); + endTimeText.classList.add('hide'); + startTimeText.innerHTML = ''; + endTimeText.innerHTML = ''; programStartDateMs = 0; programEndDateMs = 0; } @@ -243,13 +226,13 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med function getDisplayTimeWithoutAmPm(date, showSeconds) { if (showSeconds) { return datetime.toLocaleTimeString(date, { - hour: "numeric", - minute: "2-digit", - second: "2-digit" - }).toLowerCase().replace("am", "").replace("pm", "").trim(); + hour: 'numeric', + minute: '2-digit', + second: '2-digit' + }).toLowerCase().replace('am', '').replace('pm', '').trim(); } - return datetime.getDisplayTime(date).toLowerCase().replace("am", "").replace("pm", "").trim(); + return datetime.getDisplayTime(date).toLowerCase().replace('am', '').replace('pm', '').trim(); } function setDisplayTime(elem, date) { @@ -260,11 +243,11 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med html = getDisplayTimeWithoutAmPm(date); } - elem.innerHTML = html || ""; + elem.innerHTML = html || ''; } function shouldEnableProgressByTimeOfDay(item) { - return !("TvChannel" !== item.Type || !item.CurrentProgram); + return !('TvChannel' !== item.Type || !item.CurrentProgram); } function updateNowPlayingInfo(player, state) { @@ -274,15 +257,15 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med if (!item) { setPoster(null); updateRecordingButton(null); - Emby.Page.setTitle(""); + Emby.Page.setTitle(''); nowPlayingVolumeSlider.disabled = true; nowPlayingPositionSlider.disabled = true; btnFastForward.disabled = true; btnRewind.disabled = true; - view.querySelector(".btnSubtitles").classList.add("hide"); - view.querySelector(".btnAudio").classList.add("hide"); - view.querySelector(".osdTitle").innerHTML = ""; - view.querySelector(".osdMediaInfo").innerHTML = ""; + view.querySelector('.btnSubtitles').classList.add('hide'); + view.querySelector('.btnAudio').classList.add('hide'); + view.querySelector('.osdTitle').innerHTML = ''; + view.querySelector('.osdMediaInfo').innerHTML = ''; return; } @@ -294,33 +277,22 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med btnRewind.disabled = false; if (playbackManager.subtitleTracks(player).length) { - view.querySelector(".btnSubtitles").classList.remove("hide"); + view.querySelector('.btnSubtitles').classList.remove('hide'); toggleSubtitleSync(); } else { - view.querySelector(".btnSubtitles").classList.add("hide"); - toggleSubtitleSync("forceToHide"); + view.querySelector('.btnSubtitles').classList.add('hide'); + toggleSubtitleSync('forceToHide'); } if (playbackManager.audioTracks(player).length > 1) { - view.querySelector(".btnAudio").classList.remove("hide"); + view.querySelector('.btnAudio').classList.remove('hide'); } else { - view.querySelector(".btnAudio").classList.add("hide"); + view.querySelector('.btnAudio').classList.add('hide'); } } function setTitle(item, parentName) { - var url = logoImageUrl(item, connectionManager.getApiClient(item.ServerId), {}); - - if (url) { - Emby.Page.setTitle(""); - var pageTitle = document.querySelector(".pageTitle"); - pageTitle.style.backgroundImage = "url('" + url + "')"; - pageTitle.classList.add("pageTitleWithLogo"); - pageTitle.classList.remove("pageTitleWithDefaultLogo"); - pageTitle.innerHTML = ""; - } else { - Emby.Page.setTitle(parentName || ""); - } + Emby.Page.setTitle(parentName || ''); var documentTitle = parentName || (item ? item.Name : null); @@ -330,35 +302,35 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function setPoster(item, secondaryItem) { - var osdPoster = view.querySelector(".osdPoster"); + var osdPoster = view.querySelector('.osdPoster'); if (item) { var imgUrl = seriesImageUrl(item, { maxWidth: osdPoster.clientWidth * 2, - type: "Primary" + type: 'Primary' }) || seriesImageUrl(item, { maxWidth: osdPoster.clientWidth * 2, - type: "Thumb" + type: 'Thumb' }) || imageUrl(item, { maxWidth: osdPoster.clientWidth * 2, - type: "Primary" + type: 'Primary' }); if (!imgUrl && secondaryItem && (imgUrl = seriesImageUrl(secondaryItem, { maxWidth: osdPoster.clientWidth * 2, - type: "Primary" + type: 'Primary' }) || seriesImageUrl(secondaryItem, { maxWidth: osdPoster.clientWidth * 2, - type: "Thumb" + type: 'Thumb' }) || imageUrl(secondaryItem, { maxWidth: osdPoster.clientWidth * 2, - type: "Primary" + type: 'Primary' })), imgUrl) { return void (osdPoster.innerHTML = ''); } } - osdPoster.innerHTML = ""; + osdPoster.innerHTML = ''; } function showOsd() { @@ -373,7 +345,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function toggleOsd() { - if ("osd" === currentVisibleMenu) { + if ('osd' === currentVisibleMenu) { hideOsd(); } else if (!currentVisibleMenu) { showOsd(); @@ -393,11 +365,11 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function slideDownToShow(elem) { - elem.classList.remove("osdHeader-hidden"); + elem.classList.remove('osdHeader-hidden'); } function slideUpToHide(elem) { - elem.classList.add("osdHeader-hidden"); + elem.classList.add('osdHeader-hidden'); } function clearHideAnimationEventListeners(elem) { @@ -410,7 +382,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var elem = e.target; if (elem != osdBottomElement) return; - elem.classList.add("hide"); + elem.classList.add('hide'); dom.removeEventListener(elem, transitionEndEventName, onHideAnimationComplete, { once: true }); @@ -419,14 +391,14 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med function showMainOsdControls() { if (!currentVisibleMenu) { var elem = osdBottomElement; - currentVisibleMenu = "osd"; + currentVisibleMenu = 'osd'; clearHideAnimationEventListeners(elem); - elem.classList.remove("hide"); - elem.classList.remove("videoOsdBottom-hidden"); + elem.classList.remove('hide'); + elem.classList.remove('videoOsdBottom-hidden'); if (!layoutManager.mobile) { setTimeout(function () { - focusManager.focus(elem.querySelector(".btnPause")); + focusManager.focus(elem.querySelector('.btnPause')); }, 50); } toggleSubtitleSync(); @@ -434,15 +406,15 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function hideMainOsdControls() { - if ("osd" === currentVisibleMenu) { + if ('osd' === currentVisibleMenu) { var elem = osdBottomElement; clearHideAnimationEventListeners(elem); - elem.classList.add("videoOsdBottom-hidden"); + elem.classList.add('videoOsdBottom-hidden'); dom.addEventListener(elem, transitionEndEventName, onHideAnimationComplete, { once: true }); currentVisibleMenu = null; - toggleSubtitleSync("hide"); + toggleSubtitleSync('hide'); // Firefox does not blur by itself if (document.activeElement) { @@ -452,7 +424,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function onPointerMove(e) { - if ("mouse" === (e.pointerType || (layoutManager.mobile ? "touch" : "mouse"))) { + if ('mouse' === (e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'))) { var eventX = e.screenX || 0; var eventY = e.screenY || 0; var obj = lastPointerMoveData; @@ -479,8 +451,8 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var player = currentPlayer; switch (e.detail.command) { - case "left": - if ("osd" === currentVisibleMenu) { + case 'left': + if ('osd' === currentVisibleMenu) { showOsd(); } else { if (!currentVisibleMenu) { @@ -491,8 +463,8 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med break; - case "right": - if ("osd" === currentVisibleMenu) { + case 'right': + if ('osd' === currentVisibleMenu) { showOsd(); } else if (!currentVisibleMenu) { e.preventDefault(); @@ -501,54 +473,59 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med break; - case "pageup": + case 'pageup': playbackManager.nextChapter(player); break; - case "pagedown": + case 'pagedown': playbackManager.previousChapter(player); break; - case "up": - case "down": - case "select": - case "menu": - case "info": - case "play": - case "playpause": - case "pause": - case "fastforward": - case "rewind": - case "next": - case "previous": + case 'up': + case 'down': + case 'select': + case 'menu': + case 'info': + case 'play': + case 'playpause': + case 'pause': + case 'fastforward': + case 'rewind': + case 'next': + case 'previous': showOsd(); break; - case "record": + case 'record': onRecordingCommand(); showOsd(); break; - case "togglestats": + case 'togglestats': toggleStats(); } } function onRecordingCommand() { - var btnRecord = view.querySelector(".btnRecord"); + var btnRecord = view.querySelector('.btnRecord'); - if (!btnRecord.classList.contains("hide")) { + if (!btnRecord.classList.contains('hide')) { btnRecord.click(); } } function updateFullscreenIcon() { + const button = view.querySelector('.btnFullscreen'); + const icon = button.querySelector('.material-icons'); + + icon.classList.remove('fullscreen_exit', 'fullscreen'); + if (playbackManager.isFullscreen(currentPlayer)) { - view.querySelector(".btnFullscreen").setAttribute("title", globalize.translate("ExitFullscreen")); - view.querySelector(".btnFullscreen i").innerHTML = ""; + button.setAttribute('title', globalize.translate('ExitFullscreen') + ' (f)'); + icon.classList.add('fullscreen_exit'); } else { - view.querySelector(".btnFullscreen").setAttribute("title", globalize.translate("Fullscreen") + " (f)"); - view.querySelector(".btnFullscreen i").innerHTML = "fullscreen"; + button.setAttribute('title', globalize.translate('Fullscreen') + ' (f)'); + icon.classList.add('fullscreen'); } } @@ -581,7 +558,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function onPlaybackStart(e, state) { - console.debug("nowplaying event: " + e.type); + console.debug('nowplaying event: ' + e.type); var player = this; onStateChanged.call(player, e, state); resetUpNextDialog(); @@ -600,10 +577,10 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med function onPlaybackStopped(e, state) { currentRuntimeTicks = null; resetUpNextDialog(); - console.debug("nowplaying event: " + e.type); + console.debug('nowplaying event: ' + e.type); - if ("Video" !== state.NextMediaType) { - view.removeEventListener("viewbeforehide", onViewHideStopPlayback); + if ('Video' !== state.NextMediaType) { + view.removeEventListener('viewbeforehide', onViewHideStopPlayback); Emby.Page.back(); } } @@ -612,16 +589,16 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var player = this; var state = playbackManager.getPlayerState(player); onStateChanged.call(player, { - type: "init" + type: 'init' }, state); } function onBeginFetch() { - document.querySelector(".osdMediaStatus").classList.remove("hide"); + document.querySelector('.osdMediaStatus').classList.remove('hide'); } function onEndFetch() { - document.querySelector(".osdMediaStatus").classList.add("hide"); + document.querySelector('.osdMediaStatus').classList.add('hide'); } function bindToPlayer(player) { @@ -632,18 +609,18 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } var state = playbackManager.getPlayerState(player); onStateChanged.call(player, { - type: "init" + type: 'init' }, state); - events.on(player, "playbackstart", onPlaybackStart); - events.on(player, "playbackstop", onPlaybackStopped); - events.on(player, "volumechange", onVolumeChanged); - events.on(player, "pause", onPlayPauseStateChanged); - events.on(player, "unpause", onPlayPauseStateChanged); - events.on(player, "timeupdate", onTimeUpdate); - events.on(player, "fullscreenchange", updateFullscreenIcon); - events.on(player, "mediastreamschange", onMediaStreamsChanged); - events.on(player, "beginFetch", onBeginFetch); - events.on(player, "endFetch", onEndFetch); + events.on(player, 'playbackstart', onPlaybackStart); + events.on(player, 'playbackstop', onPlaybackStopped); + events.on(player, 'volumechange', onVolumeChanged); + events.on(player, 'pause', onPlayPauseStateChanged); + events.on(player, 'unpause', onPlayPauseStateChanged); + events.on(player, 'timeupdate', onTimeUpdate); + events.on(player, 'fullscreenchange', updateFullscreenIcon); + events.on(player, 'mediastreamschange', onMediaStreamsChanged); + events.on(player, 'beginFetch', onBeginFetch); + events.on(player, 'endFetch', onEndFetch); resetUpNextDialog(); if (player.isFetching) { @@ -658,14 +635,14 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var player = currentPlayer; if (player) { - events.off(player, "playbackstart", onPlaybackStart); - events.off(player, "playbackstop", onPlaybackStopped); - events.off(player, "volumechange", onVolumeChanged); - events.off(player, "pause", onPlayPauseStateChanged); - events.off(player, "unpause", onPlayPauseStateChanged); - events.off(player, "timeupdate", onTimeUpdate); - events.off(player, "fullscreenchange", updateFullscreenIcon); - events.off(player, "mediastreamschange", onMediaStreamsChanged); + events.off(player, 'playbackstart', onPlaybackStart); + events.off(player, 'playbackstop', onPlaybackStopped); + events.off(player, 'volumechange', onVolumeChanged); + events.off(player, 'pause', onPlayPauseStateChanged); + events.off(player, 'unpause', onPlayPauseStateChanged); + events.off(player, 'timeupdate', onTimeUpdate); + events.off(player, 'fullscreenchange', updateFullscreenIcon); + events.off(player, 'mediastreamschange', onMediaStreamsChanged); currentPlayer = null; } } @@ -689,7 +666,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function showComingUpNextIfNeeded(player, currentItem, currentTimeTicks, runtimeTicks) { - if (runtimeTicks && currentTimeTicks && !comingUpNextDisplayed && !currentVisibleMenu && "Episode" === currentItem.Type && userSettings.enableNextVideoInfoOverlay()) { + if (runtimeTicks && currentTimeTicks && !comingUpNextDisplayed && !currentVisibleMenu && 'Episode' === currentItem.Type && userSettings.enableNextVideoInfoOverlay()) { var showAtSecondsLeft = runtimeTicks >= 3e10 ? 40 : runtimeTicks >= 24e9 ? 35 : 30; var showAtTicks = runtimeTicks - 1e3 * showAtSecondsLeft * 1e4; var timeRemainingTicks = runtimeTicks - currentTimeTicks; @@ -701,30 +678,30 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function onUpNextHidden() { - if ("upnext" === currentVisibleMenu) { + if ('upnext' === currentVisibleMenu) { currentVisibleMenu = null; } } function showComingUpNext(player) { - require(["upNextDialog"], function (UpNextDialog) { + require(['upNextDialog'], function (UpNextDialog) { if (!(currentVisibleMenu || currentUpNextDialog)) { - currentVisibleMenu = "upnext"; + currentVisibleMenu = 'upnext'; comingUpNextDisplayed = true; playbackManager.nextItem(player).then(function (nextItem) { currentUpNextDialog = new UpNextDialog({ - parent: view.querySelector(".upNextContainer"), + parent: view.querySelector('.upNextContainer'), player: player, nextItem: nextItem }); - events.on(currentUpNextDialog, "hide", onUpNextHidden); + events.on(currentUpNextDialog, 'hide', onUpNextHidden); }, onUpNextHidden); } }); } function refreshProgramInfoIfNeeded(player, item) { - if ("TvChannel" === item.Type) { + if ('TvChannel' === item.Type) { var program = item.CurrentProgram; if (program && program.EndDate) { @@ -732,27 +709,31 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var endDate = datetime.parseISO8601Date(program.EndDate); if (new Date().getTime() >= endDate.getTime()) { - console.debug("program info needs to be refreshed"); + console.debug('program info needs to be refreshed'); var state = playbackManager.getPlayerState(player); onStateChanged.call(player, { - type: "init" + type: 'init' }, state); } } catch (e) { - console.error("error parsing date: " + program.EndDate); + console.error('error parsing date: ' + program.EndDate); } } } } function updatePlayPauseState(isPaused) { - var button = view.querySelector(".btnPause i"); + const btnPlayPause = view.querySelector('.btnPause'); + const btnPlayPauseIcon = btnPlayPause.querySelector('.material-icons'); + + btnPlayPauseIcon.classList.remove('play_arrow', 'pause'); + if (isPaused) { - button.innerHTML = ""; - button.setAttribute("title", globalize.translate("ButtonPlay") + " (k)"); + btnPlayPauseIcon.classList.add('play_arrow'); + btnPlayPause.setAttribute('title', globalize.translate('ButtonPlay') + ' (k)'); } else { - button.innerHTML = "pause"; - button.setAttribute("title", globalize.translate("ButtonPause") + " (k)"); + btnPlayPauseIcon.classList.add('pause'); + btnPlayPause.setAttribute('title', globalize.translate('ButtonPause') + ' (k)'); } } @@ -761,7 +742,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med updatePlayPauseState(playState.IsPaused); var supportedCommands = playbackManager.getSupportedCommands(player); currentPlayerSupportedCommands = supportedCommands; - supportsBrightnessChange = -1 !== supportedCommands.indexOf("SetBrightness"); + supportsBrightnessChange = -1 !== supportedCommands.indexOf('SetBrightness'); updatePlayerVolumeState(player, playState.IsMuted, playState.VolumeLevel); if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) { @@ -775,10 +756,10 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playState.PlaybackStartTimeTicks, playState.BufferedRanges || []); updateNowPlayingInfo(player, state); - if (state.MediaSource && state.MediaSource.SupportsTranscoding && -1 !== supportedCommands.indexOf("SetMaxStreamingBitrate")) { - view.querySelector(".btnVideoOsdSettings").classList.remove("hide"); + if (state.MediaSource && state.MediaSource.SupportsTranscoding && -1 !== supportedCommands.indexOf('SetMaxStreamingBitrate')) { + view.querySelector('.btnVideoOsdSettings').classList.remove('hide'); } else { - view.querySelector(".btnVideoOsdSettings").classList.add("hide"); + view.querySelector('.btnVideoOsdSettings').classList.add('hide'); } var isProgressClear = state.MediaSource && null == state.MediaSource.RunTimeTicks; @@ -789,22 +770,22 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med userSettings.skipForwardLength() * 1000000 / nowPlayingItem.RunTimeTicks); } - if (-1 === supportedCommands.indexOf("ToggleFullscreen") || player.isLocalPlayer && layoutManager.tv && playbackManager.isFullscreen(player)) { - view.querySelector(".btnFullscreen").classList.add("hide"); + if (-1 === supportedCommands.indexOf('ToggleFullscreen') || player.isLocalPlayer && layoutManager.tv && playbackManager.isFullscreen(player)) { + view.querySelector('.btnFullscreen').classList.add('hide'); } else { - view.querySelector(".btnFullscreen").classList.remove("hide"); + view.querySelector('.btnFullscreen').classList.remove('hide'); } - if (-1 === supportedCommands.indexOf("PictureInPicture")) { - view.querySelector(".btnPip").classList.add("hide"); + if (-1 === supportedCommands.indexOf('PictureInPicture')) { + view.querySelector('.btnPip').classList.add('hide'); } else { - view.querySelector(".btnPip").classList.remove("hide"); + view.querySelector('.btnPip').classList.remove('hide'); } - if (-1 === supportedCommands.indexOf("AirPlay")) { - view.querySelector(".btnAirPlay").classList.add("hide"); + if (-1 === supportedCommands.indexOf('AirPlay')) { + view.querySelector('.btnAirPlay').classList.add('hide'); } else { - view.querySelector(".btnAirPlay").classList.remove("hide"); + view.querySelector('.btnAirPlay').classList.remove('hide'); } updateFullscreenIcon(); @@ -837,8 +818,8 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } } - nowPlayingPositionText.innerHTML = ""; - nowPlayingDurationText.innerHTML = ""; + nowPlayingPositionText.innerHTML = ''; + nowPlayingDurationText.innerHTML = ''; } else { if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) { if (runtimeTicks) { @@ -849,10 +830,10 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med nowPlayingPositionSlider.value = 0; } - if (runtimeTicks && null != positionTicks && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && "Recording" !== currentItem.Type) { - endsAtText.innerHTML = "  -  " + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, true); + if (runtimeTicks && null != positionTicks && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && 'Recording' !== currentItem.Type) { + endsAtText.innerHTML = '  -  ' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, true); } else { - endsAtText.innerHTML = ""; + endsAtText.innerHTML = ''; } } @@ -870,38 +851,43 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var showMuteButton = true; var showVolumeSlider = true; - if (-1 === supportedCommands.indexOf("Mute")) { + if (-1 === supportedCommands.indexOf('Mute')) { showMuteButton = false; } - if (-1 === supportedCommands.indexOf("SetVolume")) { + if (-1 === supportedCommands.indexOf('SetVolume')) { showVolumeSlider = false; } - if (player.isLocalPlayer && appHost.supports("physicalvolumecontrol")) { + if (player.isLocalPlayer && appHost.supports('physicalvolumecontrol')) { showMuteButton = false; showVolumeSlider = false; } + const buttonMute = view.querySelector('.buttonMute'); + const buttonMuteIcon = buttonMute.querySelector('.material-icons'); + + buttonMuteIcon.classList.remove('volume_off', 'volume_up'); + if (isMuted) { - view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Unmute") + " (m)"); - view.querySelector(".buttonMute i").innerHTML = ""; + buttonMute.setAttribute('title', globalize.translate('Unmute') + ' (m)'); + buttonMuteIcon.classList.add('volume_off'); } else { - view.querySelector(".buttonMute").setAttribute("title", globalize.translate("Mute") + " (m)"); - view.querySelector(".buttonMute i").innerHTML = ""; + buttonMute.setAttribute('title', globalize.translate('Mute') + ' (m)'); + buttonMuteIcon.classList.add('volume_up'); } if (showMuteButton) { - view.querySelector(".buttonMute").classList.remove("hide"); + buttonMute.classList.remove('hide'); } else { - view.querySelector(".buttonMute").classList.add("hide"); + buttonMute.classList.add('hide'); } if (nowPlayingVolumeSlider) { if (showVolumeSlider) { - nowPlayingVolumeSliderContainer.classList.remove("hide"); + nowPlayingVolumeSliderContainer.classList.remove('hide'); } else { - nowPlayingVolumeSliderContainer.classList.add("hide"); + nowPlayingVolumeSliderContainer.classList.add('hide'); } if (!nowPlayingVolumeSlider.dragging) { @@ -911,24 +897,24 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function updatePlaylist(player) { - var btnPreviousTrack = view.querySelector(".btnPreviousTrack"); - var btnNextTrack = view.querySelector(".btnNextTrack"); - btnPreviousTrack.classList.remove("hide"); - btnNextTrack.classList.remove("hide"); + var btnPreviousTrack = view.querySelector('.btnPreviousTrack'); + var btnNextTrack = view.querySelector('.btnNextTrack'); + btnPreviousTrack.classList.remove('hide'); + btnNextTrack.classList.remove('hide'); btnNextTrack.disabled = false; btnPreviousTrack.disabled = false; } function updateTimeText(elem, ticks, divider) { if (null == ticks) { - elem.innerHTML = ""; + elem.innerHTML = ''; return; } var html = datetime.getDisplayRunningTime(ticks); if (divider) { - html = " / " + html; + html = ' / ' + html; } elem.innerHTML = html; @@ -937,7 +923,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med function onSettingsButtonClick(e) { var btn = this; - require(["playerSettingsMenu"], function (playerSettingsMenu) { + require(['playerSettingsMenu'], function (playerSettingsMenu) { var player = currentPlayer; if (player) { @@ -947,7 +933,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med playbackManager.canHandleOffsetOnCurrentSubtitle(player); playerSettingsMenu.show({ - mediaType: "Video", + mediaType: 'Video', player: player, positionTo: btn, stats: true, @@ -959,9 +945,9 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function onSettingsOption(selectedOption) { - if ("stats" === selectedOption) { + if ('stats' === selectedOption) { toggleStats(); - } else if ("suboffset" === selectedOption) { + } else if ('suboffset' === selectedOption) { var player = currentPlayer; if (player) { playbackManager.enableShowingSubtitleOffset(player); @@ -971,7 +957,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function toggleStats() { - require(["playerStats"], function (PlayerStats) { + require(['playerStats'], function (PlayerStats) { var player = currentPlayer; if (player) { @@ -1011,10 +997,10 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med }); var positionTo = this; - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: menuItems, - title: globalize.translate("Audio"), + title: globalize.translate('Audio'), positionTo: positionTo }).then(function (id) { var index = parseInt(id); @@ -1037,7 +1023,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med streams.unshift({ Index: -1, - DisplayTitle: globalize.translate("Off") + DisplayTitle: globalize.translate('Off') }); var menuItems = streams.map(function (stream) { var opt = { @@ -1053,9 +1039,9 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med }); var positionTo = this; - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ - title: globalize.translate("Subtitles"), + title: globalize.translate('Subtitles'), items: menuItems, positionTo: positionTo }).then(function (id) { @@ -1071,7 +1057,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function toggleSubtitleSync(action) { - require(["subtitleSync"], function (SubtitleSync) { + require(['subtitleSync'], function (SubtitleSync) { var player = currentPlayer; if (subtitleSyncOverlay) { subtitleSyncOverlay.toggle(action); @@ -1111,55 +1097,55 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } switch (key) { - case "Enter": + case 'Enter': showOsd(); break; - case "Escape": - case "Back": + case 'Escape': + case 'Back': // Ignore key when some dialog is opened - if (currentVisibleMenu === "osd" && !document.querySelector(".dialogContainer")) { + if (currentVisibleMenu === 'osd' && !document.querySelector('.dialogContainer')) { hideOsd(); e.stopPropagation(); } break; - case "k": + case 'k': playbackManager.playPause(currentPlayer); showOsd(); break; - case "l": - case "ArrowRight": - case "Right": + case 'l': + case 'ArrowRight': + case 'Right': playbackManager.fastForward(currentPlayer); showOsd(); break; - case "j": - case "ArrowLeft": - case "Left": + case 'j': + case 'ArrowLeft': + case 'Left': playbackManager.rewind(currentPlayer); showOsd(); break; - case "f": + case 'f': if (!e.ctrlKey && !e.metaKey) { playbackManager.toggleFullscreen(currentPlayer); showOsd(); } break; - case "m": + case 'm': playbackManager.toggleMute(currentPlayer); showOsd(); break; - case "NavigationLeft": - case "GamepadDPadLeft": - case "GamepadLeftThumbstickLeft": + case 'NavigationLeft': + case 'GamepadDPadLeft': + case 'GamepadLeftThumbstickLeft': // Ignores gamepad events that are always triggered, even when not focused. if (document.hasFocus()) { /* eslint-disable-line compat/compat */ playbackManager.rewind(currentPlayer); showOsd(); } break; - case "NavigationRight": - case "GamepadDPadRight": - case "GamepadLeftThumbstickRight": + case 'NavigationRight': + case 'GamepadDPadRight': + case 'GamepadLeftThumbstickRight': // Ignores gamepad events that are always triggered, even when not focused. if (document.hasFocus()) { /* eslint-disable-line compat/compat */ playbackManager.fastForward(currentPlayer); @@ -1181,7 +1167,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med return apiClient.getScaledImageUrl(item.Id, { maxWidth: maxWidth, tag: chapter.ImageTag, - type: "Chapter", + type: 'Chapter', index: index }); } @@ -1214,12 +1200,12 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med html += '
'; html += '
'; html += chapter.Name; - html += "
"; + html += '
'; html += '

'; html += datetime.getDisplayRunningTime(positionTicks); - html += "

"; - html += ""; - return html + ""; + html += ''; + html += ''; + return html + ''; } return null; @@ -1234,17 +1220,17 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med clearTimeout(playPauseClickTimeout); var player = currentPlayer; - view.removeEventListener("viewbeforehide", onViewHideStopPlayback); + view.removeEventListener('viewbeforehide', onViewHideStopPlayback); releaseCurrentPlayer(); playbackManager.stop(player); } } function enableStopOnBack(enabled) { - view.removeEventListener("viewbeforehide", onViewHideStopPlayback); + view.removeEventListener('viewbeforehide', onViewHideStopPlayback); if (enabled && playbackManager.isPlayingVideo(currentPlayer)) { - view.addEventListener("viewbeforehide", onViewHideStopPlayback); + view.addEventListener('viewbeforehide', onViewHideStopPlayback); } } @@ -1272,45 +1258,45 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var programEndDateMs = 0; var playbackStartTimeTicks = 0; var subtitleSyncOverlay; - var nowPlayingVolumeSlider = view.querySelector(".osdVolumeSlider"); - var nowPlayingVolumeSliderContainer = view.querySelector(".osdVolumeSliderContainer"); - var nowPlayingPositionSlider = view.querySelector(".osdPositionSlider"); - var nowPlayingPositionText = view.querySelector(".osdPositionText"); - var nowPlayingDurationText = view.querySelector(".osdDurationText"); - var startTimeText = view.querySelector(".startTimeText"); - var endTimeText = view.querySelector(".endTimeText"); - var endsAtText = view.querySelector(".endsAtText"); - var btnRewind = view.querySelector(".btnRewind"); - var btnFastForward = view.querySelector(".btnFastForward"); + var nowPlayingVolumeSlider = view.querySelector('.osdVolumeSlider'); + var nowPlayingVolumeSliderContainer = view.querySelector('.osdVolumeSliderContainer'); + var nowPlayingPositionSlider = view.querySelector('.osdPositionSlider'); + var nowPlayingPositionText = view.querySelector('.osdPositionText'); + var nowPlayingDurationText = view.querySelector('.osdDurationText'); + var startTimeText = view.querySelector('.startTimeText'); + var endTimeText = view.querySelector('.endTimeText'); + var endsAtText = view.querySelector('.endsAtText'); + var btnRewind = view.querySelector('.btnRewind'); + var btnFastForward = view.querySelector('.btnFastForward'); var transitionEndEventName = dom.whichTransitionEvent(); - var headerElement = document.querySelector(".skinHeader"); - var osdBottomElement = document.querySelector(".videoOsdBottom-maincontrols"); + var headerElement = document.querySelector('.skinHeader'); + var osdBottomElement = document.querySelector('.videoOsdBottom-maincontrols'); if (layoutManager.tv) { - nowPlayingPositionSlider.classList.add("focusable"); + nowPlayingPositionSlider.classList.add('focusable'); nowPlayingPositionSlider.enableKeyboardDragging(); } - view.addEventListener("viewbeforeshow", function (e) { - headerElement.classList.add("osdHeader"); - Emby.Page.setTransparency("full"); + view.addEventListener('viewbeforeshow', function (e) { + headerElement.classList.add('osdHeader'); + Emby.Page.setTransparency('full'); }); - view.addEventListener("viewshow", function (e) { + view.addEventListener('viewshow', function (e) { try { - events.on(playbackManager, "playerchange", onPlayerChange); + events.on(playbackManager, 'playerchange', onPlayerChange); bindToPlayer(playbackManager.getCurrentPlayer()); - dom.addEventListener(document, window.PointerEvent ? "pointermove" : "mousemove", onPointerMove, { + dom.addEventListener(document, window.PointerEvent ? 'pointermove' : 'mousemove', onPointerMove, { passive: true }); showOsd(); inputManager.on(window, onInputCommand); - dom.addEventListener(window, "keydown", onWindowKeyDown, { + dom.addEventListener(window, 'keydown', onWindowKeyDown, { capture: true }); - dom.addEventListener(window, window.PointerEvent ? "pointerdown" : "mousedown", onWindowMouseDown, { + dom.addEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, { passive: true }); - dom.addEventListener(window, "touchstart", onWindowTouchStart, { + dom.addEventListener(window, 'touchstart', onWindowTouchStart, { passive: true }); } catch (e) { @@ -1319,44 +1305,44 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med }); } }); - view.addEventListener("viewbeforehide", function () { + view.addEventListener('viewbeforehide', function () { if (statsOverlay) { statsOverlay.enabled(false); } - dom.removeEventListener(window, "keydown", onWindowKeyDown, { + dom.removeEventListener(window, 'keydown', onWindowKeyDown, { capture: true }); - dom.removeEventListener(window, window.PointerEvent ? "pointerdown" : "mousedown", onWindowMouseDown, { + dom.removeEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, { passive: true }); - dom.removeEventListener(window, "touchstart", onWindowTouchStart, { + dom.removeEventListener(window, 'touchstart', onWindowTouchStart, { passive: true }); stopOsdHideTimer(); - headerElement.classList.remove("osdHeader"); - headerElement.classList.remove("osdHeader-hidden"); - dom.removeEventListener(document, window.PointerEvent ? "pointermove" : "mousemove", onPointerMove, { + headerElement.classList.remove('osdHeader'); + headerElement.classList.remove('osdHeader-hidden'); + dom.removeEventListener(document, window.PointerEvent ? 'pointermove' : 'mousemove', onPointerMove, { passive: true }); inputManager.off(window, onInputCommand); - events.off(playbackManager, "playerchange", onPlayerChange); + events.off(playbackManager, 'playerchange', onPlayerChange); releaseCurrentPlayer(); }); - view.querySelector(".btnFullscreen").addEventListener("click", function () { + view.querySelector('.btnFullscreen').addEventListener('click', function () { playbackManager.toggleFullscreen(currentPlayer); }); - view.querySelector(".btnPip").addEventListener("click", function () { + view.querySelector('.btnPip').addEventListener('click', function () { playbackManager.togglePictureInPicture(currentPlayer); }); - view.querySelector(".btnAirPlay").addEventListener("click", function () { + view.querySelector('.btnAirPlay').addEventListener('click', function () { playbackManager.toggleAirPlay(currentPlayer); }); - view.querySelector(".btnVideoOsdSettings").addEventListener("click", onSettingsButtonClick); - view.addEventListener("viewhide", function () { - headerElement.classList.remove("hide"); + view.querySelector('.btnVideoOsdSettings').addEventListener('click', onSettingsButtonClick); + view.addEventListener('viewhide', function () { + headerElement.classList.remove('hide'); }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { if (self.touchHelper) { self.touchHelper.destroy(); self.touchHelper = null; @@ -1371,16 +1357,16 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med destroySubtitleSync(); }); var lastPointerDown = 0; - dom.addEventListener(view, window.PointerEvent ? "pointerdown" : "click", function (e) { - if (dom.parentWithClass(e.target, ["videoOsdBottom", "upNextContainer"])) { + dom.addEventListener(view, window.PointerEvent ? 'pointerdown' : 'click', function (e) { + if (dom.parentWithClass(e.target, ['videoOsdBottom', 'upNextContainer'])) { return void showOsd(); } - var pointerType = e.pointerType || (layoutManager.mobile ? "touch" : "mouse"); + var pointerType = e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'); var now = new Date().getTime(); switch (pointerType) { - case "touch": + case 'touch': if (now - lastPointerDown > 300) { lastPointerDown = now; toggleOsd(); @@ -1388,7 +1374,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med break; - case "mouse": + case 'mouse': if (!e.button) { if (playPauseClickTimeout) { clearTimeout(playPauseClickTimeout); @@ -1413,10 +1399,10 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med }); if (browser.touch) { - dom.addEventListener(view, "dblclick", onDoubleClick, {}); + dom.addEventListener(view, 'dblclick', onDoubleClick, {}); } else { var options = { passive: true }; - dom.addEventListener(view, "dblclick", function () { + dom.addEventListener(view, 'dblclick', function () { playbackManager.toggleFullscreen(currentPlayer); }, options); } @@ -1425,14 +1411,14 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med playbackManager.setVolume(this.value, currentPlayer); } - view.querySelector(".buttonMute").addEventListener("click", function () { + view.querySelector('.buttonMute').addEventListener('click', function () { playbackManager.toggleMute(currentPlayer); }); - nowPlayingVolumeSlider.addEventListener("change", setVolume); - nowPlayingVolumeSlider.addEventListener("mousemove", setVolume); - nowPlayingVolumeSlider.addEventListener("touchmove", setVolume); + nowPlayingVolumeSlider.addEventListener('change', setVolume); + nowPlayingVolumeSlider.addEventListener('mousemove', setVolume); + nowPlayingVolumeSlider.addEventListener('touchmove', setVolume); - nowPlayingPositionSlider.addEventListener("change", function () { + nowPlayingPositionSlider.addEventListener('change', function () { var player = currentPlayer; if (player) { @@ -1457,14 +1443,14 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med ms /= 100; ms *= value; ms += programStartDateMs; - return '

' + getDisplayTimeWithoutAmPm(new Date(parseInt(ms)), true) + "

"; + return '

' + getDisplayTimeWithoutAmPm(new Date(parseInt(ms)), true) + '

'; } - return "--:--"; + return '--:--'; } if (!currentRuntimeTicks) { - return "--:--"; + return '--:--'; } var ticks = currentRuntimeTicks; @@ -1480,41 +1466,41 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } } - return '

' + datetime.getDisplayRunningTime(ticks) + "

"; + return '

' + datetime.getDisplayRunningTime(ticks) + '

'; }; - view.querySelector(".btnPreviousTrack").addEventListener("click", function () { + view.querySelector('.btnPreviousTrack').addEventListener('click', function () { playbackManager.previousTrack(currentPlayer); }); - view.querySelector(".btnPause").addEventListener("click", function () { + view.querySelector('.btnPause').addEventListener('click', function () { // Ignore 'click' if another element was originally clicked (Firefox/Edge issue) if (this.contains(clickedElement)) { playbackManager.playPause(currentPlayer); } }); - view.querySelector(".btnNextTrack").addEventListener("click", function () { + view.querySelector('.btnNextTrack').addEventListener('click', function () { playbackManager.nextTrack(currentPlayer); }); - btnRewind.addEventListener("click", function () { + btnRewind.addEventListener('click', function () { playbackManager.rewind(currentPlayer); }); - btnFastForward.addEventListener("click", function () { + btnFastForward.addEventListener('click', function () { playbackManager.fastForward(currentPlayer); }); - view.querySelector(".btnAudio").addEventListener("click", showAudioTrackSelection); - view.querySelector(".btnSubtitles").addEventListener("click", showSubtitleTrackSelection); + view.querySelector('.btnAudio').addEventListener('click', showAudioTrackSelection); + view.querySelector('.btnSubtitles').addEventListener('click', showSubtitleTrackSelection); if (browser.touch) { (function () { - require(["touchHelper"], function (TouchHelper) { + require(['touchHelper'], function (TouchHelper) { self.touchHelper = new TouchHelper(view, { swipeYThreshold: 30, triggerOnMove: true, preventDefaultOnMove: true, - ignoreTagNames: ["BUTTON", "INPUT", "TEXTAREA"] + ignoreTagNames: ['BUTTON', 'INPUT', 'TEXTAREA'] }); - events.on(self.touchHelper, "swipeup", onVerticalSwipe); - events.on(self.touchHelper, "swipedown", onVerticalSwipe); + events.on(self.touchHelper, 'swipeup', onVerticalSwipe); + events.on(self.touchHelper, 'swipedown', onVerticalSwipe); }); })(); } diff --git a/src/controllers/searchpage.js b/src/controllers/searchpage.js index b260ef575..8a138b751 100644 --- a/src/controllers/searchpage.js +++ b/src/controllers/searchpage.js @@ -1,5 +1,5 @@ -define(["focusManager", "searchFields", "searchResults", "events"], function (focusManager, SearchFields, SearchResults, events) { - "use strict"; +define(['focusManager', 'searchFields', 'searchResults', 'events'], function (focusManager, SearchFields, SearchResults, events) { + 'use strict'; return function (view, params) { function onSearch(e, value) { @@ -7,21 +7,21 @@ define(["focusManager", "searchFields", "searchResults", "events"], function (fo } var self = this; - view.addEventListener("viewshow", function () { + view.addEventListener('viewshow', function () { if (!self.searchFields) { self.searchFields = new SearchFields({ - element: view.querySelector(".searchFields") + element: view.querySelector('.searchFields') }); self.searchResults = new SearchResults({ - element: view.querySelector(".searchResults"), + element: view.querySelector('.searchResults'), serverId: params.serverId || ApiClient.serverId(), parentId: params.parentId, collectionType: params.collectionType }); - events.on(self.searchFields, "search", onSearch); + events.on(self.searchFields, 'search', onSearch); } }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { if (self.searchFields) { self.searchFields.destroy(); self.searchFields = null; diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js index bd7823d40..ca9a807cb 100644 --- a/src/controllers/shows/episodes.js +++ b/src/controllers/shows/episodes.js @@ -1,5 +1,5 @@ -define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "globalize", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) { - "use strict"; +define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -9,17 +9,17 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB if (!pageData) { pageData = data[key] = { query: { - SortBy: "SeriesSortName,SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Episode", + SortBy: 'SeriesSortName,SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Episode', Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,UserData", + Fields: 'PrimaryImageAspectRatio,MediaSourceCount,UserData', IsMissing: false, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", + EnableImageTypes: 'Primary,Backdrop,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -39,7 +39,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey("episodes"); + context.savedQueryKey = libraryBrowser.getSavedQueryKey('episodes'); } return context.savedQueryKey; @@ -47,17 +47,17 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems(page) { @@ -100,17 +100,17 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); - if (viewStyle == "List") { + var itemsContainer = tabContent.querySelector('.itemsContainer'); + if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, sortBy: query.SortBy, showParentTitle: true }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', showTitle: true, showParentTitle: true, scalable: true, @@ -119,7 +119,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', showTitle: true, showParentTitle: true, overlayText: false, @@ -132,19 +132,19 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB var length; var elems; - elems = tabContent.querySelectorAll(".paging"); + elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } itemsContainer.innerHTML = html; @@ -153,7 +153,7 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -164,13 +164,13 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function (filterDialogFactory) { + require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: "episodes", + mode: 'episodes', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { reloadItems(tabContent); }); filterDialog.show(); @@ -182,35 +182,35 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB }; function initPage(tabContent) { - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate("OptionNameSort"), - id: "SeriesSortName,SortName" + name: globalize.translate('OptionNameSort'), + id: 'SeriesSortName,SortName' }, { - name: globalize.translate("OptionTvdbRating"), - id: "CommunityRating,SeriesSortName,SortName" + name: globalize.translate('OptionTvdbRating'), + id: 'CommunityRating,SeriesSortName,SortName' }, { - name: globalize.translate("OptionDateAdded"), - id: "DateCreated,SeriesSortName,SortName" + name: globalize.translate('OptionDateAdded'), + id: 'DateCreated,SeriesSortName,SortName' }, { - name: globalize.translate("OptionPremiereDate"), - id: "PremiereDate,SeriesSortName,SortName" + name: globalize.translate('OptionPremiereDate'), + id: 'PremiereDate,SeriesSortName,SortName' }, { - name: globalize.translate("OptionDatePlayed"), - id: "DatePlayed,SeriesSortName,SortName" + name: globalize.translate('OptionDatePlayed'), + id: 'DatePlayed,SeriesSortName,SortName' }, { - name: globalize.translate("OptionParentalRating"), - id: "OfficialRating,SeriesSortName,SortName" + name: globalize.translate('OptionParentalRating'), + id: 'OfficialRating,SeriesSortName,SortName' }, { - name: globalize.translate("OptionPlayCount"), - id: "PlayCount,SeriesSortName,SortName" + name: globalize.translate('OptionPlayCount'), + id: 'PlayCount,SeriesSortName,SortName' }, { - name: globalize.translate("OptionRuntime"), - id: "Runtime,SeriesSortName,SortName" + name: globalize.translate('OptionRuntime'), + id: 'Runtime,SeriesSortName,SortName' }], callback: function () { reloadItems(tabContent); @@ -219,11 +219,11 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB button: e.target }); }); - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "List,Poster,PosterCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index 80e2f646b..de38763e9 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -1,5 +1,5 @@ -define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader", "apphost", "globalize", "appRouter", "dom", "emby-button"], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { - "use strict"; +define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'appRouter', 'dom', 'emby-button'], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) { + 'use strict'; return function (view, params, tabContent) { function getPageData() { @@ -9,13 +9,13 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Series", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Series', Recursive: true, EnableTotalRecordCount: false }, - view: "Poster" + view: 'Poster' }; pageData.query.ParentId = params.topParentId; libraryBrowser.loadSavedQueryValues(key, pageData.query); @@ -29,7 +29,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader } function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey("seriesgenres"); + return libraryBrowser.getSavedQueryKey('seriesgenres'); } function getPromise() { @@ -43,29 +43,30 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader } function getThumbShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop"; + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function getPortraitShape() { - return enableScrollX() ? "overflowPortrait" : "portrait"; + return enableScrollX() ? 'overflowPortrait' : 'portrait'; } - function fillItemsContainer(elem) { - var id = elem.getAttribute("data-id"); + function fillItemsContainer(entry) { + var elem = entry.target; + var id = elem.getAttribute('data-id'); var viewStyle = self.getCurrentViewStyle(); - var limit = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? 5 : 9; + var limit = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 5 : 9; if (enableScrollX()) { limit = 10; } - var enableImageTypes = "Thumb" == viewStyle || "ThumbCard" == viewStyle ? "Primary,Backdrop,Thumb" : "Primary"; + var enableImageTypes = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 'Primary,Backdrop,Thumb' : 'Primary'; var query = { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Series", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Series', Recursive: true, - Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', ImageTypeLimit: 1, EnableImageTypes: enableImageTypes, Limit: limit, @@ -74,9 +75,9 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader ParentId: params.topParentId }; ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { - var supportsImageAnalysis = appHost.supports("imageanalysis"); + var supportsImageAnalysis = appHost.supports('imageanalysis'); - if (viewStyle == "Thumb") { + if (viewStyle == 'Thumb') { cardBuilder.buildCards(result.Items, { itemsContainer: elem, shape: getThumbShape(), @@ -87,7 +88,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader overlayMoreButton: true, allowBottomPadding: false }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { cardBuilder.buildCards(result.Items, { itemsContainer: elem, shape: getThumbShape(), @@ -98,7 +99,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader cardLayout: true, showYear: true }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { cardBuilder.buildCards(result.Items, { itemsContainer: elem, shape: getPortraitShape(), @@ -108,7 +109,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader cardLayout: true, showYear: true }); - } else if (viewStyle == "Poster") { + } else if (viewStyle == 'Poster') { cardBuilder.buildCards(result.Items, { itemsContainer: elem, shape: getPortraitShape(), @@ -121,7 +122,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader }); } if (result.Items.length >= query.Limit) { - tabContent.querySelector(".btnMoreFromGenre" + id + " i").classList.remove("hide"); + tabContent.querySelector('.btnMoreFromGenre' + id + ' .material-icons').classList.remove('hide'); } }); } @@ -129,8 +130,8 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader function reloadItems(context, promise) { var query = getQuery(); promise.then(function (result) { - var elem = context.querySelector("#items"); - var html = ""; + var elem = context.querySelector('#items'); + var html = ''; var items = result.Items; for (var i = 0, length = items.length; i < length; i++) { @@ -138,26 +139,26 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader html += '
'; html += '"; + html += ''; + html += ''; + html += ''; + html += '
'; if (enableScrollX()) { - var scrollXClass = "scrollX hiddenScrollX"; + var scrollXClass = 'scrollX hiddenScrollX'; if (layoutManager.tv) { - scrollXClass += "smoothScrollX padded-top-focusscale padded-bottom-focusscale"; + scrollXClass += 'smoothScrollX padded-top-focusscale padded-bottom-focusscale'; } html += '
'; } else { html += '
'; } - html += "
"; - html += "
"; + html += ''; + html += ''; } elem.innerHTML = html; @@ -176,7 +177,7 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader var data = {}; self.getViewStyles = function () { - return "Poster,PosterCard,Thumb,ThumbCard".split(","); + return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); }; self.getCurrentViewStyle = function () { diff --git a/src/controllers/shows/tvlatest.js b/src/controllers/shows/tvlatest.js index 5862fce45..08e420a59 100644 --- a/src/controllers/shows/tvlatest.js +++ b/src/controllers/shows/tvlatest.js @@ -1,28 +1,28 @@ -define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLoader"], function (loading, groupedcards, cardBuilder, appHost, imageLoader) { - "use strict"; +define(['loading', 'components/groupedcards', 'cardBuilder', 'apphost', 'imageLoader'], function (loading, groupedcards, cardBuilder, appHost, imageLoader) { + 'use strict'; function getLatestPromise(context, params) { loading.show(); var userId = ApiClient.getCurrentUserId(); var parentId = params.topParentId; var options = { - IncludeItemTypes: "Episode", + IncludeItemTypes: 'Episode', Limit: 30, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', ParentId: parentId, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb" + EnableImageTypes: 'Primary,Backdrop,Thumb' }; - return ApiClient.getJSON(ApiClient.getUrl("Users/" + userId + "/Items/Latest", options)); + return ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)); } function loadLatest(context, params, promise) { promise.then(function (items) { - var html = ""; - appHost.supports("imageanalysis"); + var html = ''; + appHost.supports('imageanalysis'); html += cardBuilder.getCardsHtml({ items: items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, showTitle: true, showSeriesYear: true, @@ -36,12 +36,12 @@ define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLo overlayPlayButton: true, lines: 2 }); - var elem = context.querySelector("#latestEpisodes"); + var elem = context.querySelector('#latestEpisodes'); elem.innerHTML = html; imageLoader.lazyChildren(elem); loading.hide(); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(context); }); }); @@ -59,6 +59,6 @@ define(["loading", "components/groupedcards", "cardBuilder", "apphost", "imageLo loadLatest(tabContent, params, latestPromise); }; - tabContent.querySelector("#latestEpisodes").addEventListener("click", groupedcards.onItemsContainerClick); + tabContent.querySelector('#latestEpisodes').addEventListener('click', groupedcards.onItemsContainerClick); }; }); diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index 4427d3fa7..8087a0309 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -1,39 +1,39 @@ -define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "dom", "userSettings", "cardBuilder", "playbackManager", "mainTabsManager", "globalize", "scrollStyles", "emby-itemscontainer", "emby-button"], function (events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager, globalize) { - "use strict"; +define(['events', 'inputManager', 'libraryMenu', 'layoutManager', 'loading', 'dom', 'userSettings', 'cardBuilder', 'playbackManager', 'mainTabsManager', 'globalize', 'scrollStyles', 'emby-itemscontainer', 'emby-button'], function (events, inputManager, libraryMenu, layoutManager, loading, dom, userSettings, cardBuilder, playbackManager, mainTabsManager, globalize) { + 'use strict'; function getTabs() { return [{ - name: globalize.translate("TabShows") + name: globalize.translate('TabShows') }, { - name: globalize.translate("TabSuggestions") + name: globalize.translate('TabSuggestions') }, { - name: globalize.translate("TabLatest") + name: globalize.translate('TabLatest') }, { - name: globalize.translate("TabUpcoming") + name: globalize.translate('TabUpcoming') }, { - name: globalize.translate("TabGenres") + name: globalize.translate('TabGenres') }, { - name: globalize.translate("TabNetworks") + name: globalize.translate('TabNetworks') }, { - name: globalize.translate("TabEpisodes") + name: globalize.translate('TabEpisodes') }, { - name: globalize.translate("ButtonSearch"), - cssClass: "searchTabButton" + name: globalize.translate('ButtonSearch'), + cssClass: 'searchTabButton' }]; } function getDefaultTabIndex(folderId) { - switch (userSettings.get("landing-" + folderId)) { - case "suggestions": + switch (userSettings.get('landing-' + folderId)) { + case 'suggestions': return 1; - case "latest": + case 'latest': return 2; - case "favorites": + case 'favorites': return 1; - case "genres": + case 'genres': return 4; default: @@ -43,19 +43,19 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do function setScrollClasses(elem, scrollX) { if (scrollX) { - elem.classList.add("hiddenScrollX"); + elem.classList.add('hiddenScrollX'); if (layoutManager.tv) { - elem.classList.add("smoothScrollX"); + elem.classList.add('smoothScrollX'); } - elem.classList.add("scrollX"); - elem.classList.remove("vertical-wrap"); + elem.classList.add('scrollX'); + elem.classList.remove('vertical-wrap'); } else { - elem.classList.remove("hiddenScrollX"); - elem.classList.remove("smoothScrollX"); - elem.classList.remove("scrollX"); - elem.classList.add("vertical-wrap"); + elem.classList.remove('hiddenScrollX'); + elem.classList.remove('smoothScrollX'); + elem.classList.remove('scrollX'); + elem.classList.add('vertical-wrap'); } } @@ -69,25 +69,25 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do function loadNextUp() { var query = { Limit: 24, - Fields: "PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo', UserId: ApiClient.getCurrentUserId(), ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", + EnableImageTypes: 'Primary,Backdrop,Thumb', EnableTotalRecordCount: false }; query.ParentId = libraryMenu.getTopParentId(); ApiClient.getNextUpEpisodes(query).then(function (result) { if (result.Items.length) { - view.querySelector(".noNextUpItems").classList.add("hide"); + view.querySelector('.noNextUpItems').classList.add('hide'); } else { - view.querySelector(".noNextUpItems").classList.remove("hide"); + view.querySelector('.noNextUpItems').classList.remove('hide'); } - var container = view.querySelector("#nextUpItems"); + var container = view.querySelector('#nextUpItems'); cardBuilder.buildCards(result.Items, { itemsContainer: container, preferThumb: true, - shape: "backdrop", + shape: 'backdrop', scalable: true, showTitle: true, showParentTitle: true, @@ -98,7 +98,7 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do }); loading.hide(); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(view); }); }); @@ -109,7 +109,7 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do } function getThumbShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop"; + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function loadResume() { @@ -117,28 +117,28 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do var screenWidth = dom.getWindowSize().innerWidth; var limit = screenWidth >= 1600 ? 5 : 6; var options = { - SortBy: "DatePlayed", - SortOrder: "Descending", - IncludeItemTypes: "Episode", - Filters: "IsResumable", + SortBy: 'DatePlayed', + SortOrder: 'Descending', + IncludeItemTypes: 'Episode', + Filters: 'IsResumable', Limit: limit, Recursive: true, - Fields: "PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo", - ExcludeLocationTypes: "Virtual", + Fields: 'PrimaryImageAspectRatio,SeriesInfo,UserData,BasicSyncInfo', + ExcludeLocationTypes: 'Virtual', ParentId: parentId, ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Thumb", + EnableImageTypes: 'Primary,Backdrop,Thumb', EnableTotalRecordCount: false }; ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) { if (result.Items.length) { - view.querySelector("#resumableSection").classList.remove("hide"); + view.querySelector('#resumableSection').classList.remove('hide'); } else { - view.querySelector("#resumableSection").classList.add("hide"); + view.querySelector('#resumableSection').classList.add('hide'); } var allowBottomPadding = !enableScrollX(); - var container = view.querySelector("#resumableItems"); + var container = view.querySelector('#resumableItems'); cardBuilder.buildCards(result.Items, { itemsContainer: container, preferThumb: true, @@ -165,7 +165,7 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do } function getTabContainers() { - return view.querySelectorAll(".pageTabContent"); + return view.querySelectorAll('.pageTabContent'); } function initTabs() { @@ -177,34 +177,34 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do switch (index) { case 0: - depends.push("controllers/shows/tvshows"); + depends.push('controllers/shows/tvshows'); break; case 1: break; case 2: - depends.push("controllers/shows/tvlatest"); + depends.push('controllers/shows/tvlatest'); break; case 3: - depends.push("controllers/shows/tvupcoming"); + depends.push('controllers/shows/tvupcoming'); break; case 4: - depends.push("controllers/shows/tvgenres"); + depends.push('controllers/shows/tvgenres'); break; case 5: - depends.push("controllers/shows/tvstudios"); + depends.push('controllers/shows/tvstudios'); break; case 6: - depends.push("controllers/shows/episodes"); + depends.push('controllers/shows/episodes'); break; case 7: - depends.push("scripts/searchtab"); + depends.push('scripts/searchtab'); } require(depends, function (controllerFactory) { @@ -224,7 +224,7 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do controller = self; } else if (index === 7) { controller = new controllerFactory(view, tabContent, { - collectionType: "tvshows", + collectionType: 'tvshows', parentId: params.topParentId }); } else { @@ -263,7 +263,7 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do } function onPlaybackStop(e, state) { - if (state.NowPlayingItem && state.NowPlayingItem.MediaType == "Video") { + if (state.NowPlayingItem && state.NowPlayingItem.MediaType == 'Video') { renderedTabs = []; mainTabsManager.getTabsElement().triggerTabChange(); } @@ -272,16 +272,16 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do function onWebSocketMessage(e, data) { var msg = data; - if (msg.MessageType === "UserDataChanged" && msg.Data.UserId == ApiClient.getCurrentUserId()) { + if (msg.MessageType === 'UserDataChanged' && msg.Data.UserId == ApiClient.getCurrentUserId()) { renderedTabs = []; } } function onInputCommand(e) { switch (e.detail.command) { - case "search": + case 'search': e.preventDefault(); - Dashboard.navigate("search.html?collectionType=tv&parentId=" + params.topParentId); + Dashboard.navigate('search.html?collectionType=tv&parentId=' + params.topParentId); } } @@ -292,7 +292,7 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do self.initTab = function () { var tabContent = self.tabContent; - setScrollClasses(tabContent.querySelector("#resumableItems"), enableScrollX()); + setScrollClasses(tabContent.querySelector('#resumableItems'), enableScrollX()); }; self.renderTab = function () { @@ -301,34 +301,34 @@ define(["events", "inputManager", "libraryMenu", "layoutManager", "loading", "do var tabControllers = []; var renderedTabs = []; - setScrollClasses(view.querySelector("#resumableItems"), enableScrollX()); - view.addEventListener("viewshow", function (e) { + setScrollClasses(view.querySelector('#resumableItems'), enableScrollX()); + view.addEventListener('viewshow', function (e) { isViewRestored = e.detail.isRestored; initTabs(); - if (!view.getAttribute("data-title")) { + if (!view.getAttribute('data-title')) { var parentId = params.topParentId; if (parentId) { ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) { - view.setAttribute("data-title", item.Name); + view.setAttribute('data-title', item.Name); libraryMenu.setTitle(item.Name); }); } else { - view.setAttribute("data-title", globalize.translate("TabShows")); - libraryMenu.setTitle(globalize.translate("TabShows")); + view.setAttribute('data-title', globalize.translate('TabShows')); + libraryMenu.setTitle(globalize.translate('TabShows')); } } - events.on(playbackManager, "playbackstop", onPlaybackStop); - events.on(ApiClient, "message", onWebSocketMessage); + events.on(playbackManager, 'playbackstop', onPlaybackStop); + events.on(ApiClient, 'message', onWebSocketMessage); inputManager.on(window, onInputCommand); }); - view.addEventListener("viewbeforehide", function (e) { + view.addEventListener('viewbeforehide', function (e) { inputManager.off(window, onInputCommand); - events.off(playbackManager, "playbackstop", onPlaybackStop); - events.off(ApiClient, "message", onWebSocketMessage); + events.off(playbackManager, 'playbackstop', onPlaybackStop); + events.off(ApiClient, 'message', onWebSocketMessage); }); - view.addEventListener("viewdestroy", function (e) { + view.addEventListener('viewdestroy', function (e) { tabControllers.forEach(function (t) { if (t.destroy) { t.destroy(); diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 0f992fe8d..753516f90 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -1,5 +1,5 @@ -define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "userSettings", "globalize", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings, globalize) { - "use strict"; +define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'alphaPicker', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings, globalize) { + 'use strict'; return function (view, params, tabContent) { function getPageData(context) { @@ -9,16 +9,16 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Series", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Series', Recursive: true, - Fields: "PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -38,7 +38,7 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function getSavedQueryKey(context) { if (!context.savedQueryKey) { - context.savedQueryKey = libraryBrowser.getSavedQueryKey("series"); + context.savedQueryKey = libraryBrowser.getSavedQueryKey('series'); } return context.savedQueryKey; @@ -46,17 +46,17 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " function onViewStyleChange() { var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems(page) { @@ -100,45 +100,45 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " filterButton: false }); var viewStyle = self.getCurrentViewStyle(); - if (viewStyle == "Thumb") { + if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "tvshows", + context: 'tvshows', overlayMoreButton: true, showTitle: true, centerText: true }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, - context: "tvshows", + context: 'tvshows', cardLayout: true, showTitle: true, showYear: true, centerText: true }); - } else if (viewStyle == "Banner") { + } else if (viewStyle == 'Banner') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "banner", + shape: 'banner', preferBanner: true, - context: "tvshows" + context: 'tvshows' }); - } else if (viewStyle == "List") { + } else if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, - context: "tvshows", + context: 'tvshows', sortBy: query.SortBy }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "portrait", - context: "tvshows", + shape: 'portrait', + context: 'tvshows', showTitle: true, showYear: true, centerText: true, @@ -147,8 +147,8 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "portrait", - context: "tvshows", + shape: 'portrait', + context: 'tvshows', centerText: true, lazy: true, overlayMoreButton: true, @@ -158,30 +158,30 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " } var i; var length; - var elems = tabContent.querySelectorAll(".paging"); + var elems = tabContent.querySelectorAll('.paging'); for (i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } - elems = tabContent.querySelectorAll(".btnNextPage"); + elems = tabContent.querySelectorAll('.btnNextPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onNextPageClick); + elems[i].addEventListener('click', onNextPageClick); } - elems = tabContent.querySelectorAll(".btnPreviousPage"); + elems = tabContent.querySelectorAll('.btnPreviousPage'); for (i = 0, length = elems.length; i < length; i++) { - elems[i].addEventListener("click", onPreviousPageClick); + elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); @@ -197,13 +197,13 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " var isLoading = false; self.showFilterMenu = function () { - require(["components/filterdialog/filterdialog"], function (filterDialogFactory) { + require(['components/filterdialog/filterdialog'], function (filterDialogFactory) { var filterDialog = new filterDialogFactory({ query: getQuery(tabContent), - mode: "series", + mode: 'series', serverId: ApiClient.serverId() }); - events.on(filterDialog, "filterchange", function () { + events.on(filterDialog, 'filterchange', function () { getQuery(tabContent).StartIndex = 0; reloadItems(tabContent); }); @@ -216,10 +216,10 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector(".alphaPicker"); - var itemsContainer = tabContent.querySelector(".itemsContainer"); + var alphaPickerElement = tabContent.querySelector('.alphaPicker'); + var itemsContainer = tabContent.querySelector('.itemsContainer'); - alphaPickerElement.addEventListener("alphavaluechanged", function (e) { + alphaPickerElement.addEventListener('alphavaluechanged', function (e) { var newValue = e.detail.value; var query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; @@ -228,36 +228,36 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " }); self.alphaPicker = new alphaPicker({ element: alphaPickerElement, - valueChangeEvent: "click" + valueChangeEvent: 'click' }); - tabContent.querySelector(".alphaPicker").classList.add("alphabetPicker-right"); - alphaPickerElement.classList.add("alphaPicker-fixed-right"); - itemsContainer.classList.add("padded-right-withalphapicker"); + tabContent.querySelector('.alphaPicker').classList.add('alphabetPicker-right'); + alphaPickerElement.classList.add('alphaPicker-fixed-right'); + itemsContainer.classList.add('padded-right-withalphapicker'); - tabContent.querySelector(".btnFilter").addEventListener("click", function () { + tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - tabContent.querySelector(".btnSort").addEventListener("click", function (e) { + tabContent.querySelector('.btnSort').addEventListener('click', function (e) { libraryBrowser.showSortMenu({ items: [{ - name: globalize.translate("OptionNameSort"), - id: "SortName" + name: globalize.translate('OptionNameSort'), + id: 'SortName' }, { - name: globalize.translate("OptionImdbRating"), - id: "CommunityRating,SortName" + name: globalize.translate('OptionImdbRating'), + id: 'CommunityRating,SortName' }, { - name: globalize.translate("OptionDateAdded"), - id: "DateCreated,SortName" + name: globalize.translate('OptionDateAdded'), + id: 'DateCreated,SortName' }, { - name: globalize.translate("OptionDatePlayed"), - id: "DatePlayed,SortName" + name: globalize.translate('OptionDatePlayed'), + id: 'DatePlayed,SortName' }, { - name: globalize.translate("OptionParentalRating"), - id: "OfficialRating,SortName" + name: globalize.translate('OptionParentalRating'), + id: 'OfficialRating,SortName' }, { - name: globalize.translate("OptionReleaseDate"), - id: "PremiereDate,SortName" + name: globalize.translate('OptionReleaseDate'), + id: 'PremiereDate,SortName' }], callback: function () { getQuery(tabContent).StartIndex = 0; @@ -267,11 +267,11 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", " button: e.target }); }); - var btnSelectView = tabContent.querySelector(".btnSelectView"); - btnSelectView.addEventListener("click", function (e) { - libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), "Banner,List,Poster,PosterCard,Thumb,ThumbCard".split(",")); + var btnSelectView = tabContent.querySelector('.btnSelectView'); + btnSelectView.addEventListener('click', function (e) { + libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'Banner,List,Poster,PosterCard,Thumb,ThumbCard'.split(',')); }); - btnSelectView.addEventListener("layoutchange", function (e) { + btnSelectView.addEventListener('layoutchange', function (e) { var viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); diff --git a/src/controllers/shows/tvstudios.js b/src/controllers/shows/tvstudios.js index 4e715e1fd..1051bfa10 100644 --- a/src/controllers/shows/tvstudios.js +++ b/src/controllers/shows/tvstudios.js @@ -1,5 +1,5 @@ -define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function (loading, libraryBrowser, cardBuilder, appHost) { - "use strict"; +define(['loading', 'libraryBrowser', 'cardBuilder', 'apphost'], function (loading, libraryBrowser, cardBuilder, appHost) { + 'use strict'; function getQuery(params) { var key = getSavedQueryKey(); @@ -8,11 +8,11 @@ define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function (loadin if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Series", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Series', Recursive: true, - Fields: "DateCreated,PrimaryImageAspectRatio", + Fields: 'DateCreated,PrimaryImageAspectRatio', StartIndex: 0 } }; @@ -23,7 +23,7 @@ define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function (loadin } function getSavedQueryKey() { - return libraryBrowser.getSavedQueryKey("studios"); + return libraryBrowser.getSavedQueryKey('studios'); } function getPromise(context, params) { @@ -34,20 +34,20 @@ define(["loading", "libraryBrowser", "cardBuilder", "apphost"], function (loadin function reloadItems(context, params, promise) { promise.then(function (result) { - var elem = context.querySelector("#items"); + var elem = context.querySelector('#items'); cardBuilder.buildCards(result.Items, { itemsContainer: elem, - shape: "backdrop", + shape: 'backdrop', preferThumb: true, showTitle: true, scalable: true, centerText: true, overlayMoreButton: true, - context: "tvshows" + context: 'tvshows' }); loading.hide(); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(context); }); }); diff --git a/src/controllers/shows/tvupcoming.js b/src/controllers/shows/tvupcoming.js index 816717edf..d57a5ae3c 100644 --- a/src/controllers/shows/tvupcoming.js +++ b/src/controllers/shows/tvupcoming.js @@ -1,18 +1,18 @@ -define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", "apphost", "imageLoader", "globalize", "scrollStyles", "emby-itemscontainer"], function (layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader, globalize) { - "use strict"; +define(['layoutManager', 'loading', 'datetime', 'libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'globalize', 'scrollStyles', 'emby-itemscontainer'], function (layoutManager, loading, datetime, libraryBrowser, cardBuilder, appHost, imageLoader, globalize) { + 'use strict'; function getUpcomingPromise(context, params) { loading.show(); var query = { Limit: 48, - Fields: "AirTime,UserData", + Fields: 'AirTime,UserData', UserId: ApiClient.getCurrentUserId(), ImageTypeLimit: 1, - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', EnableTotalRecordCount: false }; query.ParentId = params.topParentId; - return ApiClient.getJSON(ApiClient.getUrl("Shows/Upcoming", query)); + return ApiClient.getJSON(ApiClient.getUrl('Shows/Upcoming', query)); } function loadUpcoming(context, params, promise) { @@ -20,12 +20,12 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", var items = result.Items; if (items.length) { - context.querySelector(".noItemsMessage").style.display = "none"; + context.querySelector('.noItemsMessage').style.display = 'none'; } else { - context.querySelector(".noItemsMessage").style.display = "block"; + context.querySelector('.noItemsMessage').style.display = 'block'; } - renderUpcoming(context.querySelector("#upcomingItems"), items); + renderUpcoming(context.querySelector('#upcomingItems'), items); loading.hide(); }); } @@ -35,27 +35,27 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", } function getThumbShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop"; + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function renderUpcoming(elem, items) { var i; var length; var groups = []; - var currentGroupName = ""; + var currentGroupName = ''; var currentGroup = []; for (i = 0, length = items.length; i < length; i++) { var item = items[i]; - var dateText = ""; + var dateText = ''; if (item.PremiereDate) { try { var premiereDate = datetime.parseISO8601Date(item.PremiereDate, true); - dateText = datetime.isRelativeDay(premiereDate, -1) ? globalize.translate("Yesterday") : datetime.toLocaleDateString(premiereDate, { - weekday: "long", - month: "short", - day: "numeric" + dateText = datetime.isRelativeDay(premiereDate, -1) ? globalize.translate('Yesterday') : datetime.toLocaleDateString(premiereDate, { + weekday: 'long', + month: 'short', + day: 'numeric' }); } catch (err) { console.error('error parsing timestamp for upcoming tv shows'); @@ -77,20 +77,20 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", } } - var html = ""; + var html = ''; for (i = 0, length = groups.length; i < length; i++) { var group = groups[i]; html += '
'; - html += '

' + group.name + "

"; + html += '

' + group.name + '

'; var allowBottomPadding = true; if (enableScrollX()) { allowBottomPadding = false; - var scrollXClass = "scrollX hiddenScrollX"; + var scrollXClass = 'scrollX hiddenScrollX'; if (layoutManager.tv) { - scrollXClass += " smoothScrollX"; + scrollXClass += ' smoothScrollX'; } html += '
'; @@ -98,7 +98,7 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", html += '
'; } - var supportsImageAnalysis = appHost.supports("imageanalysis"); + var supportsImageAnalysis = appHost.supports('imageanalysis'); supportsImageAnalysis = false; html += cardBuilder.getCardsHtml({ items: group.items, @@ -116,8 +116,8 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", overlayMoreButton: true, missingIndicator: false }); - html += "
"; - html += "
"; + html += '
'; + html += ''; } elem.innerHTML = html; diff --git a/src/controllers/user/display.js b/src/controllers/user/display.js index 28d39b7fd..3aeb7db8c 100644 --- a/src/controllers/user/display.js +++ b/src/controllers/user/display.js @@ -1,10 +1,10 @@ -define(["displaySettings", "userSettings", "autoFocuser"], function (DisplaySettings, userSettings, autoFocuser) { - "use strict"; +define(['displaySettings', 'userSettings', 'autoFocuser'], function (DisplaySettings, userSettings, autoFocuser) { + 'use strict'; return function (view, params) { function onBeforeUnload(e) { if (hasChanges) { - e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; + e.returnValue = 'You currently have unsaved changes. Are you sure you wish to leave?'; } } @@ -12,8 +12,8 @@ define(["displaySettings", "userSettings", "autoFocuser"], function (DisplaySett var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); - view.addEventListener("viewshow", function () { - window.addEventListener("beforeunload", onBeforeUnload); + view.addEventListener('viewshow', function () { + window.addEventListener('beforeunload', onBeforeUnload); if (settingsInstance) { settingsInstance.loadData(); @@ -21,7 +21,7 @@ define(["displaySettings", "userSettings", "autoFocuser"], function (DisplaySett settingsInstance = new DisplaySettings({ serverId: ApiClient.serverId(), userId: userId, - element: view.querySelector(".settingsContainer"), + element: view.querySelector('.settingsContainer'), userSettings: currentSettings, enableSaveButton: false, enableSaveConfirmation: false, @@ -29,18 +29,18 @@ define(["displaySettings", "userSettings", "autoFocuser"], function (DisplaySett }); } }); - view.addEventListener("change", function () { + view.addEventListener('change', function () { hasChanges = true; }); - view.addEventListener("viewbeforehide", function () { - window.removeEventListener("beforeunload", onBeforeUnload); + view.addEventListener('viewbeforehide', function () { + window.removeEventListener('beforeunload', onBeforeUnload); hasChanges = false; if (settingsInstance) { settingsInstance.submit(); } }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { if (settingsInstance) { settingsInstance.destroy(); settingsInstance = null; diff --git a/src/controllers/user/home.js b/src/controllers/user/home.js index dccf6e506..aa7d147c3 100644 --- a/src/controllers/user/home.js +++ b/src/controllers/user/home.js @@ -1,10 +1,10 @@ -define(["homescreenSettings", "dom", "globalize", "loading", "userSettings", "autoFocuser", "listViewStyle"], function (HomescreenSettings, dom, globalize, loading, userSettings, autoFocuser) { - "use strict"; +define(['homescreenSettings', 'dom', 'globalize', 'loading', 'userSettings', 'autoFocuser', 'listViewStyle'], function (HomescreenSettings, dom, globalize, loading, userSettings, autoFocuser) { + 'use strict'; return function (view, params) { function onBeforeUnload(e) { if (hasChanges) { - e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; + e.returnValue = 'You currently have unsaved changes. Are you sure you wish to leave?'; } } @@ -12,8 +12,8 @@ define(["homescreenSettings", "dom", "globalize", "loading", "userSettings", "au var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); - view.addEventListener("viewshow", function () { - window.addEventListener("beforeunload", onBeforeUnload); + view.addEventListener('viewshow', function () { + window.addEventListener('beforeunload', onBeforeUnload); if (homescreenSettingsInstance) { homescreenSettingsInstance.loadData(); @@ -21,7 +21,7 @@ define(["homescreenSettings", "dom", "globalize", "loading", "userSettings", "au homescreenSettingsInstance = new HomescreenSettings({ serverId: ApiClient.serverId(), userId: userId, - element: view.querySelector(".homeScreenSettingsContainer"), + element: view.querySelector('.homeScreenSettingsContainer'), userSettings: currentSettings, enableSaveButton: false, enableSaveConfirmation: false, @@ -29,17 +29,17 @@ define(["homescreenSettings", "dom", "globalize", "loading", "userSettings", "au }); } }); - view.addEventListener("change", function () { + view.addEventListener('change', function () { hasChanges = true; }); - view.addEventListener("viewbeforehide", function () { + view.addEventListener('viewbeforehide', function () { hasChanges = false; if (homescreenSettingsInstance) { homescreenSettingsInstance.submit(); } }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { if (homescreenSettingsInstance) { homescreenSettingsInstance.destroy(); homescreenSettingsInstance = null; diff --git a/src/controllers/user/menu.js b/src/controllers/user/menu.js index e7d816fb6..df5864dbd 100644 --- a/src/controllers/user/menu.js +++ b/src/controllers/user/menu.js @@ -1,62 +1,62 @@ -define(["apphost", "connectionManager", "layoutManager", "listViewStyle", "emby-button"], function(appHost, connectionManager, layoutManager) { - "use strict"; +define(['apphost', 'connectionManager', 'layoutManager', 'listViewStyle', 'emby-button'], function(appHost, connectionManager, layoutManager) { + 'use strict'; return function(view, params) { - view.querySelector(".btnLogout").addEventListener("click", function() { + view.querySelector('.btnLogout').addEventListener('click', function() { Dashboard.logout(); }); - view.querySelector(".selectServer").addEventListener("click", function () { + view.querySelector('.selectServer').addEventListener('click', function () { Dashboard.selectServer(); }); - view.querySelector(".clientSettings").addEventListener("click", function () { + view.querySelector('.clientSettings').addEventListener('click', function () { window.NativeShell.openClientSettings(); }); - view.addEventListener("viewshow", function() { + view.addEventListener('viewshow', function() { // this page can also be used by admins to change user preferences from the user edit page var userId = params.userId || Dashboard.getCurrentUserId(); var page = this; - page.querySelector(".lnkMyProfile").setAttribute("href", "myprofile.html?userId=" + userId); - page.querySelector(".lnkDisplayPreferences").setAttribute("href", "mypreferencesdisplay.html?userId=" + userId); - page.querySelector(".lnkHomePreferences").setAttribute("href", "mypreferenceshome.html?userId=" + userId); - page.querySelector(".lnkPlaybackPreferences").setAttribute("href", "mypreferencesplayback.html?userId=" + userId); - page.querySelector(".lnkSubtitlePreferences").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId); + page.querySelector('.lnkMyProfile').setAttribute('href', 'myprofile.html?userId=' + userId); + page.querySelector('.lnkDisplayPreferences').setAttribute('href', 'mypreferencesdisplay.html?userId=' + userId); + page.querySelector('.lnkHomePreferences').setAttribute('href', 'mypreferenceshome.html?userId=' + userId); + page.querySelector('.lnkPlaybackPreferences').setAttribute('href', 'mypreferencesplayback.html?userId=' + userId); + page.querySelector('.lnkSubtitlePreferences').setAttribute('href', 'mypreferencessubtitles.html?userId=' + userId); - if (window.NativeShell && window.NativeShell.AppHost.supports("clientsettings")) { - page.querySelector(".clientSettings").classList.remove("hide"); + if (window.NativeShell && window.NativeShell.AppHost.supports('clientsettings')) { + page.querySelector('.clientSettings').classList.remove('hide'); } else { - page.querySelector(".clientSettings").classList.add("hide"); + page.querySelector('.clientSettings').classList.add('hide'); } - if (appHost.supports("multiserver")) { - page.querySelector(".selectServer").classList.remove("hide"); + if (appHost.supports('multiserver')) { + page.querySelector('.selectServer').classList.remove('hide'); } else { - page.querySelector(".selectServer").classList.add("hide"); + page.querySelector('.selectServer').classList.add('hide'); } // hide the actions if user preferences are being edited for a different user if (params.userId && params.userId !== Dashboard.getCurrentUserId) { - page.querySelector(".userSection").classList.add("hide"); - page.querySelector(".adminSection").classList.add("hide"); + page.querySelector('.userSection').classList.add('hide'); + page.querySelector('.adminSection').classList.add('hide'); } if (layoutManager.mobile) { - page.querySelector(".headerUsername").classList.add("hide"); - page.querySelector(".adminSection").classList.add("hide"); - page.querySelector(".userSection").classList.add("hide"); + page.querySelector('.headerUsername').classList.add('hide'); + page.querySelector('.adminSection').classList.add('hide'); + page.querySelector('.userSection').classList.add('hide'); } ApiClient.getUser(userId).then(function(user) { - page.querySelector(".headerUsername").innerHTML = user.Name; + page.querySelector('.headerUsername').innerHTML = user.Name; if (!user.Policy.IsAdministrator) { - page.querySelector(".adminSection").classList.add("hide"); + page.querySelector('.adminSection').classList.add('hide'); } }); - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(view); }); }); diff --git a/src/controllers/user/playback.js b/src/controllers/user/playback.js index 8f48e0264..e945a46aa 100644 --- a/src/controllers/user/playback.js +++ b/src/controllers/user/playback.js @@ -1,10 +1,10 @@ -define(["playbackSettings", "dom", "globalize", "loading", "userSettings", "autoFocuser", "listViewStyle"], function (PlaybackSettings, dom, globalize, loading, userSettings, autoFocuser) { - "use strict"; +define(['playbackSettings', 'dom', 'globalize', 'loading', 'userSettings', 'autoFocuser', 'listViewStyle'], function (PlaybackSettings, dom, globalize, loading, userSettings, autoFocuser) { + 'use strict'; return function (view, params) { function onBeforeUnload(e) { if (hasChanges) { - e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; + e.returnValue = 'You currently have unsaved changes. Are you sure you wish to leave?'; } } @@ -12,8 +12,8 @@ define(["playbackSettings", "dom", "globalize", "loading", "userSettings", "auto var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); - view.addEventListener("viewshow", function () { - window.addEventListener("beforeunload", onBeforeUnload); + view.addEventListener('viewshow', function () { + window.addEventListener('beforeunload', onBeforeUnload); if (settingsInstance) { settingsInstance.loadData(); @@ -21,7 +21,7 @@ define(["playbackSettings", "dom", "globalize", "loading", "userSettings", "auto settingsInstance = new PlaybackSettings({ serverId: ApiClient.serverId(), userId: userId, - element: view.querySelector(".settingsContainer"), + element: view.querySelector('.settingsContainer'), userSettings: currentSettings, enableSaveButton: false, enableSaveConfirmation: false, @@ -29,17 +29,17 @@ define(["playbackSettings", "dom", "globalize", "loading", "userSettings", "auto }); } }); - view.addEventListener("change", function () { + view.addEventListener('change', function () { hasChanges = true; }); - view.addEventListener("viewbeforehide", function () { + view.addEventListener('viewbeforehide', function () { hasChanges = false; if (settingsInstance) { settingsInstance.submit(); } }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { if (settingsInstance) { settingsInstance.destroy(); settingsInstance = null; diff --git a/src/controllers/user/profile.js b/src/controllers/user/profile.js index d0ff4edd0..0f4f2c7bc 100644 --- a/src/controllers/user/profile.js +++ b/src/controllers/user/profile.js @@ -1,31 +1,31 @@ -define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "globalize", "emby-button"], function (UserPasswordPage, loading, libraryMenu, appHost, globalize) { - "use strict"; +define(['controllers/userpasswordpage', 'loading', 'libraryMenu', 'apphost', 'globalize', 'emby-button'], function (UserPasswordPage, loading, libraryMenu, appHost, globalize) { + 'use strict'; function reloadUser(page) { - var userId = getParameterByName("userId"); + var userId = getParameterByName('userId'); loading.show(); ApiClient.getUser(userId).then(function (user) { - page.querySelector(".username").innerHTML = user.Name; + page.querySelector('.username').innerHTML = user.Name; libraryMenu.setTitle(user.Name); - var imageUrl = "assets/img/avatar.png"; + var imageUrl = 'assets/img/avatar.png'; if (user.PrimaryImageTag) { imageUrl = ApiClient.getUserImageUrl(user.Id, { tag: user.PrimaryImageTag, - type: "Primary" + type: 'Primary' }); } - var userImage = page.querySelector("#image"); - userImage.style.backgroundImage = "url(" + imageUrl + ")"; + var userImage = page.querySelector('#image'); + userImage.style.backgroundImage = 'url(' + imageUrl + ')'; Dashboard.getCurrentUser().then(function (loggedInUser) { if (user.PrimaryImageTag) { - page.querySelector("#btnAddImage").classList.add("hide"); - page.querySelector("#btnDeleteImage").classList.remove("hide"); - } else if (appHost.supports("fileinput") && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector("#btnDeleteImage").classList.add("hide"); - page.querySelector("#btnAddImage").classList.remove("hide"); + page.querySelector('#btnAddImage').classList.add('hide'); + page.querySelector('#btnDeleteImage').classList.remove('hide'); + } else if (appHost.supports('fileinput') && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { + page.querySelector('#btnDeleteImage').classList.add('hide'); + page.querySelector('#btnAddImage').classList.remove('hide'); } }); loading.hide(); @@ -36,8 +36,8 @@ define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "gl loading.hide(); switch (evt.target.error.code) { case evt.target.error.NOT_FOUND_ERR: - require(["toast"], function (toast) { - toast(globalize.translate("FileNotFound")); + require(['toast'], function (toast) { + toast(globalize.translate('FileNotFound')); }); break; case evt.target.error.ABORT_ERR: @@ -45,24 +45,24 @@ define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "gl break; case evt.target.error.NOT_READABLE_ERR: default: - require(["toast"], function (toast) { - toast(globalize.translate("FileReadError")); + require(['toast'], function (toast) { + toast(globalize.translate('FileReadError')); }); } } function onFileReaderAbort(evt) { loading.hide(); - require(["toast"], function (toast) { - toast(globalize.translate("FileReadCancelled")); + require(['toast'], function (toast) { + toast(globalize.translate('FileReadCancelled')); }); } function setFiles(page, files) { - var userImage = page.querySelector("#image"); + var userImage = page.querySelector('#image'); var file = files[0]; - if (!file || !file.type.match("image.*")) { + if (!file || !file.type.match('image.*')) { return false; } @@ -70,9 +70,9 @@ define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "gl reader.onerror = onFileReaderError; reader.onabort = onFileReaderAbort; reader.onload = function (evt) { - userImage.style.backgroundImage = "url(" + evt.target.result + ")"; - var userId = getParameterByName("userId"); - ApiClient.uploadUserImage(userId, "Primary", file).then(function () { + userImage.style.backgroundImage = 'url(' + evt.target.result + ')'; + var userId = getParameterByName('userId'); + ApiClient.uploadUserImage(userId, 'Primary', file).then(function () { loading.hide(); reloadUser(page); }); @@ -84,22 +84,22 @@ define(["controllers/userpasswordpage", "loading", "libraryMenu", "apphost", "gl return function (view, params) { reloadUser(view); new UserPasswordPage(view, params); - view.querySelector("#btnDeleteImage").addEventListener("click", function () { - require(["confirm"], function (confirm) { - confirm(globalize.translate("DeleteImageConfirmation"), globalize.translate("DeleteImage")).then(function () { + view.querySelector('#btnDeleteImage').addEventListener('click', function () { + require(['confirm'], function (confirm) { + confirm(globalize.translate('DeleteImageConfirmation'), globalize.translate('DeleteImage')).then(function () { loading.show(); - var userId = getParameterByName("userId"); - ApiClient.deleteUserImage(userId, "primary").then(function () { + var userId = getParameterByName('userId'); + ApiClient.deleteUserImage(userId, 'primary').then(function () { loading.hide(); reloadUser(view); }); }); }); }); - view.querySelector("#btnAddImage").addEventListener("click", function (evt) { - view.querySelector("#uploadImage").click(); + view.querySelector('#btnAddImage').addEventListener('click', function (evt) { + view.querySelector('#uploadImage').click(); }); - view.querySelector("#uploadImage").addEventListener("change", function (evt) { + view.querySelector('#uploadImage').addEventListener('change', function (evt) { setFiles(view, evt.target.files); }); }; diff --git a/src/controllers/user/subtitles.js b/src/controllers/user/subtitles.js index e2b98dc2d..152301f31 100644 --- a/src/controllers/user/subtitles.js +++ b/src/controllers/user/subtitles.js @@ -1,10 +1,10 @@ -define(["subtitleSettings", "userSettings", "autoFocuser"], function (SubtitleSettings, userSettings, autoFocuser) { - "use strict"; +define(['subtitleSettings', 'userSettings', 'autoFocuser'], function (SubtitleSettings, userSettings, autoFocuser) { + 'use strict'; return function (view, params) { function onBeforeUnload(e) { if (hasChanges) { - e.returnValue = "You currently have unsaved changes. Are you sure you wish to leave?"; + e.returnValue = 'You currently have unsaved changes. Are you sure you wish to leave?'; } } @@ -12,8 +12,8 @@ define(["subtitleSettings", "userSettings", "autoFocuser"], function (SubtitleSe var hasChanges; var userId = params.userId || ApiClient.getCurrentUserId(); var currentSettings = userId === ApiClient.getCurrentUserId() ? userSettings : new userSettings(); - view.addEventListener("viewshow", function () { - window.addEventListener("beforeunload", onBeforeUnload); + view.addEventListener('viewshow', function () { + window.addEventListener('beforeunload', onBeforeUnload); if (subtitleSettingsInstance) { subtitleSettingsInstance.loadData(); @@ -21,7 +21,7 @@ define(["subtitleSettings", "userSettings", "autoFocuser"], function (SubtitleSe subtitleSettingsInstance = new SubtitleSettings({ serverId: ApiClient.serverId(), userId: userId, - element: view.querySelector(".settingsContainer"), + element: view.querySelector('.settingsContainer'), userSettings: currentSettings, enableSaveButton: false, enableSaveConfirmation: false, @@ -29,17 +29,17 @@ define(["subtitleSettings", "userSettings", "autoFocuser"], function (SubtitleSe }); } }); - view.addEventListener("change", function () { + view.addEventListener('change', function () { hasChanges = true; }); - view.addEventListener("viewbeforehide", function () { + view.addEventListener('viewbeforehide', function () { hasChanges = false; if (subtitleSettingsInstance) { subtitleSettingsInstance.submit(); } }); - view.addEventListener("viewdestroy", function () { + view.addEventListener('viewdestroy', function () { if (subtitleSettingsInstance) { subtitleSettingsInstance.destroy(); subtitleSettingsInstance = null; diff --git a/src/controllers/useredit.js b/src/controllers/useredit.js index 45a8798e4..21ed60cfa 100644 --- a/src/controllers/useredit.js +++ b/src/controllers/useredit.js @@ -1,8 +1,8 @@ -define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function ($, loading, libraryMenu, globalize) { - "use strict"; +define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function ($, loading, libraryMenu, globalize) { + 'use strict'; function loadDeleteFolders(page, user, mediaFolders) { - ApiClient.getJSON(ApiClient.getUrl("Channels", { + ApiClient.getJSON(ApiClient.getUrl('Channels', { SupportsMediaDeletion: true })).then(function (channelsResult) { var i; @@ -10,140 +10,140 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function var folder; var isChecked; var checkedAttribute; - var html = ""; + var html = ''; for (i = 0, length = mediaFolders.length; i < length; i++) { folder = mediaFolders[i]; isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id); - checkedAttribute = isChecked ? ' checked="checked"' : ""; - html += '"; + checkedAttribute = isChecked ? ' checked="checked"' : ''; + html += ''; } for (i = 0, length = channelsResult.Items.length; i < length; i++) { folder = channelsResult.Items[i]; isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id); - checkedAttribute = isChecked ? ' checked="checked"' : ""; - html += '"; + checkedAttribute = isChecked ? ' checked="checked"' : ''; + html += ''; } - $(".deleteAccess", page).html(html).trigger("create"); - $("#chkEnableDeleteAllFolders", page).checked(user.Policy.EnableContentDeletion).trigger("change"); + $('.deleteAccess', page).html(html).trigger('create'); + $('#chkEnableDeleteAllFolders', page).checked(user.Policy.EnableContentDeletion).trigger('change'); }); } function loadAuthProviders(page, user, providers) { if (providers.length > 1) { - page.querySelector(".fldSelectLoginProvider").classList.remove("hide"); + page.querySelector('.fldSelectLoginProvider').classList.remove('hide'); } else { - page.querySelector(".fldSelectLoginProvider").classList.add("hide"); + page.querySelector('.fldSelectLoginProvider').classList.add('hide'); } var currentProviderId = user.Policy.AuthenticationProviderId; - page.querySelector(".selectLoginProvider").innerHTML = providers.map(function (provider) { - var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : ""; - return '"; + page.querySelector('.selectLoginProvider').innerHTML = providers.map(function (provider) { + var selected = provider.Id === currentProviderId || providers.length < 2 ? ' selected' : ''; + return ''; }); } function loadPasswordResetProviders(page, user, providers) { if (providers.length > 1) { - page.querySelector(".fldSelectPasswordResetProvider").classList.remove("hide"); + page.querySelector('.fldSelectPasswordResetProvider').classList.remove('hide'); } else { - page.querySelector(".fldSelectPasswordResetProvider").classList.add("hide"); + page.querySelector('.fldSelectPasswordResetProvider').classList.add('hide'); } var currentProviderId = user.Policy.PasswordResetProviderId; - page.querySelector(".selectPasswordResetProvider").innerHTML = providers.map(function (provider) { - var selected = provider.Id === currentProviderId || providers.length < 2 ? " selected" : ""; - return '"; + page.querySelector('.selectPasswordResetProvider').innerHTML = providers.map(function (provider) { + var selected = provider.Id === currentProviderId || providers.length < 2 ? ' selected' : ''; + return ''; }); } function loadUser(page, user) { currentUser = user; - ApiClient.getJSON(ApiClient.getUrl("Auth/Providers")).then(function (providers) { + ApiClient.getJSON(ApiClient.getUrl('Auth/Providers')).then(function (providers) { loadAuthProviders(page, user, providers); }); - ApiClient.getJSON(ApiClient.getUrl("Auth/PasswordResetProviders")).then(function (providers) { + ApiClient.getJSON(ApiClient.getUrl('Auth/PasswordResetProviders')).then(function (providers) { loadPasswordResetProviders(page, user, providers); }); - ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { + ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders', { IsHidden: false })).then(function (folders) { loadDeleteFolders(page, user, folders.Items); }); if (user.Policy.IsDisabled) { - $(".disabledUserBanner", page).show(); + $('.disabledUserBanner', page).show(); } else { - $(".disabledUserBanner", page).hide(); + $('.disabledUserBanner', page).hide(); } - $("#txtUserName", page).prop("disabled", "").removeAttr("disabled"); - $("#fldConnectInfo", page).show(); - $(".lnkEditUserPreferences", page).attr("href", "mypreferencesmenu.html?userId=" + user.Id); + $('#txtUserName', page).prop('disabled', '').removeAttr('disabled'); + $('#fldConnectInfo', page).show(); + $('.lnkEditUserPreferences', page).attr('href', 'mypreferencesmenu.html?userId=' + user.Id); libraryMenu.setTitle(user.Name); - page.querySelector(".username").innerHTML = user.Name; - $("#txtUserName", page).val(user.Name); - $("#chkIsAdmin", page).checked(user.Policy.IsAdministrator); - $("#chkDisabled", page).checked(user.Policy.IsDisabled); - $("#chkIsHidden", page).checked(user.Policy.IsHidden); - $("#chkRemoteControlSharedDevices", page).checked(user.Policy.EnableSharedDeviceControl); - $("#chkEnableRemoteControlOtherUsers", page).checked(user.Policy.EnableRemoteControlOfOtherUsers); - $("#chkEnableDownloading", page).checked(user.Policy.EnableContentDownloading); - $("#chkManageLiveTv", page).checked(user.Policy.EnableLiveTvManagement); - $("#chkEnableLiveTvAccess", page).checked(user.Policy.EnableLiveTvAccess); - $("#chkEnableMediaPlayback", page).checked(user.Policy.EnableMediaPlayback); - $("#chkEnableAudioPlaybackTranscoding", page).checked(user.Policy.EnableAudioPlaybackTranscoding); - $("#chkEnableVideoPlaybackTranscoding", page).checked(user.Policy.EnableVideoPlaybackTranscoding); - $("#chkEnableVideoPlaybackRemuxing", page).checked(user.Policy.EnablePlaybackRemuxing); - $("#chkForceRemoteSourceTranscoding", page).checked(user.Policy.ForceRemoteSourceTranscoding); - $("#chkRemoteAccess", page).checked(null == user.Policy.EnableRemoteAccess || user.Policy.EnableRemoteAccess); - $("#chkEnableSyncTranscoding", page).checked(user.Policy.EnableSyncTranscoding); - $("#chkEnableConversion", page).checked(user.Policy.EnableMediaConversion || false); - $("#chkEnableSharing", page).checked(user.Policy.EnablePublicSharing); - $("#txtRemoteClientBitrateLimit", page).val(user.Policy.RemoteClientBitrateLimit / 1e6 || ""); - $("#txtLoginAttemptsBeforeLockout", page).val(user.Policy.LoginAttemptsBeforeLockout || "0"); + page.querySelector('.username').innerHTML = user.Name; + $('#txtUserName', page).val(user.Name); + $('#chkIsAdmin', page).checked(user.Policy.IsAdministrator); + $('#chkDisabled', page).checked(user.Policy.IsDisabled); + $('#chkIsHidden', page).checked(user.Policy.IsHidden); + $('#chkRemoteControlSharedDevices', page).checked(user.Policy.EnableSharedDeviceControl); + $('#chkEnableRemoteControlOtherUsers', page).checked(user.Policy.EnableRemoteControlOfOtherUsers); + $('#chkEnableDownloading', page).checked(user.Policy.EnableContentDownloading); + $('#chkManageLiveTv', page).checked(user.Policy.EnableLiveTvManagement); + $('#chkEnableLiveTvAccess', page).checked(user.Policy.EnableLiveTvAccess); + $('#chkEnableMediaPlayback', page).checked(user.Policy.EnableMediaPlayback); + $('#chkEnableAudioPlaybackTranscoding', page).checked(user.Policy.EnableAudioPlaybackTranscoding); + $('#chkEnableVideoPlaybackTranscoding', page).checked(user.Policy.EnableVideoPlaybackTranscoding); + $('#chkEnableVideoPlaybackRemuxing', page).checked(user.Policy.EnablePlaybackRemuxing); + $('#chkForceRemoteSourceTranscoding', page).checked(user.Policy.ForceRemoteSourceTranscoding); + $('#chkRemoteAccess', page).checked(null == user.Policy.EnableRemoteAccess || user.Policy.EnableRemoteAccess); + $('#chkEnableSyncTranscoding', page).checked(user.Policy.EnableSyncTranscoding); + $('#chkEnableConversion', page).checked(user.Policy.EnableMediaConversion || false); + $('#chkEnableSharing', page).checked(user.Policy.EnablePublicSharing); + $('#txtRemoteClientBitrateLimit', page).val(user.Policy.RemoteClientBitrateLimit / 1e6 || ''); + $('#txtLoginAttemptsBeforeLockout', page).val(user.Policy.LoginAttemptsBeforeLockout || '0'); loading.hide(); } function onSaveComplete(page, user) { - Dashboard.navigate("userprofiles.html"); + Dashboard.navigate('userprofiles.html'); loading.hide(); - require(["toast"], function (toast) { - toast(globalize.translate("SettingsSaved")); + require(['toast'], function (toast) { + toast(globalize.translate('SettingsSaved')); }); } function saveUser(user, page) { - user.Name = $("#txtUserName", page).val(); - user.Policy.IsAdministrator = $("#chkIsAdmin", page).checked(); - user.Policy.IsHidden = $("#chkIsHidden", page).checked(); - user.Policy.IsDisabled = $("#chkDisabled", page).checked(); - user.Policy.EnableRemoteControlOfOtherUsers = $("#chkEnableRemoteControlOtherUsers", page).checked(); - user.Policy.EnableLiveTvManagement = $("#chkManageLiveTv", page).checked(); - user.Policy.EnableLiveTvAccess = $("#chkEnableLiveTvAccess", page).checked(); - user.Policy.EnableSharedDeviceControl = $("#chkRemoteControlSharedDevices", page).checked(); - user.Policy.EnableMediaPlayback = $("#chkEnableMediaPlayback", page).checked(); - user.Policy.EnableAudioPlaybackTranscoding = $("#chkEnableAudioPlaybackTranscoding", page).checked(); - user.Policy.EnableVideoPlaybackTranscoding = $("#chkEnableVideoPlaybackTranscoding", page).checked(); - user.Policy.EnablePlaybackRemuxing = $("#chkEnableVideoPlaybackRemuxing", page).checked(); - user.Policy.ForceRemoteSourceTranscoding = $("#chkForceRemoteSourceTranscoding", page).checked(); - user.Policy.EnableContentDownloading = $("#chkEnableDownloading", page).checked(); - user.Policy.EnableSyncTranscoding = $("#chkEnableSyncTranscoding", page).checked(); - user.Policy.EnableMediaConversion = $("#chkEnableConversion", page).checked(); - user.Policy.EnablePublicSharing = $("#chkEnableSharing", page).checked(); - user.Policy.EnableRemoteAccess = $("#chkRemoteAccess", page).checked(); - user.Policy.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", page).val() || "0")); - user.Policy.LoginAttemptsBeforeLockout = parseInt($("#txtLoginAttemptsBeforeLockout", page).val() || "0"); - user.Policy.AuthenticationProviderId = page.querySelector(".selectLoginProvider").value; - user.Policy.PasswordResetProviderId = page.querySelector(".selectPasswordResetProvider").value; - user.Policy.EnableContentDeletion = $("#chkEnableDeleteAllFolders", page).checked(); - user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $(".chkFolder", page).get().filter(function (c) { + user.Name = $('#txtUserName', page).val(); + user.Policy.IsAdministrator = $('#chkIsAdmin', page).checked(); + user.Policy.IsHidden = $('#chkIsHidden', page).checked(); + user.Policy.IsDisabled = $('#chkDisabled', page).checked(); + user.Policy.EnableRemoteControlOfOtherUsers = $('#chkEnableRemoteControlOtherUsers', page).checked(); + user.Policy.EnableLiveTvManagement = $('#chkManageLiveTv', page).checked(); + user.Policy.EnableLiveTvAccess = $('#chkEnableLiveTvAccess', page).checked(); + user.Policy.EnableSharedDeviceControl = $('#chkRemoteControlSharedDevices', page).checked(); + user.Policy.EnableMediaPlayback = $('#chkEnableMediaPlayback', page).checked(); + user.Policy.EnableAudioPlaybackTranscoding = $('#chkEnableAudioPlaybackTranscoding', page).checked(); + user.Policy.EnableVideoPlaybackTranscoding = $('#chkEnableVideoPlaybackTranscoding', page).checked(); + user.Policy.EnablePlaybackRemuxing = $('#chkEnableVideoPlaybackRemuxing', page).checked(); + user.Policy.ForceRemoteSourceTranscoding = $('#chkForceRemoteSourceTranscoding', page).checked(); + user.Policy.EnableContentDownloading = $('#chkEnableDownloading', page).checked(); + user.Policy.EnableSyncTranscoding = $('#chkEnableSyncTranscoding', page).checked(); + user.Policy.EnableMediaConversion = $('#chkEnableConversion', page).checked(); + user.Policy.EnablePublicSharing = $('#chkEnableSharing', page).checked(); + user.Policy.EnableRemoteAccess = $('#chkRemoteAccess', page).checked(); + user.Policy.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($('#txtRemoteClientBitrateLimit', page).val() || '0')); + user.Policy.LoginAttemptsBeforeLockout = parseInt($('#txtLoginAttemptsBeforeLockout', page).val() || '0'); + user.Policy.AuthenticationProviderId = page.querySelector('.selectLoginProvider').value; + user.Policy.PasswordResetProviderId = page.querySelector('.selectPasswordResetProvider').value; + user.Policy.EnableContentDeletion = $('#chkEnableDeleteAllFolders', page).checked(); + user.Policy.EnableContentDeletionFromFolders = user.Policy.EnableContentDeletion ? [] : $('.chkFolder', page).get().filter(function (c) { return c.checked; }).map(function (c) { - return c.getAttribute("data-id"); + return c.getAttribute('data-id'); }); ApiClient.updateUser(user).then(function () { ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { @@ -153,7 +153,7 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function } function onSubmit() { - var page = $(this).parents(".page")[0]; + var page = $(this).parents('.page')[0]; loading.show(); getUser().then(function (result) { saveUser(result, page); @@ -162,7 +162,7 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function } function getUser() { - var userId = getParameterByName("userId"); + var userId = getParameterByName('userId'); return ApiClient.getUser(userId); } @@ -174,25 +174,25 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function } var currentUser; - $(document).on("pageinit", "#editUserPage", function () { - $(".editUserProfileForm").off("submit", onSubmit).on("submit", onSubmit); - this.querySelector(".sharingHelp").innerHTML = globalize.translate("OptionAllowLinkSharingHelp", 30); + $(document).on('pageinit', '#editUserPage', function () { + $('.editUserProfileForm').off('submit', onSubmit).on('submit', onSubmit); + this.querySelector('.sharingHelp').innerHTML = globalize.translate('OptionAllowLinkSharingHelp', 30); var page = this; - $("#chkEnableDeleteAllFolders", this).on("change", function () { + $('#chkEnableDeleteAllFolders', this).on('change', function () { if (this.checked) { - $(".deleteAccess", page).hide(); + $('.deleteAccess', page).hide(); } else { - $(".deleteAccess", page).show(); + $('.deleteAccess', page).show(); } }); ApiClient.getServerConfiguration().then(function (config) { if (config.EnableRemoteAccess) { - page.querySelector(".fldRemoteAccess").classList.remove("hide"); + page.querySelector('.fldRemoteAccess').classList.remove('hide'); } else { - page.querySelector(".fldRemoteAccess").classList.add("hide"); + page.querySelector('.fldRemoteAccess').classList.add('hide'); } }); - }).on("pagebeforeshow", "#editUserPage", function () { + }).on('pagebeforeshow', '#editUserPage', function () { loadData(this); }); }); diff --git a/src/controllers/userlibraryaccess.js b/src/controllers/userlibraryaccess.js index 0965e9189..95664c1eb 100644 --- a/src/controllers/userlibraryaccess.js +++ b/src/controllers/userlibraryaccess.js @@ -1,79 +1,79 @@ -define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function ($, loading, libraryMenu, globalize) { - "use strict"; +define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'fnchecked'], function ($, loading, libraryMenu, globalize) { + 'use strict'; function triggerChange(select) { - var evt = document.createEvent("HTMLEvents"); - evt.initEvent("change", false, true); + var evt = document.createEvent('HTMLEvents'); + evt.initEvent('change', false, true); select.dispatchEvent(evt); } function loadMediaFolders(page, user, mediaFolders) { - var html = ""; - html += '

' + globalize.translate("HeaderLibraries") + "

"; + var html = ''; + html += '

' + globalize.translate('HeaderLibraries') + '

'; html += '
'; for (var i = 0, length = mediaFolders.length; i < length; i++) { var folder = mediaFolders[i]; var isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id); - var checkedAttribute = isChecked ? ' checked="checked"' : ""; - html += '"; + var checkedAttribute = isChecked ? ' checked="checked"' : ''; + html += ''; } - html += "
"; - page.querySelector(".folderAccess").innerHTML = html; - var chkEnableAllFolders = page.querySelector("#chkEnableAllFolders"); + html += ''; + page.querySelector('.folderAccess').innerHTML = html; + var chkEnableAllFolders = page.querySelector('#chkEnableAllFolders'); chkEnableAllFolders.checked = user.Policy.EnableAllFolders; triggerChange(chkEnableAllFolders); } function loadChannels(page, user, channels) { - var html = ""; - html += '

' + globalize.translate("HeaderChannels") + "

"; + var html = ''; + html += '

' + globalize.translate('HeaderChannels') + '

'; html += '
'; for (var i = 0, length = channels.length; i < length; i++) { var folder = channels[i]; var isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id); - var checkedAttribute = isChecked ? ' checked="checked"' : ""; - html += '"; + var checkedAttribute = isChecked ? ' checked="checked"' : ''; + html += ''; } - html += "
"; - $(".channelAccess", page).show().html(html); + html += ''; + $('.channelAccess', page).show().html(html); if (channels.length) { - $(".channelAccessContainer", page).show(); + $('.channelAccessContainer', page).show(); } else { - $(".channelAccessContainer", page).hide(); + $('.channelAccessContainer', page).hide(); } - $("#chkEnableAllChannels", page).checked(user.Policy.EnableAllChannels).trigger("change"); + $('#chkEnableAllChannels', page).checked(user.Policy.EnableAllChannels).trigger('change'); } function loadDevices(page, user, devices) { - var html = ""; - html += '

' + globalize.translate("HeaderDevices") + "

"; + var html = ''; + html += '

' + globalize.translate('HeaderDevices') + '

'; html += '
'; for (var i = 0, length = devices.length; i < length; i++) { var device = devices[i]; - var checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : ""; - html += '"; + var checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : ''; + html += ''; } - html += "
"; - $(".deviceAccess", page).show().html(html); - $("#chkEnableAllDevices", page).checked(user.Policy.EnableAllDevices).trigger("change"); + html += ''; + $('.deviceAccess', page).show().html(html); + $('#chkEnableAllDevices', page).checked(user.Policy.EnableAllDevices).trigger('change'); if (user.Policy.IsAdministrator) { - page.querySelector(".deviceAccessContainer").classList.add("hide"); + page.querySelector('.deviceAccessContainer').classList.add('hide'); } else { - page.querySelector(".deviceAccessContainer").classList.remove("hide"); + page.querySelector('.deviceAccessContainer').classList.remove('hide'); } } function loadUser(page, user, loggedInUser, mediaFolders, channels, devices) { - page.querySelector(".username").innerHTML = user.Name; + page.querySelector('.username').innerHTML = user.Name; libraryMenu.setTitle(user.Name); loadChannels(page, user, channels); loadMediaFolders(page, user, mediaFolders); @@ -84,29 +84,29 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function function onSaveComplete(page) { loading.hide(); - require(["toast"], function (toast) { - toast(globalize.translate("SettingsSaved")); + require(['toast'], function (toast) { + toast(globalize.translate('SettingsSaved')); }); } function saveUser(user, page) { - user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked(); - user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $(".chkFolder", page).get().filter(function (c) { + user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked(); + user.Policy.EnabledFolders = user.Policy.EnableAllFolders ? [] : $('.chkFolder', page).get().filter(function (c) { return c.checked; }).map(function (c) { - return c.getAttribute("data-id"); + return c.getAttribute('data-id'); }); - user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked(); - user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $(".chkChannel", page).get().filter(function (c) { + user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked(); + user.Policy.EnabledChannels = user.Policy.EnableAllChannels ? [] : $('.chkChannel', page).get().filter(function (c) { return c.checked; }).map(function (c) { - return c.getAttribute("data-id"); + return c.getAttribute('data-id'); }); - user.Policy.EnableAllDevices = $("#chkEnableAllDevices", page).checked(); - user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $(".chkDevice", page).get().filter(function (c) { + user.Policy.EnableAllDevices = $('#chkEnableAllDevices', page).checked(); + user.Policy.EnabledDevices = user.Policy.EnableAllDevices ? [] : $('.chkDevice', page).get().filter(function (c) { return c.checked; }).map(function (c) { - return c.getAttribute("data-id"); + return c.getAttribute('data-id'); }); user.Policy.BlockedChannels = null; user.Policy.BlockedMediaFolders = null; @@ -116,44 +116,44 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function } function onSubmit() { - var page = $(this).parents(".page"); + var page = $(this).parents('.page'); loading.show(); - var userId = getParameterByName("userId"); + var userId = getParameterByName('userId'); ApiClient.getUser(userId).then(function (result) { saveUser(result, page); }); return false; } - $(document).on("pageinit", "#userLibraryAccessPage", function () { + $(document).on('pageinit', '#userLibraryAccessPage', function () { var page = this; - $("#chkEnableAllDevices", page).on("change", function () { + $('#chkEnableAllDevices', page).on('change', function () { if (this.checked) { - $(".deviceAccessListContainer", page).hide(); + $('.deviceAccessListContainer', page).hide(); } else { - $(".deviceAccessListContainer", page).show(); + $('.deviceAccessListContainer', page).show(); } }); - $("#chkEnableAllChannels", page).on("change", function () { + $('#chkEnableAllChannels', page).on('change', function () { if (this.checked) { - $(".channelAccessListContainer", page).hide(); + $('.channelAccessListContainer', page).hide(); } else { - $(".channelAccessListContainer", page).show(); + $('.channelAccessListContainer', page).show(); } }); - page.querySelector("#chkEnableAllFolders").addEventListener("change", function () { + page.querySelector('#chkEnableAllFolders').addEventListener('change', function () { if (this.checked) { - page.querySelector(".folderAccessListContainer").classList.add("hide"); + page.querySelector('.folderAccessListContainer').classList.add('hide'); } else { - page.querySelector(".folderAccessListContainer").classList.remove("hide"); + page.querySelector('.folderAccessListContainer').classList.remove('hide'); } }); - $(".userLibraryAccessForm").off("submit", onSubmit).on("submit", onSubmit); - }).on("pageshow", "#userLibraryAccessPage", function () { + $('.userLibraryAccessForm').off('submit', onSubmit).on('submit', onSubmit); + }).on('pageshow', '#userLibraryAccessPage', function () { var page = this; loading.show(); var promise1; - var userId = getParameterByName("userId"); + var userId = getParameterByName('userId'); if (userId) { promise1 = ApiClient.getUser(userId); @@ -166,11 +166,11 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "fnchecked"], function } var promise2 = Dashboard.getCurrentUser(); - var promise4 = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { + var promise4 = ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders', { IsHidden: false })); - var promise5 = ApiClient.getJSON(ApiClient.getUrl("Channels")); - var promise6 = ApiClient.getJSON(ApiClient.getUrl("Devices")); + var promise5 = ApiClient.getJSON(ApiClient.getUrl('Channels')); + var promise6 = ApiClient.getJSON(ApiClient.getUrl('Devices')); Promise.all([promise1, promise2, promise4, promise5, promise6]).then(function (responses) { loadUser(page, responses[0], responses[1], responses[2].Items, responses[3].Items, responses[4].Items); }); diff --git a/src/controllers/usernew.js b/src/controllers/usernew.js index b93d1d662..5646b239d 100644 --- a/src/controllers/usernew.js +++ b/src/controllers/usernew.js @@ -1,51 +1,51 @@ -define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox"], function ($, loading, globalize) { - "use strict"; +define(['jQuery', 'loading', 'globalize', 'fnchecked', 'emby-checkbox'], function ($, loading, globalize) { + 'use strict'; function loadMediaFolders(page, mediaFolders) { - var html = ""; - html += '

' + globalize.translate("HeaderLibraries") + "

"; + var html = ''; + html += '

' + globalize.translate('HeaderLibraries') + '

'; html += '
'; for (var i = 0; i < mediaFolders.length; i++) { var folder = mediaFolders[i]; - html += '"; + html += ''; } - html += "
"; - $(".folderAccess", page).html(html).trigger("create"); - $("#chkEnableAllFolders", page).checked(true).trigger("change"); + html += ''; + $('.folderAccess', page).html(html).trigger('create'); + $('#chkEnableAllFolders', page).checked(false).trigger('change'); } function loadChannels(page, channels) { - var html = ""; - html += '

' + globalize.translate("HeaderChannels") + "

"; + var html = ''; + html += '

' + globalize.translate('HeaderChannels') + '

'; html += '
'; for (var i = 0; i < channels.length; i++) { var folder = channels[i]; - html += '"; + html += ''; } - html += "
"; - $(".channelAccess", page).show().html(html).trigger("create"); + html += ''; + $('.channelAccess', page).show().html(html).trigger('create'); if (channels.length) { - $(".channelAccessContainer", page).show(); + $('.channelAccessContainer', page).show(); } else { - $(".channelAccessContainer", page).hide(); + $('.channelAccessContainer', page).hide(); } - $("#chkEnableAllChannels", page).checked(true).trigger("change"); + $('#chkEnableAllChannels', page).checked(false).trigger('change'); } function loadUser(page) { - $("#txtUsername", page).val(""); - $("#txtPassword", page).val(""); + $('#txtUsername', page).val(''); + $('#txtPassword', page).val(''); loading.show(); - var promiseFolders = ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders", { + var promiseFolders = ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders', { IsHidden: false })); - var promiseChannels = ApiClient.getJSON(ApiClient.getUrl("Channels")); + var promiseChannels = ApiClient.getJSON(ApiClient.getUrl('Channels')); Promise.all([promiseFolders, promiseChannels]).then(function (responses) { loadMediaFolders(page, responses[0].Items); loadChannels(page, responses[1].Items); @@ -55,37 +55,37 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox"], functio function saveUser(page) { var user = {}; - user.Name = $("#txtUsername", page).val(); - user.Password = $("#txtPassword", page).val(); + user.Name = $('#txtUsername', page).val(); + user.Password = $('#txtPassword', page).val(); ApiClient.createUser(user).then(function (user) { - user.Policy.EnableAllFolders = $("#chkEnableAllFolders", page).checked(); + user.Policy.EnableAllFolders = $('#chkEnableAllFolders', page).checked(); user.Policy.EnabledFolders = []; if (!user.Policy.EnableAllFolders) { - user.Policy.EnabledFolders = $(".chkFolder", page).get().filter(function (i) { + user.Policy.EnabledFolders = $('.chkFolder', page).get().filter(function (i) { return i.checked; }).map(function (i) { - return i.getAttribute("data-id"); + return i.getAttribute('data-id'); }); } - user.Policy.EnableAllChannels = $("#chkEnableAllChannels", page).checked(); + user.Policy.EnableAllChannels = $('#chkEnableAllChannels', page).checked(); user.Policy.EnabledChannels = []; if (!user.Policy.EnableAllChannels) { - user.Policy.EnabledChannels = $(".chkChannel", page).get().filter(function (i) { + user.Policy.EnabledChannels = $('.chkChannel', page).get().filter(function (i) { return i.checked; }).map(function (i) { - return i.getAttribute("data-id"); + return i.getAttribute('data-id'); }); } ApiClient.updateUserPolicy(user.Id, user.Policy).then(function () { - Dashboard.navigate("useredit.html?userId=" + user.Id); + Dashboard.navigate('useredit.html?userId=' + user.Id); }); }, function (response) { - require(["toast"], function (toast) { - toast(globalize.translate("DefaultErrorMessage")); + require(['toast'], function (toast) { + toast(globalize.translate('DefaultErrorMessage')); }); loading.hide(); @@ -93,7 +93,7 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox"], functio } function onSubmit() { - var page = $(this).parents(".page")[0]; + var page = $(this).parents('.page')[0]; loading.show(); saveUser(page); return false; @@ -103,24 +103,24 @@ define(["jQuery", "loading", "globalize", "fnchecked", "emby-checkbox"], functio loadUser(page); } - $(document).on("pageinit", "#newUserPage", function () { + $(document).on('pageinit', '#newUserPage', function () { var page = this; - $("#chkEnableAllChannels", page).on("change", function () { + $('#chkEnableAllChannels', page).on('change', function () { if (this.checked) { - $(".channelAccessListContainer", page).hide(); + $('.channelAccessListContainer', page).hide(); } else { - $(".channelAccessListContainer", page).show(); + $('.channelAccessListContainer', page).show(); } }); - $("#chkEnableAllFolders", page).on("change", function () { + $('#chkEnableAllFolders', page).on('change', function () { if (this.checked) { - $(".folderAccessListContainer", page).hide(); + $('.folderAccessListContainer', page).hide(); } else { - $(".folderAccessListContainer", page).show(); + $('.folderAccessListContainer', page).show(); } }); - $(".newUserProfileForm").off("submit", onSubmit).on("submit", onSubmit); - }).on("pageshow", "#newUserPage", function () { + $('.newUserProfileForm').off('submit', onSubmit).on('submit', onSubmit); + }).on('pageshow', '#newUserPage', function () { loadData(this); }); }); diff --git a/src/controllers/userparentalcontrol.js b/src/controllers/userparentalcontrol.js index 54f5a8a94..e14427123 100644 --- a/src/controllers/userparentalcontrol.js +++ b/src/controllers/userparentalcontrol.js @@ -1,8 +1,8 @@ -define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewStyle", "paper-icon-button-light"], function ($, datetime, loading, libraryMenu, globalize) { - "use strict"; +define(['jQuery', 'datetime', 'loading', 'libraryMenu', 'globalize', 'listViewStyle', 'paper-icon-button-light'], function ($, datetime, loading, libraryMenu, globalize) { + 'use strict'; function populateRatings(allParentalRatings, page) { - var html = ""; + var html = ''; html += ""; var i; var length; @@ -14,7 +14,7 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewSt var lastRating = ratings[ratings.length - 1]; if (lastRating.Value === rating.Value) { - lastRating.Name += "/" + rating.Name; + lastRating.Name += '/' + rating.Name; continue; } } @@ -27,56 +27,56 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewSt for (i = 0, length = ratings.length; i < length; i++) { rating = ratings[i]; - html += ""; + html += "'; } - $("#selectMaxParentalRating", page).html(html); + $('#selectMaxParentalRating', page).html(html); } function loadUnratedItems(page, user) { var items = [{ - name: globalize.translate("OptionBlockBooks"), - value: "Book" + name: globalize.translate('OptionBlockBooks'), + value: 'Book' }, { - name: globalize.translate("OptionBlockChannelContent"), - value: "ChannelContent" + name: globalize.translate('OptionBlockChannelContent'), + value: 'ChannelContent' }, { - name: globalize.translate("OptionBlockLiveTvChannels"), - value: "LiveTvChannel" + name: globalize.translate('OptionBlockLiveTvChannels'), + value: 'LiveTvChannel' }, { - name: globalize.translate("OptionBlockMovies"), - value: "Movie" + name: globalize.translate('OptionBlockMovies'), + value: 'Movie' }, { - name: globalize.translate("OptionBlockMusic"), - value: "Music" + name: globalize.translate('OptionBlockMusic'), + value: 'Music' }, { - name: globalize.translate("OptionBlockTrailers"), - value: "Trailer" + name: globalize.translate('OptionBlockTrailers'), + value: 'Trailer' }, { - name: globalize.translate("OptionBlockTvShows"), - value: "Series" + name: globalize.translate('OptionBlockTvShows'), + value: 'Series' }]; - var html = ""; - html += '

' + globalize.translate("HeaderBlockItemsWithNoRating") + "

"; + var html = ''; + html += '

' + globalize.translate('HeaderBlockItemsWithNoRating') + '

'; html += '
'; for (var i = 0, length = items.length; i < length; i++) { var item = items[i]; - var checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : ""; - html += '"; + var checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : ''; + html += ''; } - html += "
"; - $(".blockUnratedItems", page).html(html).trigger("create"); + html += ''; + $('.blockUnratedItems', page).html(html).trigger('create'); } function loadUser(page, user, allParentalRatings) { - page.querySelector(".username").innerHTML = user.Name; + page.querySelector('.username').innerHTML = user.Name; libraryMenu.setTitle(user.Name); loadUnratedItems(page, user); loadBlockedTags(page, user.Policy.BlockedTags); populateRatings(allParentalRatings, page); - var ratingValue = ""; + var ratingValue = ''; if (user.Policy.MaxParentalRating) { for (var i = 0, length = allParentalRatings.length; i < length; i++) { @@ -88,12 +88,12 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewSt } } - $("#selectMaxParentalRating", page).val(ratingValue); + $('#selectMaxParentalRating', page).val(ratingValue); if (user.Policy.IsAdministrator) { - $(".accessScheduleSection", page).hide(); + $('.accessScheduleSection', page).hide(); } else { - $(".accessScheduleSection", page).show(); + $('.accessScheduleSection', page).show(); } renderAccessSchedule(page, user.Policy.AccessSchedules || []); @@ -106,19 +106,19 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewSt li += '
'; li += '

'; li += h; - li += "

"; - li += "
"; - li += ''; - return li += ""; - }).join(""); + li += ''; + li += ''; + li += ''; + return li += ''; + }).join(''); if (html) { - html = '
' + html + "
"; + html = '
' + html + '
'; } - var elem = $(".blockedTags", page).html(html).trigger("create"); - $(".btnDeleteTag", elem).on("click", function () { - var tag = this.getAttribute("data-tag"); + var elem = $('.blockedTags', page).html(html).trigger('create'); + $('.btnDeleteTag', elem).on('click', function () { + var tag = this.getAttribute('data-tag'); var newTags = tags.filter(function (t) { return t != tag; }); @@ -132,43 +132,43 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewSt } function renderAccessSchedule(page, schedules) { - var html = ""; + var html = ''; var index = 0; html += schedules.map(function (a) { - var itemHtml = ""; + var itemHtml = ''; itemHtml += '
'; itemHtml += '
'; itemHtml += '

'; - itemHtml += globalize.translate("Option" + a.DayOfWeek); - itemHtml += "

"; - itemHtml += '
' + getDisplayTime(a.StartHour) + " - " + getDisplayTime(a.EndHour) + "
"; - itemHtml += "
"; - itemHtml += ''; - itemHtml += "
"; + itemHtml += globalize.translate('Option' + a.DayOfWeek); + itemHtml += ''; + itemHtml += '
' + getDisplayTime(a.StartHour) + ' - ' + getDisplayTime(a.EndHour) + '
'; + itemHtml += ''; + itemHtml += ''; + itemHtml += ''; index++; return itemHtml; - }).join(""); - var accessScheduleList = page.querySelector(".accessScheduleList"); + }).join(''); + var accessScheduleList = page.querySelector('.accessScheduleList'); accessScheduleList.innerHTML = html; - $(".btnDelete", accessScheduleList).on("click", function () { - deleteAccessSchedule(page, schedules, parseInt(this.getAttribute("data-index"))); + $('.btnDelete', accessScheduleList).on('click', function () { + deleteAccessSchedule(page, schedules, parseInt(this.getAttribute('data-index'))); }); } function onSaveComplete(page) { loading.hide(); - require(["toast"], function (toast) { - toast(globalize.translate("SettingsSaved")); + require(['toast'], function (toast) { + toast(globalize.translate('SettingsSaved')); }); } function saveUser(user, page) { - user.Policy.MaxParentalRating = $("#selectMaxParentalRating", page).val() || null; - user.Policy.BlockUnratedItems = $(".chkUnratedItem", page).get().filter(function (i) { + user.Policy.MaxParentalRating = $('#selectMaxParentalRating', page).val() || null; + user.Policy.BlockUnratedItems = $('.chkUnratedItem', page).get().filter(function (i) { return i.checked; }).map(function (i) { - return i.getAttribute("data-itemtype"); + return i.getAttribute('data-itemtype'); }); user.Policy.AccessSchedules = getSchedulesFromPage(page); user.Policy.BlockedTags = getBlockedTagsFromPage(page); @@ -191,7 +191,7 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewSt function showSchedulePopup(page, schedule, index) { schedule = schedule || {}; - require(["components/accessschedule/accessschedule"], function (accessschedule) { + require(['components/accessschedule/accessschedule'], function (accessschedule) { accessschedule.show({ schedule: schedule }).then(function (updatedSchedule) { @@ -208,25 +208,25 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewSt } function getSchedulesFromPage(page) { - return $(".liSchedule", page).map(function () { + return $('.liSchedule', page).map(function () { return { - DayOfWeek: this.getAttribute("data-day"), - StartHour: this.getAttribute("data-start"), - EndHour: this.getAttribute("data-end") + DayOfWeek: this.getAttribute('data-day'), + StartHour: this.getAttribute('data-start'), + EndHour: this.getAttribute('data-end') }; }).get(); } function getBlockedTagsFromPage(page) { - return $(".blockedTag", page).map(function () { - return this.getAttribute("data-tag"); + return $('.blockedTag', page).map(function () { + return this.getAttribute('data-tag'); }).get(); } function showBlockedTagPopup(page) { - require(["prompt"], function (prompt) { + require(['prompt'], function (prompt) { prompt({ - label: globalize.translate("LabelTag") + label: globalize.translate('LabelTag') }).then(function (value) { var tags = getBlockedTagsFromPage(page); @@ -240,28 +240,28 @@ define(["jQuery", "datetime", "loading", "libraryMenu", "globalize", "listViewSt window.UserParentalControlPage = { onSubmit: function () { - var page = $(this).parents(".page"); + var page = $(this).parents('.page'); loading.show(); - var userId = getParameterByName("userId"); + var userId = getParameterByName('userId'); ApiClient.getUser(userId).then(function (result) { saveUser(result, page); }); return false; } }; - $(document).on("pageinit", "#userParentalControlPage", function () { + $(document).on('pageinit', '#userParentalControlPage', function () { var page = this; - $(".btnAddSchedule", page).on("click", function () { + $('.btnAddSchedule', page).on('click', function () { showSchedulePopup(page, {}, -1); }); - $(".btnAddBlockedTag", page).on("click", function () { + $('.btnAddBlockedTag', page).on('click', function () { showBlockedTagPopup(page); }); - $(".userParentalControlForm").off("submit", UserParentalControlPage.onSubmit).on("submit", UserParentalControlPage.onSubmit); - }).on("pageshow", "#userParentalControlPage", function () { + $('.userParentalControlForm').off('submit', UserParentalControlPage.onSubmit).on('submit', UserParentalControlPage.onSubmit); + }).on('pageshow', '#userParentalControlPage', function () { var page = this; loading.show(); - var userId = getParameterByName("userId"); + var userId = getParameterByName('userId'); var promise1 = ApiClient.getUser(userId); var promise2 = ApiClient.getParentalRatings(); Promise.all([promise1, promise2]).then(function (responses) { diff --git a/src/controllers/userpasswordpage.js b/src/controllers/userpasswordpage.js index 8ceb46c5e..186e39b15 100644 --- a/src/controllers/userpasswordpage.js +++ b/src/controllers/userpasswordpage.js @@ -1,67 +1,67 @@ -define(["loading", "libraryMenu", "globalize", "emby-button"], function (loading, libraryMenu, globalize) { - "use strict"; +define(['loading', 'libraryMenu', 'globalize', 'emby-button'], function (loading, libraryMenu, globalize) { + 'use strict'; function loadUser(page, params) { var userid = params.userId; ApiClient.getUser(userid).then(function (user) { Dashboard.getCurrentUser().then(function (loggedInUser) { libraryMenu.setTitle(user.Name); - page.querySelector(".username").innerHTML = user.Name; + page.querySelector('.username').innerHTML = user.Name; var showPasswordSection = true; var showLocalAccessSection = false; - if ("Guest" == user.ConnectLinkType) { - page.querySelector(".localAccessSection").classList.add("hide"); + if ('Guest' == user.ConnectLinkType) { + page.querySelector('.localAccessSection').classList.add('hide'); showPasswordSection = false; } else if (user.HasConfiguredPassword) { - page.querySelector("#btnResetPassword").classList.remove("hide"); - page.querySelector("#fldCurrentPassword").classList.remove("hide"); + page.querySelector('#btnResetPassword').classList.remove('hide'); + page.querySelector('#fldCurrentPassword').classList.remove('hide'); showLocalAccessSection = true; } else { - page.querySelector("#btnResetPassword").classList.add("hide"); - page.querySelector("#fldCurrentPassword").classList.add("hide"); + page.querySelector('#btnResetPassword').classList.add('hide'); + page.querySelector('#fldCurrentPassword').classList.add('hide'); } if (showPasswordSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector(".passwordSection").classList.remove("hide"); + page.querySelector('.passwordSection').classList.remove('hide'); } else { - page.querySelector(".passwordSection").classList.add("hide"); + page.querySelector('.passwordSection').classList.add('hide'); } if (showLocalAccessSection && (loggedInUser.Policy.IsAdministrator || user.Policy.EnableUserPreferenceAccess)) { - page.querySelector(".localAccessSection").classList.remove("hide"); + page.querySelector('.localAccessSection').classList.remove('hide'); } else { - page.querySelector(".localAccessSection").classList.add("hide"); + page.querySelector('.localAccessSection').classList.add('hide'); } - var txtEasyPassword = page.querySelector("#txtEasyPassword"); - txtEasyPassword.value = ""; + var txtEasyPassword = page.querySelector('#txtEasyPassword'); + txtEasyPassword.value = ''; if (user.HasConfiguredEasyPassword) { - txtEasyPassword.placeholder = "******"; - page.querySelector("#btnResetEasyPassword").classList.remove("hide"); + txtEasyPassword.placeholder = '******'; + page.querySelector('#btnResetEasyPassword').classList.remove('hide'); } else { - txtEasyPassword.removeAttribute("placeholder"); - txtEasyPassword.placeholder = ""; - page.querySelector("#btnResetEasyPassword").classList.add("hide"); + txtEasyPassword.removeAttribute('placeholder'); + txtEasyPassword.placeholder = ''; + page.querySelector('#btnResetEasyPassword').classList.add('hide'); } - page.querySelector(".chkEnableLocalEasyPassword").checked = user.Configuration.EnableLocalPassword; + page.querySelector('.chkEnableLocalEasyPassword').checked = user.Configuration.EnableLocalPassword; - require(["autoFocuser"], function (autoFocuser) { + require(['autoFocuser'], function (autoFocuser) { autoFocuser.autoFocus(page); }); }); }); - page.querySelector("#txtCurrentPassword").value = ""; - page.querySelector("#txtNewPassword").value = ""; - page.querySelector("#txtNewPasswordConfirm").value = ""; + page.querySelector('#txtCurrentPassword').value = ''; + page.querySelector('#txtNewPassword').value = ''; + page.querySelector('#txtNewPasswordConfirm').value = ''; } return function (view, params) { function saveEasyPassword() { var userId = params.userId; - var easyPassword = view.querySelector("#txtEasyPassword").value; + var easyPassword = view.querySelector('#txtEasyPassword').value; if (easyPassword) { ApiClient.updateEasyPassword(userId, easyPassword).then(function () { @@ -74,12 +74,12 @@ define(["loading", "libraryMenu", "globalize", "emby-button"], function (loading function onEasyPasswordSaved(userId) { ApiClient.getUser(userId).then(function (user) { - user.Configuration.EnableLocalPassword = view.querySelector(".chkEnableLocalEasyPassword").checked; + user.Configuration.EnableLocalPassword = view.querySelector('.chkEnableLocalEasyPassword').checked; ApiClient.updateUserConfiguration(user.Id, user.Configuration).then(function () { loading.hide(); - require(["toast"], function (toast) { - toast(globalize.translate("MessageSettingsSaved")); + require(['toast'], function (toast) { + toast(globalize.translate('MessageSettingsSaved')); }); loadUser(view, params); @@ -89,28 +89,28 @@ define(["loading", "libraryMenu", "globalize", "emby-button"], function (loading function savePassword() { var userId = params.userId; - var currentPassword = view.querySelector("#txtCurrentPassword").value; - var newPassword = view.querySelector("#txtNewPassword").value; + var currentPassword = view.querySelector('#txtCurrentPassword').value; + var newPassword = view.querySelector('#txtNewPassword').value; - if (view.querySelector("#fldCurrentPassword").classList.contains("hide")) { + if (view.querySelector('#fldCurrentPassword').classList.contains('hide')) { // Firefox does not respect autocomplete=off, so clear it if the field is supposed to be hidden (and blank) // This should only happen when user.HasConfiguredPassword is false, but this information is not passed on - currentPassword = ""; + currentPassword = ''; } ApiClient.updateUserPassword(userId, currentPassword, newPassword).then(function () { loading.hide(); - require(["toast"], function (toast) { - toast(globalize.translate("PasswordSaved")); + require(['toast'], function (toast) { + toast(globalize.translate('PasswordSaved')); }); loadUser(view, params); }, function () { loading.hide(); Dashboard.alert({ - title: globalize.translate("HeaderLoginFailure"), - message: globalize.translate("MessageInvalidUser") + title: globalize.translate('HeaderLoginFailure'), + message: globalize.translate('MessageInvalidUser') }); }); } @@ -118,9 +118,9 @@ define(["loading", "libraryMenu", "globalize", "emby-button"], function (loading function onSubmit(e) { var form = this; - if (form.querySelector("#txtNewPassword").value != form.querySelector("#txtNewPasswordConfirm").value) { - require(["toast"], function (toast) { - toast(globalize.translate("PasswordMatchError")); + if (form.querySelector('#txtNewPassword').value != form.querySelector('#txtNewPasswordConfirm').value) { + require(['toast'], function (toast) { + toast(globalize.translate('PasswordMatchError')); }); } else { loading.show(); @@ -139,17 +139,17 @@ define(["loading", "libraryMenu", "globalize", "emby-button"], function (loading } function resetPassword() { - var msg = globalize.translate("PasswordResetConfirmation"); + var msg = globalize.translate('PasswordResetConfirmation'); - require(["confirm"], function (confirm) { - confirm(msg, globalize.translate("PasswordResetHeader")).then(function () { + require(['confirm'], function (confirm) { + confirm(msg, globalize.translate('PasswordResetHeader')).then(function () { var userId = params.userId; loading.show(); ApiClient.resetUserPassword(userId).then(function () { loading.hide(); Dashboard.alert({ - message: globalize.translate("PasswordResetComplete"), - title: globalize.translate("PasswordResetHeader") + message: globalize.translate('PasswordResetComplete'), + title: globalize.translate('PasswordResetHeader') }); loadUser(view, params); }); @@ -158,17 +158,17 @@ define(["loading", "libraryMenu", "globalize", "emby-button"], function (loading } function resetEasyPassword() { - var msg = globalize.translate("PinCodeResetConfirmation"); + var msg = globalize.translate('PinCodeResetConfirmation'); - require(["confirm"], function (confirm) { - confirm(msg, globalize.translate("HeaderPinCodeReset")).then(function () { + require(['confirm'], function (confirm) { + confirm(msg, globalize.translate('HeaderPinCodeReset')).then(function () { var userId = params.userId; loading.show(); ApiClient.resetEasyPassword(userId).then(function () { loading.hide(); Dashboard.alert({ - message: globalize.translate("PinCodeResetComplete"), - title: globalize.translate("HeaderPinCodeReset") + message: globalize.translate('PinCodeResetComplete'), + title: globalize.translate('HeaderPinCodeReset') }); loadUser(view, params); }); @@ -176,11 +176,11 @@ define(["loading", "libraryMenu", "globalize", "emby-button"], function (loading }); } - view.querySelector(".updatePasswordForm").addEventListener("submit", onSubmit); - view.querySelector(".localAccessForm").addEventListener("submit", onLocalAccessSubmit); - view.querySelector("#btnResetEasyPassword").addEventListener("click", resetEasyPassword); - view.querySelector("#btnResetPassword").addEventListener("click", resetPassword); - view.addEventListener("viewshow", function () { + view.querySelector('.updatePasswordForm').addEventListener('submit', onSubmit); + view.querySelector('.localAccessForm').addEventListener('submit', onLocalAccessSubmit); + view.querySelector('#btnResetEasyPassword').addEventListener('click', resetEasyPassword); + view.querySelector('#btnResetPassword').addEventListener('click', resetPassword); + view.addEventListener('viewshow', function () { loadUser(view, params); }); }; diff --git a/src/controllers/userprofilespage.js b/src/controllers/userprofilespage.js index 90609fa06..6afda79c7 100644 --- a/src/controllers/userprofilespage.js +++ b/src/controllers/userprofilespage.js @@ -1,15 +1,15 @@ -define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-button-light", "cardStyle", "emby-button", "indicators", "flexStyles"], function (loading, dom, globalize, datefns, dfnshelper) { - "use strict"; +define(['loading', 'dom', 'globalize', 'date-fns', 'dfnshelper', 'paper-icon-button-light', 'cardStyle', 'emby-button', 'indicators', 'flexStyles'], function (loading, dom, globalize, datefns, dfnshelper) { + 'use strict'; function deleteUser(page, id) { - var msg = globalize.translate("DeleteUserConfirmation"); + var msg = globalize.translate('DeleteUserConfirmation'); - require(["confirm"], function (confirm) { + require(['confirm'], function (confirm) { confirm({ - title: globalize.translate("DeleteUser"), + title: globalize.translate('DeleteUser'), text: msg, - confirmText: globalize.translate("ButtonDelete"), - primary: "delete" + confirmText: globalize.translate('ButtonDelete'), + primary: 'delete' }).then(function () { loading.show(); ApiClient.deleteUser(id).then(function () { @@ -20,50 +20,50 @@ define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-but } function showUserMenu(elem) { - var card = dom.parentWithClass(elem, "card"); - var page = dom.parentWithClass(card, "page"); - var userId = card.getAttribute("data-userid"); + var card = dom.parentWithClass(elem, 'card'); + var page = dom.parentWithClass(card, 'page'); + var userId = card.getAttribute('data-userid'); var menuItems = []; menuItems.push({ - name: globalize.translate("ButtonOpen"), - id: "open", - icon: "mode_edit" + name: globalize.translate('ButtonOpen'), + id: 'open', + icon: 'mode_edit' }); menuItems.push({ - name: globalize.translate("ButtonLibraryAccess"), - id: "access", - icon: "lock" + name: globalize.translate('ButtonLibraryAccess'), + id: 'access', + icon: 'lock' }); menuItems.push({ - name: globalize.translate("ButtonParentalControl"), - id: "parentalcontrol", - icon: "person" + name: globalize.translate('ButtonParentalControl'), + id: 'parentalcontrol', + icon: 'person' }); menuItems.push({ - name: globalize.translate("ButtonDelete"), - id: "delete", - icon: "delete" + name: globalize.translate('ButtonDelete'), + id: 'delete', + icon: 'delete' }); - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: menuItems, positionTo: card, callback: function (id) { switch (id) { - case "open": - Dashboard.navigate("useredit.html?userId=" + userId); + case 'open': + Dashboard.navigate('useredit.html?userId=' + userId); break; - case "access": - Dashboard.navigate("userlibraryaccess.html?userId=" + userId); + case 'access': + Dashboard.navigate('userlibraryaccess.html?userId=' + userId); break; - case "parentalcontrol": - Dashboard.navigate("userparentalcontrol.html?userId=" + userId); + case 'parentalcontrol': + Dashboard.navigate('userparentalcontrol.html?userId=' + userId); break; - case "delete": + case 'delete': deleteUser(page, userId); } } @@ -72,11 +72,11 @@ define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-but } function getUserHtml(user, addConnectIndicator) { - var html = ""; - var cssClass = "card squareCard scalableCard squareCard-scalable"; + var html = ''; + var cssClass = 'card squareCard scalableCard squareCard-scalable'; if (user.Policy.IsDisabled) { - cssClass += " grayscale"; + cssClass += ' grayscale'; } html += "
"; @@ -90,79 +90,79 @@ define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-but imgUrl = ApiClient.getUserImageUrl(user.Id, { width: 300, tag: user.PrimaryImageTag, - type: "Primary" + type: 'Primary' }); } - var imageClass = "cardImage"; + var imageClass = 'cardImage'; if (user.Policy.IsDisabled) { - imageClass += " disabledUser"; + imageClass += ' disabledUser'; } if (imgUrl) { html += '
"; } else { html += '
'; - html += 'person'; + html += ''; } - html += "
"; - html += ""; - html += "
"; + html += '
'; + html += ''; + html += ''; html += '
'; html += '
'; html += '
'; html += user.Name; - html += "
"; - html += ''; - html += "
"; + html += '
'; + html += ''; + html += ''; html += '
'; var lastSeen = getLastSeenText(user.LastActivityDate); - html += "" != lastSeen ? lastSeen : " "; - html += "
"; - html += ""; - html += ""; - return html + ""; + html += '' != lastSeen ? lastSeen : ' '; + html += ''; + html += ''; + html += ''; + return html + ''; } // FIXME: It seems that, sometimes, server sends date in the future, so date-fns displays messages like 'in less than a minute'. We should fix // how dates are returned by the server when the session is active and show something like 'Active now', instead of past/future sentences function getLastSeenText(lastActivityDate) { if (lastActivityDate) { - return globalize.translate("LastSeen", datefns.formatDistanceToNow(Date.parse(lastActivityDate), dfnshelper.localeWithSuffix)); + return globalize.translate('LastSeen', datefns.formatDistanceToNow(Date.parse(lastActivityDate), dfnshelper.localeWithSuffix)); } - return ""; + return ''; } function getUserSectionHtml(users, addConnectIndicator) { return users.map(function (u__q) { return getUserHtml(u__q, addConnectIndicator); - }).join(""); + }).join(''); } function renderUsers(page, users) { - page.querySelector(".localUsers").innerHTML = getUserSectionHtml(users, true); + page.querySelector('.localUsers').innerHTML = getUserSectionHtml(users, true); } function showPendingUserMenu(elem) { var menuItems = []; menuItems.push({ - name: globalize.translate("ButtonCancel"), - id: "delete", - icon: "delete" + name: globalize.translate('ButtonCancel'), + id: 'delete', + icon: 'delete' }); - require(["actionsheet"], function (actionsheet) { - var card = dom.parentWithClass(elem, "card"); - var page = dom.parentWithClass(card, "page"); - var id = card.getAttribute("data-id"); + require(['actionsheet'], function (actionsheet) { + var card = dom.parentWithClass(elem, 'card'); + var page = dom.parentWithClass(card, 'page'); + var id = card.getAttribute('data-id'); actionsheet.show({ items: menuItems, positionTo: card, callback: function (menuItemId) { switch (menuItemId) { - case "delete": + case 'delete': cancelAuthorization(page, id); } } @@ -171,7 +171,7 @@ define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-but } function getPendingUserHtml(user) { - var html = ""; + var html = ''; html += "
"; html += '
'; html += '
'; @@ -180,41 +180,41 @@ define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-but if (user.ImageUrl) { html += '
"; - html += "
"; + html += '
'; } else { - html += 'person'; + html += ''; } - html += ""; - html += "
"; + html += ''; + html += '
'; html += '
'; html += '
'; - html += ''; - html += "
"; + html += ''; + html += '
'; html += '
'; html += user.UserName; - html += "
"; - html += ""; - html += ""; - return html + ""; + html += ''; + html += ''; + html += ''; + return html + ''; } function renderPendingGuests(page, users) { if (users.length) { - page.querySelector(".sectionPendingGuests").classList.remove("hide"); + page.querySelector('.sectionPendingGuests').classList.remove('hide'); } else { - page.querySelector(".sectionPendingGuests").classList.add("hide"); + page.querySelector('.sectionPendingGuests').classList.add('hide'); } - page.querySelector(".pending").innerHTML = users.map(getPendingUserHtml).join(""); + page.querySelector('.pending').innerHTML = users.map(getPendingUserHtml).join(''); } // TODO cvium: maybe reuse for invitation system function cancelAuthorization(page, id) { loading.show(); ApiClient.ajax({ - type: "DELETE", - url: ApiClient.getUrl("Connect/Pending", { + type: 'DELETE', + url: ApiClient.getUrl('Connect/Pending', { Id: id }) }).then(function () { @@ -236,34 +236,34 @@ define(["loading", "dom", "globalize", "date-fns", "dfnshelper", "paper-icon-but } function showInvitePopup(page) { - require(["components/guestinviter/guestinviter"], function (guestinviter) { + require(['components/guestinviter/guestinviter'], function (guestinviter) { guestinviter.show().then(function () { loadData(page); }); }); } - pageIdOn("pageinit", "userProfilesPage", function () { + pageIdOn('pageinit', 'userProfilesPage', function () { var page = this; - page.querySelector(".btnAddUser").addEventListener("click", function() { - Dashboard.navigate("usernew.html"); + page.querySelector('.btnAddUser').addEventListener('click', function() { + Dashboard.navigate('usernew.html'); }); - page.querySelector(".localUsers").addEventListener("click", function (e__e) { - var btnUserMenu = dom.parentWithClass(e__e.target, "btnUserMenu"); + page.querySelector('.localUsers').addEventListener('click', function (e__e) { + var btnUserMenu = dom.parentWithClass(e__e.target, 'btnUserMenu'); if (btnUserMenu) { showUserMenu(btnUserMenu); } }); - page.querySelector(".pending").addEventListener("click", function (e__r) { - var btnUserMenu = dom.parentWithClass(e__r.target, "btnUserMenu"); + page.querySelector('.pending').addEventListener('click', function (e__r) { + var btnUserMenu = dom.parentWithClass(e__r.target, 'btnUserMenu'); if (btnUserMenu) { showPendingUserMenu(btnUserMenu); } }); }); - pageIdOn("pagebeforeshow", "userProfilesPage", function () { + pageIdOn('pagebeforeshow', 'userProfilesPage', function () { loadData(this); }); }); diff --git a/src/controllers/wizard/finish.js b/src/controllers/wizard/finish.js index 8242a16cb..c27d9a5f4 100644 --- a/src/controllers/wizard/finish.js +++ b/src/controllers/wizard/finish.js @@ -1,18 +1,18 @@ -define(["loading"], function (loading) { - "use strict"; +define(['loading'], function (loading) { + 'use strict'; function onFinish() { loading.show(); ApiClient.ajax({ - url: ApiClient.getUrl("Startup/Complete"), - type: "POST" + url: ApiClient.getUrl('Startup/Complete'), + type: 'POST' }).then(function () { loading.hide(); - window.location.href = "index.html"; + window.location.href = 'index.html'; }); } return function (view, params) { - view.querySelector(".btnWizardNext").addEventListener("click", onFinish); + view.querySelector('.btnWizardNext').addEventListener('click', onFinish); }; }); diff --git a/src/controllers/wizard/remoteaccess.js b/src/controllers/wizard/remoteaccess.js index 554a417e5..400cd357f 100644 --- a/src/controllers/wizard/remoteaccess.js +++ b/src/controllers/wizard/remoteaccess.js @@ -1,16 +1,16 @@ -define(["loading", "emby-checkbox", "emby-button", "emby-select"], function (loading) { - "use strict"; +define(['loading', 'emby-checkbox', 'emby-button', 'emby-select'], function (loading) { + 'use strict'; function save(page) { loading.show(); var apiClient = ApiClient; var config = {}; - config.EnableRemoteAccess = page.querySelector("#chkRemoteAccess").checked; - config.EnableAutomaticPortMapping = page.querySelector("#chkEnableUpnp").checked; + config.EnableRemoteAccess = page.querySelector('#chkRemoteAccess').checked; + config.EnableAutomaticPortMapping = page.querySelector('#chkEnableUpnp').checked; apiClient.ajax({ - type: "POST", + type: 'POST', data: config, - url: apiClient.getUrl("Startup/RemoteAccess") + url: apiClient.getUrl('Startup/RemoteAccess') }).then(function () { loading.hide(); navigateToNextPage(); @@ -18,7 +18,7 @@ define(["loading", "emby-checkbox", "emby-button", "emby-select"], function (loa } function navigateToNextPage() { - Dashboard.navigate("wizardfinish.html"); + Dashboard.navigate('wizardfinish.html'); } function onSubmit(e) { @@ -28,12 +28,12 @@ define(["loading", "emby-checkbox", "emby-button", "emby-select"], function (loa } return function (view, params) { - view.querySelector(".wizardSettingsForm").addEventListener("submit", onSubmit); - view.addEventListener("viewshow", function () { - document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"); + view.querySelector('.wizardSettingsForm').addEventListener('submit', onSubmit); + view.addEventListener('viewshow', function () { + document.querySelector('.skinHeader').classList.add('noHomeButtonHeader'); }); - view.addEventListener("viewhide", function () { - document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader"); + view.addEventListener('viewhide', function () { + document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader'); }); }; }); diff --git a/src/controllers/wizard/settings.js b/src/controllers/wizard/settings.js index 487f068a4..2062e795a 100644 --- a/src/controllers/wizard/settings.js +++ b/src/controllers/wizard/settings.js @@ -1,16 +1,16 @@ -define(["loading", "emby-checkbox", "emby-button", "emby-select"], function (loading) { - "use strict"; +define(['loading', 'emby-checkbox', 'emby-button', 'emby-select'], function (loading) { + 'use strict'; function save(page) { loading.show(); var apiClient = ApiClient; - apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function (config) { - config.PreferredMetadataLanguage = page.querySelector("#selectLanguage").value; - config.MetadataCountryCode = page.querySelector("#selectCountry").value; + apiClient.getJSON(apiClient.getUrl('Startup/Configuration')).then(function (config) { + config.PreferredMetadataLanguage = page.querySelector('#selectLanguage').value; + config.MetadataCountryCode = page.querySelector('#selectCountry').value; apiClient.ajax({ - type: "POST", + type: 'POST', data: config, - url: apiClient.getUrl("Startup/Configuration") + url: apiClient.getUrl('Startup/Configuration') }).then(function () { loading.hide(); navigateToNextPage(); @@ -19,41 +19,41 @@ define(["loading", "emby-checkbox", "emby-button", "emby-select"], function (loa } function populateLanguages(select, languages) { - var html = ""; + var html = ''; html += ""; for (var i = 0, length = languages.length; i < length; i++) { var culture = languages[i]; - html += ""; + html += "'; } select.innerHTML = html; } function populateCountries(select, allCountries) { - var html = ""; + var html = ''; html += ""; for (var i = 0, length = allCountries.length; i < length; i++) { var culture = allCountries[i]; - html += ""; + html += "'; } select.innerHTML = html; } function reloadData(page, config, cultures, countries) { - populateLanguages(page.querySelector("#selectLanguage"), cultures); - populateCountries(page.querySelector("#selectCountry"), countries); - page.querySelector("#selectLanguage").value = config.PreferredMetadataLanguage; - page.querySelector("#selectCountry").value = config.MetadataCountryCode; + populateLanguages(page.querySelector('#selectLanguage'), cultures); + populateCountries(page.querySelector('#selectCountry'), countries); + page.querySelector('#selectLanguage').value = config.PreferredMetadataLanguage; + page.querySelector('#selectCountry').value = config.MetadataCountryCode; loading.hide(); } function reload(page) { loading.show(); var apiClient = ApiClient; - var promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration")); + var promise1 = apiClient.getJSON(apiClient.getUrl('Startup/Configuration')); var promise2 = apiClient.getCultures(); var promise3 = apiClient.getCountries(); Promise.all([promise1, promise2, promise3]).then(function (responses) { @@ -62,7 +62,7 @@ define(["loading", "emby-checkbox", "emby-button", "emby-select"], function (loa } function navigateToNextPage() { - Dashboard.navigate("wizardremoteaccess.html"); + Dashboard.navigate('wizardremoteaccess.html'); } function onSubmit(e) { @@ -72,13 +72,13 @@ define(["loading", "emby-checkbox", "emby-button", "emby-select"], function (loa } return function (view, params) { - view.querySelector(".wizardSettingsForm").addEventListener("submit", onSubmit); - view.addEventListener("viewshow", function () { - document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"); + view.querySelector('.wizardSettingsForm').addEventListener('submit', onSubmit); + view.addEventListener('viewshow', function () { + document.querySelector('.skinHeader').classList.add('noHomeButtonHeader'); reload(this); }); - view.addEventListener("viewhide", function () { - document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader"); + view.addEventListener('viewhide', function () { + document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader'); }); }; }); diff --git a/src/controllers/wizard/start.js b/src/controllers/wizard/start.js index 1c2917b9e..b7fb920d4 100644 --- a/src/controllers/wizard/start.js +++ b/src/controllers/wizard/start.js @@ -1,9 +1,9 @@ -define(["jQuery", "loading", "emby-button", "emby-select"], function ($, loading) { - "use strict"; +define(['jQuery', 'loading', 'emby-button', 'emby-select'], function ($, loading) { + 'use strict'; function loadPage(page, config, languageOptions) { - $("#selectLocalizationLanguage", page).html(languageOptions.map(function (l) { - return '"; + $('#selectLocalizationLanguage', page).html(languageOptions.map(function (l) { + return ''; })).val(config.UICulture); loading.hide(); } @@ -11,38 +11,38 @@ define(["jQuery", "loading", "emby-button", "emby-select"], function ($, loading function save(page) { loading.show(); var apiClient = ApiClient; - apiClient.getJSON(apiClient.getUrl("Startup/Configuration")).then(function (config) { - config.UICulture = $("#selectLocalizationLanguage", page).val(); + apiClient.getJSON(apiClient.getUrl('Startup/Configuration')).then(function (config) { + config.UICulture = $('#selectLocalizationLanguage', page).val(); apiClient.ajax({ - type: "POST", + type: 'POST', data: config, - url: apiClient.getUrl("Startup/Configuration") + url: apiClient.getUrl('Startup/Configuration') }).then(function () { - Dashboard.navigate("wizarduser.html"); + Dashboard.navigate('wizarduser.html'); }); }); } function onSubmit() { - save($(this).parents(".page")); + save($(this).parents('.page')); return false; } return function (view, params) { - $(".wizardStartForm", view).on("submit", onSubmit); - view.addEventListener("viewshow", function () { - document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"); + $('.wizardStartForm', view).on('submit', onSubmit); + view.addEventListener('viewshow', function () { + document.querySelector('.skinHeader').classList.add('noHomeButtonHeader'); loading.show(); var page = this; var apiClient = ApiClient; - var promise1 = apiClient.getJSON(apiClient.getUrl("Startup/Configuration")); - var promise2 = apiClient.getJSON(apiClient.getUrl("Localization/Options")); + var promise1 = apiClient.getJSON(apiClient.getUrl('Startup/Configuration')); + var promise2 = apiClient.getJSON(apiClient.getUrl('Localization/Options')); Promise.all([promise1, promise2]).then(function (responses) { loadPage(page, responses[0], responses[1]); }); }); - view.addEventListener("viewhide", function () { - document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader"); + view.addEventListener('viewhide', function () { + document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader'); }); }; }); diff --git a/src/controllers/wizard/user.js b/src/controllers/wizard/user.js index 32f2bf933..e62edef9f 100644 --- a/src/controllers/wizard/user.js +++ b/src/controllers/wizard/user.js @@ -1,16 +1,16 @@ -define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "emby-button"], function (loading, globalize) { - "use strict"; +define(['loading', 'globalize', 'dashboardcss', 'emby-input', 'emby-button', 'emby-button'], function (loading, globalize) { + 'use strict'; function getApiClient() { return ApiClient; } function nextWizardPage() { - Dashboard.navigate("wizardlibrary.html"); + Dashboard.navigate('wizardlibrary.html'); } function onUpdateUserComplete(result) { - console.debug("user update complete: " + result); + console.debug('user update complete: ' + result); loading.hide(); nextWizardPage(); } @@ -19,21 +19,21 @@ define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "em loading.show(); var apiClient = getApiClient(); apiClient.ajax({ - type: "POST", + type: 'POST', data: { - Name: form.querySelector("#txtUsername").value, - Password: form.querySelector("#txtManualPassword").value + Name: form.querySelector('#txtUsername').value, + Password: form.querySelector('#txtManualPassword').value }, - url: apiClient.getUrl("Startup/User") + url: apiClient.getUrl('Startup/User') }).then(onUpdateUserComplete); } function onSubmit(e) { var form = this; - if (form.querySelector("#txtManualPassword").value != form.querySelector("#txtPasswordConfirm").value) { - require(["toast"], function (toast) { - toast(globalize.translate("PasswordMatchError")); + if (form.querySelector('#txtManualPassword').value != form.querySelector('#txtPasswordConfirm').value) { + require(['toast'], function (toast) { + toast(globalize.translate('PasswordMatchError')); }); } else { submit(form); @@ -47,21 +47,21 @@ define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "em loading.show(); var page = this; var apiClient = getApiClient(); - apiClient.getJSON(apiClient.getUrl("Startup/User")).then(function (user) { - page.querySelector("#txtUsername").value = user.Name || ""; - page.querySelector("#txtManualPassword").value = user.Password || ""; + apiClient.getJSON(apiClient.getUrl('Startup/User')).then(function (user) { + page.querySelector('#txtUsername').value = user.Name || ''; + page.querySelector('#txtManualPassword').value = user.Password || ''; loading.hide(); }); } return function (view, params) { - view.querySelector(".wizardUserForm").addEventListener("submit", onSubmit); - view.addEventListener("viewshow", function () { - document.querySelector(".skinHeader").classList.add("noHomeButtonHeader"); + view.querySelector('.wizardUserForm').addEventListener('submit', onSubmit); + view.addEventListener('viewshow', function () { + document.querySelector('.skinHeader').classList.add('noHomeButtonHeader'); }); - view.addEventListener("viewhide", function () { - document.querySelector(".skinHeader").classList.remove("noHomeButtonHeader"); + view.addEventListener('viewhide', function () { + document.querySelector('.skinHeader').classList.remove('noHomeButtonHeader'); }); - view.addEventListener("viewshow", onViewShow); + view.addEventListener('viewshow', onViewShow); }; }); diff --git a/src/dashboard.html b/src/dashboard.html index adb38a9ad..9063f5596 100644 --- a/src/dashboard.html +++ b/src/dashboard.html @@ -5,7 +5,7 @@

${TabServer}

- +
@@ -34,7 +34,7 @@

${HeaderActiveDevices}

- +
@@ -45,7 +45,7 @@

${HeaderActivity}

- +
@@ -62,7 +62,7 @@

${Alerts}

- +
@@ -71,7 +71,7 @@

${HeaderPaths}

- +
@@ -112,7 +112,7 @@
diff --git a/src/dashboardgeneral.html b/src/dashboardgeneral.html index d0ef17385..03bfa9af8 100644 --- a/src/dashboardgeneral.html +++ b/src/dashboardgeneral.html @@ -5,7 +5,7 @@

${TabSettings}

- ${Help} + ${Help}
@@ -19,7 +19,7 @@
${LabelPreferredDisplayLanguageHelp}
@@ -39,7 +39,7 @@
- +
${LabelCachePathHelp}
@@ -49,7 +49,7 @@
- +
${LabelMetadataPathHelp}
diff --git a/src/device.html b/src/device.html index 11fc9671b..093b31120 100644 --- a/src/device.html +++ b/src/device.html @@ -5,7 +5,7 @@
diff --git a/src/devices.html b/src/devices.html index 4e6552f05..55f51d7e2 100644 --- a/src/devices.html +++ b/src/devices.html @@ -4,7 +4,7 @@

${TabDevices}

- ${Help} + ${Help}
diff --git a/src/dlnaprofile.html b/src/dlnaprofile.html index 2420ab4c3..dbe9131d7 100644 --- a/src/dlnaprofile.html +++ b/src/dlnaprofile.html @@ -5,7 +5,7 @@

${HeaderProfileInformation}

- ${Help} + ${Help}
@@ -98,7 +98,7 @@

${HeaderHttpHeaders}

@@ -221,7 +221,7 @@

${HeaderXmlDocumentAttributes}

diff --git a/src/dlnaprofiles.html b/src/dlnaprofiles.html index c1ae38609..9f2a5e129 100644 --- a/src/dlnaprofiles.html +++ b/src/dlnaprofiles.html @@ -9,7 +9,7 @@

${HeaderCustomDlnaProfiles}

- add + ${Help}
diff --git a/src/dlnasettings.html b/src/dlnasettings.html index 8068acf5a..703dd66a9 100644 --- a/src/dlnasettings.html +++ b/src/dlnasettings.html @@ -8,7 +8,7 @@

${TabSettings}

- ${Help} + ${Help}
diff --git a/src/elements/emby-button/emby-button.css b/src/elements/emby-button/emby-button.css index b3ee4db15..096312565 100644 --- a/src/elements/emby-button/emby-button.css +++ b/src/elements/emby-button/emby-button.css @@ -59,12 +59,12 @@ text-decoration: underline; } -.emby-button > i { +.emby-button > .material-icons { /* For non-fab buttons that have icons */ font-size: 1.36em; } -.button-link > i { +.button-link > .material-icons { font-size: 1em; } @@ -137,7 +137,7 @@ cursor: default; } -.paper-icon-button-light > i { +.paper-icon-button-light > .material-icons { font-size: 1.66956521739130434em; /* Make sure its on top of the ripple */ diff --git a/src/elements/emby-checkbox/emby-checkbox.js b/src/elements/emby-checkbox/emby-checkbox.js index b5e587d5a..4d02d5616 100644 --- a/src/elements/emby-checkbox/emby-checkbox.js +++ b/src/elements/emby-checkbox/emby-checkbox.js @@ -57,8 +57,8 @@ define(['browser', 'dom', 'css!./emby-checkbox', 'registerElement'], function (b var checkedIcon = this.getAttribute('data-checkedicon') || 'check'; var uncheckedIcon = this.getAttribute('data-uncheckedicon') || ''; - var checkHtml = '' + checkedIcon + ''; - var uncheckedHtml = '' + uncheckedIcon + ''; + var checkHtml = ''; + var uncheckedHtml = ''; labelElement.insertAdjacentHTML('beforeend', '' + checkHtml + uncheckedHtml + ''); labelTextElement.classList.add('checkboxLabel'); diff --git a/src/elements/emby-collapse/emby-collapse.js b/src/elements/emby-collapse/emby-collapse.js index fdd77adf0..707e81a78 100644 --- a/src/elements/emby-collapse/emby-collapse.js +++ b/src/elements/emby-collapse/emby-collapse.js @@ -24,7 +24,7 @@ define(['browser', 'css!./emby-collapse', 'registerElement', 'emby-button'], fun elem.style.height = 'auto'; }, 300); - var icon = button.querySelector('i'); + var icon = button.querySelector('.material-icons'); //icon.innerHTML = 'expand_less'; icon.classList.add('emby-collapse-expandIconExpanded'); } @@ -46,7 +46,7 @@ define(['browser', 'css!./emby-collapse', 'registerElement', 'emby-button'], fun } }, 300); - var icon = button.querySelector('i'); + var icon = button.querySelector('.material-icons'); //icon.innerHTML = 'expand_more'; icon.classList.remove('emby-collapse-expandIconExpanded'); } @@ -80,7 +80,7 @@ define(['browser', 'css!./emby-collapse', 'registerElement', 'emby-button'], fun var title = this.getAttribute('title'); - var html = ''; + var html = ''; this.insertAdjacentHTML('afterbegin', html); diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index c1aba9b6a..5d3772ca9 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -124,7 +124,7 @@ define(['itemShortcuts', 'inputManager', 'connectionManager', 'playbackManager', var self = this; require(['sortable'], function (Sortable) { self.sortable = new Sortable(self, { - draggable: ".listItem", + draggable: '.listItem', handle: '.listViewDragHandle', // dragging ended diff --git a/src/elements/emby-playstatebutton/emby-playstatebutton.js b/src/elements/emby-playstatebutton/emby-playstatebutton.js index 4c3e5b6b6..57f7eb76e 100644 --- a/src/elements/emby-playstatebutton/emby-playstatebutton.js +++ b/src/elements/emby-playstatebutton/emby-playstatebutton.js @@ -41,7 +41,7 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby function setState(button, played, updateAttribute) { var icon = button.iconElement; if (!icon) { - button.iconElement = button.querySelector('i'); + button.iconElement = button.querySelector('.material-icons'); icon = button.iconElement; } diff --git a/src/elements/emby-ratingbutton/emby-ratingbutton.js b/src/elements/emby-ratingbutton/emby-ratingbutton.js index 84ae780de..142920ca1 100644 --- a/src/elements/emby-ratingbutton/emby-ratingbutton.js +++ b/src/elements/emby-ratingbutton/emby-ratingbutton.js @@ -57,12 +57,12 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby function setState(button, likes, isFavorite, updateAttribute) { - var icon = button.querySelector('i'); + var icon = button.querySelector('.material-icons'); if (isFavorite) { if (icon) { - icon.innerHTML = 'favorite'; + icon.classList.add('favorite'); icon.classList.add('ratingbutton-icon-withrating'); } @@ -71,7 +71,7 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby } else if (likes) { if (icon) { - icon.innerHTML = 'favorite'; + icon.classList.add('favorite'); icon.classList.remove('ratingbutton-icon-withrating'); //icon.innerHTML = 'thumb_up'; } @@ -80,7 +80,7 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby } else if (likes === false) { if (icon) { - icon.innerHTML = 'favorite'; + icon.classList.add('favorite'); icon.classList.remove('ratingbutton-icon-withrating'); //icon.innerHTML = 'thumb_down'; } @@ -89,7 +89,7 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby } else { if (icon) { - icon.innerHTML = 'favorite'; + icon.classList.add('favorite'); icon.classList.remove('ratingbutton-icon-withrating'); //icon.innerHTML = 'thumbs_up_down'; } diff --git a/src/elements/emby-scrollbuttons/emby-scrollbuttons.css b/src/elements/emby-scrollbuttons/emby-scrollbuttons.css index 32e60292a..b2e0d3bc2 100644 --- a/src/elements/emby-scrollbuttons/emby-scrollbuttons.css +++ b/src/elements/emby-scrollbuttons/emby-scrollbuttons.css @@ -12,7 +12,7 @@ display: flex; } -.emby-scrollbuttons-button > i { +.emby-scrollbuttons-button > .material-icons { min-width: 24px; min-height: 24px; display: block; diff --git a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js index af8261a63..a4c37384c 100644 --- a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js +++ b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js @@ -7,10 +7,10 @@ define(['layoutManager', 'dom', 'css!./emby-scrollbuttons', 'registerElement', ' function getScrollButtonHtml(direction) { var html = ''; - var icon = direction === 'left' ? '' : ''; + var icon = direction === 'left' ? 'chevron_left' : 'chevron_right'; html += ''; return html; diff --git a/src/elements/emby-select/emby-select.js b/src/elements/emby-select/emby-select.js index c772c0f96..271696756 100644 --- a/src/elements/emby-select/emby-select.js +++ b/src/elements/emby-select/emby-select.js @@ -27,8 +27,8 @@ define(['layoutManager', 'browser', 'actionsheet', 'css!./emby-select', 'registe } function triggerChange(select) { - var evt = document.createEvent("HTMLEvents"); - evt.initEvent("change", false, true); + var evt = document.createEvent('HTMLEvents'); + evt.initEvent('change', false, true); select.dispatchEvent(evt); } @@ -144,7 +144,7 @@ define(['layoutManager', 'browser', 'actionsheet', 'css!./emby-select', 'registe this.parentNode.insertBefore(label, this); if (this.classList.contains('emby-select-withcolor')) { - this.parentNode.insertAdjacentHTML('beforeend', '
0
'); + this.parentNode.insertAdjacentHTML('beforeend', '
0
'); } }; diff --git a/src/elements/emby-slider/emby-slider.css b/src/elements/emby-slider/emby-slider.css index f59c2a3cd..7661895f1 100644 --- a/src/elements/emby-slider/emby-slider.css +++ b/src/elements/emby-slider/emby-slider.css @@ -87,10 +87,6 @@ transform: scale(1.3); } -.slider-no-webkit-thumb::-webkit-slider-thumb { - opacity: 0 !important; -} - .mdl-slider::-moz-range-thumb { -moz-appearance: none; width: 1.08em; diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 03d64719e..e37455dfe 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -148,9 +148,6 @@ define(['browser', 'dom', 'layoutManager', 'keyboardnavigation', 'css!./emby-sli this.classList.add('mdl-slider'); this.classList.add('mdl-js-slider'); - if (browser.noFlex) { - this.classList.add('slider-no-webkit-thumb'); - } if (browser.edge || browser.msie) { this.classList.add('slider-browser-edge'); } diff --git a/src/elements/emby-tabs/emby-tabs.js b/src/elements/emby-tabs/emby-tabs.js index fa5979fa4..5e03c3f09 100644 --- a/src/elements/emby-tabs/emby-tabs.js +++ b/src/elements/emby-tabs/emby-tabs.js @@ -46,7 +46,7 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register function triggerBeforeTabChange(tabs, index, previousIndex) { - tabs.dispatchEvent(new CustomEvent("beforetabchange", { + tabs.dispatchEvent(new CustomEvent('beforetabchange', { detail: { selectedTabIndex: index, previousIndex: previousIndex @@ -94,7 +94,7 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register tabs.selectedTabIndex = index; - tabs.dispatchEvent(new CustomEvent("tabchange", { + tabs.dispatchEvent(new CustomEvent('tabchange', { detail: { selectedTabIndex: index, previousIndex: previousIndex @@ -198,7 +198,7 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register if (!this.readyFired) { this.readyFired = true; - this.dispatchEvent(new CustomEvent("ready", {})); + this.dispatchEvent(new CustomEvent('ready', {})); } }; @@ -238,7 +238,7 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register triggerBeforeTabChange(tabs, selected, current); - tabs.dispatchEvent(new CustomEvent("tabchange", { + tabs.dispatchEvent(new CustomEvent('tabchange', { detail: { selectedTabIndex: selected } @@ -315,7 +315,7 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register var tabs = this; - tabs.dispatchEvent(new CustomEvent("tabchange", { + tabs.dispatchEvent(new CustomEvent('tabchange', { detail: { selectedTabIndex: tabs.selectedIndex() } diff --git a/src/encodingsettings.html b/src/encodingsettings.html index 5a005d800..8971957b7 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -5,7 +5,7 @@

${TabTranscoding}

- ${Help} + ${Help}
@@ -21,7 +21,7 @@
@@ -96,7 +96,7 @@
- +
${LabelffmpegPathHelp}
@@ -107,7 +107,7 @@
- +
${LabelTranscodingTempPathHelp}
diff --git a/src/itemdetails.html b/src/itemdetails.html index 0520c80d1..37f1432e2 100644 --- a/src/itemdetails.html +++ b/src/itemdetails.html @@ -1,7 +1,7 @@
@@ -17,91 +17,91 @@
diff --git a/src/legacy/dashboard.js b/src/legacy/dashboard.js index 63c5eb0fa..08c5e8330 100644 --- a/src/legacy/dashboard.js +++ b/src/legacy/dashboard.js @@ -1,6 +1,6 @@ Dashboard.confirm = function(message, title, callback) { - "use strict"; - require(["confirm"], function(confirm) { + 'use strict'; + require(['confirm'], function(confirm) { confirm(message, title).then(function() { callback(!0); }).catch(function() { @@ -10,15 +10,15 @@ Dashboard.confirm = function(message, title, callback) { }; Dashboard.showLoadingMsg = function() { - "use strict"; - require(["loading"], function(loading) { + 'use strict'; + require(['loading'], function(loading) { loading.show(); }); }; Dashboard.hideLoadingMsg = function() { - "use strict"; - require(["loading"], function(loading) { + 'use strict'; + require(['loading'], function(loading) { loading.hide(); }); }; diff --git a/src/legacy/fnchecked.js b/src/legacy/fnchecked.js index b815668f9..c3eff813e 100644 --- a/src/legacy/fnchecked.js +++ b/src/legacy/fnchecked.js @@ -1,5 +1,5 @@ -define(["jQuery"], function($) { - "use strict"; +define(['jQuery'], function($) { + 'use strict'; $.fn.checked = function(value) { return !0 === value || !1 === value ? $(this).each(function() { this.checked = value; diff --git a/src/legacy/focusPreventScroll.js b/src/legacy/focusPreventScroll.js index 6df9e9928..93f53dca2 100644 --- a/src/legacy/focusPreventScroll.js +++ b/src/legacy/focusPreventScroll.js @@ -4,14 +4,14 @@ if (HTMLElement.prototype.nativeFocus === undefined) { (function () { var supportsPreventScrollOption = false; try { - var focusElem = document.createElement("div"); + var focusElem = document.createElement('div'); - focusElem.addEventListener("focus", function(event) { + focusElem.addEventListener('focus', function(event) { event.preventDefault(); event.stopPropagation(); }, true); - var opts = Object.defineProperty({}, "preventScroll", { + var opts = Object.defineProperty({}, 'preventScroll', { // eslint-disable-next-line getter-return get: function () { supportsPreventScrollOption = true; @@ -20,7 +20,7 @@ if (HTMLElement.prototype.nativeFocus === undefined) { focusElem.focus(opts); } catch (e) { - console.error("error checking preventScroll support"); + console.error('error checking preventScroll support'); } if (!supportsPreventScrollOption) { diff --git a/src/legacy/selectmenu.js b/src/legacy/selectmenu.js index 95f435b58..f4cc5466b 100644 --- a/src/legacy/selectmenu.js +++ b/src/legacy/selectmenu.js @@ -1,5 +1,5 @@ -define(["jQuery"], function($) { - "use strict"; +define(['jQuery'], function($) { + 'use strict'; $.fn.selectmenu = function() { return this; }; diff --git a/src/libraries/apiclient/apiclient.js b/src/libraries/apiclient/apiclient.js deleted file mode 100644 index 58cfa300b..000000000 --- a/src/libraries/apiclient/apiclient.js +++ /dev/null @@ -1,236 +0,0 @@ -//TODO: (vitorsemeano) modify this lines for webpack -define(["libraries/apiclient/apiclientcore", "localassetmanager"], function(ApiClient, localassetmanager) { - "use strict"; - - if ("cordova" !== window.appMode && "android" !== window.appMode) { - return ApiClient; - } - - function isLocalId(str) { - return startsWith(str, localPrefix) - } - - function isLocalViewId(str) { - return startsWith(str, localViewPrefix) - } - - function isTopLevelLocalViewId(str) { - return "localview" === str - } - - function stripLocalPrefix(str) { - var res = stripStart(str, localPrefix); - return res = stripStart(res, localViewPrefix) - } - - function startsWith(str, find) { - return !!(str && find && str.length > find.length && 0 === str.indexOf(find)) - } - - function stripStart(str, find) { - return startsWith(str, find) ? str.substr(find.length) : str - } - - function createEmptyList() { - return { - Items: [], - TotalRecordCount: 0 - } - } - - function convertGuidToLocal(guid) { - return guid ? isLocalId(guid) ? guid : "local:" + guid : null - } - - function adjustGuidProperties(downloadedItem) { - downloadedItem.Id = convertGuidToLocal(downloadedItem.Id), downloadedItem.SeriesId = convertGuidToLocal(downloadedItem.SeriesId), downloadedItem.SeasonId = convertGuidToLocal(downloadedItem.SeasonId), downloadedItem.AlbumId = convertGuidToLocal(downloadedItem.AlbumId), downloadedItem.ParentId = convertGuidToLocal(downloadedItem.ParentId), downloadedItem.ParentThumbItemId = convertGuidToLocal(downloadedItem.ParentThumbItemId), downloadedItem.ParentPrimaryImageItemId = convertGuidToLocal(downloadedItem.ParentPrimaryImageItemId), downloadedItem.PrimaryImageItemId = convertGuidToLocal(downloadedItem.PrimaryImageItemId), downloadedItem.ParentLogoItemId = convertGuidToLocal(downloadedItem.ParentLogoItemId), downloadedItem.ParentBackdropItemId = convertGuidToLocal(downloadedItem.ParentBackdropItemId), downloadedItem.ParentBackdropImageTags = null - } - - function getLocalView(instance, serverId, userId) { - return instance.getLocalFolders(serverId, userId).then(function(views) { - var localView = null; - return views.length > 0 && (localView = { - Name: instance.downloadsTitleText || "Downloads", - ServerId: serverId, - Id: "localview", - Type: "localview", - IsFolder: !0 - }), Promise.resolve(localView) - }) - } - - function ApiClientEx(serverAddress, clientName, applicationVersion, deviceName, deviceId) { - ApiClient.call(this, serverAddress, clientName, applicationVersion, deviceName, deviceId) - } - var localPrefix = "local:", - localViewPrefix = "localview:"; - return Object.assign(ApiClientEx.prototype, ApiClient.prototype), ApiClientEx.prototype.getPlaybackInfo = function(itemId, options, deviceProfile) { - var onFailure = function() { - return ApiClient.prototype.getPlaybackInfo.call(instance, itemId, options, deviceProfile) - }; - if (isLocalId(itemId)) return localassetmanager.getLocalItem(this.serverId(), stripLocalPrefix(itemId)).then(function(item) { - return { - MediaSources: item.Item.MediaSources.map(function(m) { - return m.SupportsDirectPlay = !0, m.SupportsDirectStream = !1, m.SupportsTranscoding = !1, m.IsLocal = !0, m - }) - } - }, onFailure); - var instance = this; - return localassetmanager.getLocalItem(this.serverId(), itemId).then(function(item) { - if (item) { - var mediaSources = item.Item.MediaSources.map(function(m) { - return m.SupportsDirectPlay = !0, m.SupportsDirectStream = !1, m.SupportsTranscoding = !1, m.IsLocal = !0, m - }); - return localassetmanager.fileExists(item.LocalPath).then(function(exists) { - if (exists) { - var res = { - MediaSources: mediaSources - }; - return Promise.resolve(res) - } - return ApiClient.prototype.getPlaybackInfo.call(instance, itemId, options, deviceProfile) - }, onFailure) - } - return ApiClient.prototype.getPlaybackInfo.call(instance, itemId, options, deviceProfile) - }, onFailure) - }, ApiClientEx.prototype.getItems = function(userId, options) { - var i, serverInfo = this.serverInfo(); - if (serverInfo && "localview" === options.ParentId) return this.getLocalFolders(serverInfo.Id, userId).then(function(items) { - var result = { - Items: items, - TotalRecordCount: items.length - }; - return Promise.resolve(result) - }); - if (serverInfo && options && (isLocalId(options.ParentId) || isLocalId(options.SeriesId) || isLocalId(options.SeasonId) || isLocalViewId(options.ParentId) || isLocalId(options.AlbumIds))) return localassetmanager.getViewItems(serverInfo.Id, userId, options).then(function(items) { - items.forEach(function(item) { - adjustGuidProperties(item) - }); - var result = { - Items: items, - TotalRecordCount: items.length - }; - return Promise.resolve(result) - }); - if (options && options.ExcludeItemIds && options.ExcludeItemIds.length) { - var exItems = options.ExcludeItemIds.split(","); - for (i = 0; i < exItems.length; i++) - if (isLocalId(exItems[i])) return Promise.resolve(createEmptyList()) - } else if (options && options.Ids && options.Ids.length) { - var ids = options.Ids.split(","), - hasLocal = !1; - for (i = 0; i < ids.length; i++) isLocalId(ids[i]) && (hasLocal = !0); - if (hasLocal) return localassetmanager.getItemsFromIds(serverInfo.Id, ids).then(function(items) { - items.forEach(function(item) { - adjustGuidProperties(item) - }); - var result = { - Items: items, - TotalRecordCount: items.length - }; - return Promise.resolve(result) - }) - } - return ApiClient.prototype.getItems.call(this, userId, options) - }, ApiClientEx.prototype.getUserViews = function(options, userId) { - var instance = this; - options = options || {}; - var basePromise = ApiClient.prototype.getUserViews.call(instance, options, userId); - return options.enableLocalView ? basePromise.then(function(result) { - var serverInfo = instance.serverInfo(); - return serverInfo ? getLocalView(instance, serverInfo.Id, userId).then(function(localView) { - return localView && (result.Items.push(localView), result.TotalRecordCount++), Promise.resolve(result) - }) : Promise.resolve(result) - }) : basePromise - }, ApiClientEx.prototype.getItem = function(userId, itemId) { - if (!itemId) throw new Error("null itemId"); - itemId && (itemId = itemId.toString()); - var serverInfo; - return isTopLevelLocalViewId(itemId) && (serverInfo = this.serverInfo()) ? getLocalView(this, serverInfo.Id, userId) : isLocalViewId(itemId) && (serverInfo = this.serverInfo()) ? this.getLocalFolders(serverInfo.Id, userId).then(function(items) { - var views = items.filter(function(item) { - return item.Id === itemId - }); - return views.length > 0 ? Promise.resolve(views[0]) : Promise.reject() - }) : isLocalId(itemId) && (serverInfo = this.serverInfo()) ? localassetmanager.getLocalItem(serverInfo.Id, stripLocalPrefix(itemId)).then(function(item) { - return adjustGuidProperties(item.Item), Promise.resolve(item.Item) - }) : ApiClient.prototype.getItem.call(this, userId, itemId) - }, ApiClientEx.prototype.getLocalFolders = function(userId) { - var serverInfo = this.serverInfo(); - return userId = userId || serverInfo.UserId, localassetmanager.getViews(serverInfo.Id, userId) - }, ApiClientEx.prototype.getNextUpEpisodes = function(options) { - return options.SeriesId && isLocalId(options.SeriesId) ? Promise.resolve(createEmptyList()) : ApiClient.prototype.getNextUpEpisodes.call(this, options) - }, ApiClientEx.prototype.getSeasons = function(itemId, options) { - return isLocalId(itemId) ? (options.SeriesId = itemId, options.IncludeItemTypes = "Season", options.SortBy = "SortName", this.getItems(this.getCurrentUserId(), options)) : ApiClient.prototype.getSeasons.call(this, itemId, options) - }, ApiClientEx.prototype.getEpisodes = function(itemId, options) { - return isLocalId(options.SeasonId) || isLocalId(options.seasonId) ? (options.SeriesId = itemId, options.IncludeItemTypes = "Episode", options.SortBy = "SortName", this.getItems(this.getCurrentUserId(), options)) : isLocalId(itemId) ? (options.SeriesId = itemId, options.IncludeItemTypes = "Episode", options.SortBy = "SortName", this.getItems(this.getCurrentUserId(), options)) : ApiClient.prototype.getEpisodes.call(this, itemId, options) - }, ApiClientEx.prototype.getLatestOfflineItems = function(options) { - options.SortBy = "DateCreated", options.SortOrder = "Descending"; - var serverInfo = this.serverInfo(); - return serverInfo ? localassetmanager.getViewItems(serverInfo.Id, null, options).then(function(items) { - return items.forEach(function(item) { - adjustGuidProperties(item) - }), Promise.resolve(items) - }) : Promise.resolve([]) - }, ApiClientEx.prototype.getThemeMedia = function(userId, itemId, inherit) { - return isLocalViewId(itemId) || isLocalId(itemId) || isTopLevelLocalViewId(itemId) ? Promise.reject() : ApiClient.prototype.getThemeMedia.call(this, userId, itemId, inherit) - }, ApiClientEx.prototype.getSpecialFeatures = function(userId, itemId) { - return isLocalId(itemId) ? Promise.resolve([]) : ApiClient.prototype.getSpecialFeatures.call(this, userId, itemId) - }, ApiClientEx.prototype.getSimilarItems = function(itemId, options) { - return isLocalId(itemId) ? Promise.resolve(createEmptyList()) : ApiClient.prototype.getSimilarItems.call(this, itemId, options) - }, ApiClientEx.prototype.updateFavoriteStatus = function(userId, itemId, isFavorite) { - return isLocalId(itemId) ? Promise.resolve() : ApiClient.prototype.updateFavoriteStatus.call(this, userId, itemId, isFavorite) - }, ApiClientEx.prototype.getScaledImageUrl = function(itemId, options) { - if (isLocalId(itemId) || options && options.itemid && isLocalId(options.itemid)) { - var serverInfo = this.serverInfo(), - id = stripLocalPrefix(itemId); - return localassetmanager.getImageUrl(serverInfo.Id, id, options) - } - return ApiClient.prototype.getScaledImageUrl.call(this, itemId, options) - }, ApiClientEx.prototype.reportPlaybackStart = function(options) { - if (!options) throw new Error("null options"); - return isLocalId(options.ItemId) ? Promise.resolve() : ApiClient.prototype.reportPlaybackStart.call(this, options) - }, ApiClientEx.prototype.reportPlaybackProgress = function(options) { - if (!options) throw new Error("null options"); - if (isLocalId(options.ItemId)) { - var serverInfo = this.serverInfo(); - return serverInfo ? localassetmanager.getLocalItem(serverInfo.Id, stripLocalPrefix(options.ItemId)).then(function(item) { - var libraryItem = item.Item; - return "Video" === libraryItem.MediaType || "AudioBook" === libraryItem.Type ? (libraryItem.UserData = libraryItem.UserData || {}, libraryItem.UserData.PlaybackPositionTicks = options.PositionTicks, libraryItem.UserData.PlayedPercentage = Math.min(libraryItem.RunTimeTicks ? (options.PositionTicks || 0) / libraryItem.RunTimeTicks * 100 : 0, 100), localassetmanager.addOrUpdateLocalItem(item)) : Promise.resolve() - }) : Promise.resolve() - } - return ApiClient.prototype.reportPlaybackProgress.call(this, options) - }, ApiClientEx.prototype.reportPlaybackStopped = function(options) { - if (!options) throw new Error("null options"); - if (isLocalId(options.ItemId)) { - var serverInfo = this.serverInfo(), - action = { - Date: (new Date).getTime(), - ItemId: stripLocalPrefix(options.ItemId), - PositionTicks: options.PositionTicks, - ServerId: serverInfo.Id, - Type: 0, - UserId: this.getCurrentUserId() - }; - return localassetmanager.recordUserAction(action) - } - return ApiClient.prototype.reportPlaybackStopped.call(this, options) - }, ApiClientEx.prototype.getIntros = function(itemId) { - return isLocalId(itemId) ? Promise.resolve({ - Items: [], - TotalRecordCount: 0 - }) : ApiClient.prototype.getIntros.call(this, itemId) - }, ApiClientEx.prototype.getInstantMixFromItem = function(itemId, options) { - return isLocalId(itemId) ? Promise.resolve({ - Items: [], - TotalRecordCount: 0 - }) : ApiClient.prototype.getInstantMixFromItem.call(this, itemId, options) - }, ApiClientEx.prototype.getItemDownloadUrl = function(itemId) { - if (isLocalId(itemId)) { - var serverInfo = this.serverInfo(); - if (serverInfo) return localassetmanager.getLocalItem(serverInfo.Id, stripLocalPrefix(itemId)).then(function(item) { - return Promise.resolve(item.LocalPath) - }) - } - return ApiClient.prototype.getItemDownloadUrl.call(this, itemId) - }, ApiClientEx -}); diff --git a/src/libraries/apiclient/apiclientcore.js b/src/libraries/apiclient/apiclientcore.js deleted file mode 100644 index 2046cae69..000000000 --- a/src/libraries/apiclient/apiclientcore.js +++ /dev/null @@ -1,1630 +0,0 @@ -define(["events", "appStorage"], function(events, appStorage) { - "use strict"; - - /** Report rate limits in ms for different events */ - const reportRateLimits = { - "timeupdate": 10000, - "volumechange": 3000 - }; - - function redetectBitrate(instance) { - stopBitrateDetection(instance), instance.accessToken() && !1 !== instance.enableAutomaticBitrateDetection && setTimeout(redetectBitrateInternal.bind(instance), 6e3) - } - - function redetectBitrateInternal() { - this.accessToken() && this.detectBitrate() - } - - function stopBitrateDetection(instance) { - instance.detectTimeout && clearTimeout(instance.detectTimeout) - } - - function replaceAll(originalString, strReplace, strWith) { - var reg = new RegExp(strReplace, "ig"); - return originalString.replace(reg, strWith) - } - - function onFetchFail(instance, url, response) { - events.trigger(instance, "requestfail", [{ - url: url, - status: response.status, - errorCode: response.headers ? response.headers.get("X-Application-Error-Code") : null - }]) - } - - function paramsToString(params) { - var values = []; - for (var key in params) { - var value = params[key]; - null !== value && void 0 !== value && "" !== value && values.push(encodeURIComponent(key) + "=" + encodeURIComponent(value)) - } - return values.join("&") - } - - function fetchWithTimeout(url, options, timeoutMs) { - return new Promise(function(resolve, reject) { - var timeout = setTimeout(reject, timeoutMs); - options = options || {}, options.credentials = "same-origin", fetch(url, options).then(function(response) { - clearTimeout(timeout), resolve(response) - }, function(error) { - clearTimeout(timeout), reject(error) - }) - }) - } - - function getFetchPromise(request) { - var headers = request.headers || {}; - "json" === request.dataType && (headers.accept = "application/json"); - var fetchRequest = { - headers: headers, - method: request.type, - credentials: "same-origin" - }, - contentType = request.contentType; - return request.data && ("string" == typeof request.data ? fetchRequest.body = request.data : (fetchRequest.body = paramsToString(request.data), contentType = contentType || "application/x-www-form-urlencoded; charset=UTF-8")), contentType && (headers["Content-Type"] = contentType), request.timeout ? fetchWithTimeout(request.url, fetchRequest, request.timeout) : fetch(request.url, fetchRequest) - } - - function ApiClient(serverAddress, appName, appVersion, deviceName, deviceId) { - if (!serverAddress) { - throw new Error("Must supply a serverAddress"); - } - - console.debug("ApiClient serverAddress: " + serverAddress); - console.debug("ApiClient appName: " + appName); - console.debug("ApiClient appVersion: " + appVersion); - console.debug("ApiClient deviceName: " + deviceName); - console.debug("ApiClient deviceId: " + deviceId); - - this._serverInfo = {}; - this._serverAddress = serverAddress; - this._deviceId = deviceId; - this._deviceName = deviceName; - this._appName = appName; - this._appVersion = appVersion; - } - - function setSavedEndpointInfo(instance, info) { - instance._endPointInfo = info - } - - function getTryConnectPromise(instance, url, state, resolve, reject) { - console.debug("getTryConnectPromise " + url); - fetchWithTimeout(instance.getUrl("system/info/public", null, url), { - method: "GET", - accept: "application/json" - }, 15e3).then(function() { - state.resolved || (state.resolved = !0, console.debug("Reconnect succeeded to " + url), instance.serverAddress(url), resolve()) - }, function() { - state.resolved || (console.error("Reconnect failed to " + url), ++state.rejects >= state.numAddresses && reject()) - }) - } - - function tryReconnectInternal(instance) { - var addresses = [], - addressesStrings = [], - serverInfo = instance.serverInfo(); - return serverInfo.LocalAddress && -1 === addressesStrings.indexOf(serverInfo.LocalAddress) && (addresses.push({ - url: serverInfo.LocalAddress, - timeout: 0 - }), addressesStrings.push(addresses[addresses.length - 1].url)), serverInfo.ManualAddress && -1 === addressesStrings.indexOf(serverInfo.ManualAddress) && (addresses.push({ - url: serverInfo.ManualAddress, - timeout: 100 - }), addressesStrings.push(addresses[addresses.length - 1].url)), serverInfo.RemoteAddress && -1 === addressesStrings.indexOf(serverInfo.RemoteAddress) && (addresses.push({ - url: serverInfo.RemoteAddress, - timeout: 200 - }), addressesStrings.push(addresses[addresses.length - 1].url)), console.debug("tryReconnect: " + addressesStrings.join("|")), new Promise(function(resolve, reject) { - var state = {}; - state.numAddresses = addresses.length, state.rejects = 0, addresses.map(function(url) { - setTimeout(function() { - state.resolved || getTryConnectPromise(instance, url.url, state, resolve, reject) - }, url.timeout) - }) - }) - } - - function tryReconnect(instance, retryCount) { - return retryCount = retryCount || 0, retryCount >= 20 ? Promise.reject() : tryReconnectInternal(instance).catch(function(err) { - return console.error("error in tryReconnectInternal: " + (err || "")), new Promise(function(resolve, reject) { - setTimeout(function() { - tryReconnect(instance, retryCount + 1).then(resolve, reject) - }, 500) - }) - }) - } - - function getCachedUser(instance, userId) { - var serverId = instance.serverId(); - if (!serverId) return null; - var json = appStorage.getItem("user-" + userId + "-" + serverId); - return json ? JSON.parse(json) : null - } - - function onWebSocketMessage(msg) { - var instance = this; - msg = JSON.parse(msg.data), onMessageReceivedInternal(instance, msg) - } - - function onMessageReceivedInternal(instance, msg) { - var messageId = msg.MessageId; - if (messageId) { - if (messageIdsReceived[messageId]) return; - messageIdsReceived[messageId] = !0 - } - if ("UserDeleted" === msg.MessageType) instance._currentUser = null; - else if ("UserUpdated" === msg.MessageType || "UserConfigurationUpdated" === msg.MessageType) { - var user = msg.Data; - user.Id === instance.getCurrentUserId() && (instance._currentUser = null) - } - events.trigger(instance, "message", [msg]) - } - - function onWebSocketOpen() { - var instance = this; - console.debug("web socket connection opened"), events.trigger(instance, "websocketopen") - } - - function onWebSocketError() { - var instance = this; - events.trigger(instance, "websocketerror") - } - - function setSocketOnClose(apiClient, socket) { - socket.onclose = function() { - console.debug("web socket closed"); - if (apiClient._webSocket === socket) { - console.debug("nulling out web socket"); - apiClient._webSocket = null; - } - setTimeout(function() { - events.trigger(apiClient, "websocketclose") - }, 0) - } - } - - function normalizeReturnBitrate(instance, bitrate) { - if (!bitrate) return instance.lastDetectedBitrate ? instance.lastDetectedBitrate : Promise.reject(); - var result = Math.round(.7 * bitrate); - if (instance.getMaxBandwidth) { - var maxRate = instance.getMaxBandwidth(); - maxRate && (result = Math.min(result, maxRate)) - } - return instance.lastDetectedBitrate = result, instance.lastDetectedBitrateTime = (new Date).getTime(), result - } - - function detectBitrateInternal(instance, tests, index, currentBitrate) { - if (index >= tests.length) return normalizeReturnBitrate(instance, currentBitrate); - var test = tests[index]; - return instance.getDownloadSpeed(test.bytes).then(function(bitrate) { - return bitrate < test.threshold ? normalizeReturnBitrate(instance, bitrate) : detectBitrateInternal(instance, tests, index + 1, bitrate) - }, function() { - return normalizeReturnBitrate(instance, currentBitrate) - }) - } - - function detectBitrateWithEndpointInfo(instance, endpointInfo) { - if (endpointInfo.IsInNetwork) { - return instance.lastDetectedBitrate = 14e7, instance.lastDetectedBitrateTime = (new Date).getTime(), 14e7 - } - return detectBitrateInternal(instance, [{ - bytes: 5e5, - threshold: 5e5 - }, { - bytes: 1e6, - threshold: 2e7 - }, { - bytes: 3e6, - threshold: 5e7 - }], 0) - } - - function getRemoteImagePrefix(instance, options) { - var urlPrefix; - return options.artist ? (urlPrefix = "Artists/" + instance.encodeName(options.artist), delete options.artist) : options.person ? (urlPrefix = "Persons/" + instance.encodeName(options.person), delete options.person) : options.genre ? (urlPrefix = "Genres/" + instance.encodeName(options.genre), delete options.genre) : options.musicGenre ? (urlPrefix = "MusicGenres/" + instance.encodeName(options.musicGenre), delete options.musicGenre) : options.studio ? (urlPrefix = "Studios/" + instance.encodeName(options.studio), delete options.studio) : (urlPrefix = "Items/" + options.itemId, delete options.itemId), urlPrefix - } - - function normalizeImageOptions(instance, options) { - var ratio = window.devicePixelRatio; - ratio && (options.minScale && (ratio = Math.max(options.minScale, ratio)), options.width && (options.width = Math.round(options.width * ratio)), options.height && (options.height = Math.round(options.height * ratio)), options.maxWidth && (options.maxWidth = Math.round(options.maxWidth * ratio)), options.maxHeight && (options.maxHeight = Math.round(options.maxHeight * ratio))), options.quality = options.quality || instance.getDefaultImageQuality(options.type), instance.normalizeImageOptions && instance.normalizeImageOptions(options) - } - - function compareVersions(a, b) { - a = a.split("."), b = b.split("."); - for (var i = 0, length = Math.max(a.length, b.length); i < length; i++) { - var aVal = parseInt(a[i] || "0"), - bVal = parseInt(b[i] || "0"); - if (aVal < bVal) return -1; - if (aVal > bVal) return 1 - } - return 0 - } - - function cancelReportPlaybackProgressPromise(instance) { - if (typeof instance.reportPlaybackProgressCancel === "function") instance.reportPlaybackProgressCancel(); - } - - ApiClient.prototype.appName = function() { - return this._appName - }, ApiClient.prototype.setRequestHeaders = function(headers) { - var currentServerInfo = this.serverInfo(), - appName = this._appName, - accessToken = currentServerInfo.AccessToken, - values = []; - if (appName && values.push('Client="' + appName + '"'), this._deviceName && values.push('Device="' + this._deviceName + '"'), this._deviceId && values.push('DeviceId="' + this._deviceId + '"'), this._appVersion && values.push('Version="' + this._appVersion + '"'), accessToken && values.push('Token="' + accessToken + '"'), values.length) { - var auth = "MediaBrowser " + values.join(", "); - headers["X-Emby-Authorization"] = auth - } - }, ApiClient.prototype.appVersion = function() { - return this._appVersion - }, ApiClient.prototype.deviceName = function() { - return this._deviceName - }, ApiClient.prototype.deviceId = function() { - return this._deviceId - }, ApiClient.prototype.serverAddress = function(val) { - if (null != val) { - if (0 !== val.toLowerCase().indexOf("http")) throw new Error("Invalid url: " + val); - var changed = val !== this._serverAddress; - this._serverAddress = val, this.onNetworkChange(), changed && events.trigger(this, "serveraddresschanged") - } - return this._serverAddress - }, ApiClient.prototype.onNetworkChange = function() { - this.lastDetectedBitrate = 0, this.lastDetectedBitrateTime = 0, setSavedEndpointInfo(this, null), redetectBitrate(this) - }, ApiClient.prototype.getUrl = function(name, params, serverAddress) { - if (!name) throw new Error("Url name cannot be empty"); - var url = serverAddress || this._serverAddress; - if (!url) throw new Error("serverAddress is yet not set"); - var lowered = url.toLowerCase(); - return "/" !== name.charAt(0) && (url += "/"), url += name, params && (params = paramsToString(params)) && (url += "?" + params), url - }, ApiClient.prototype.fetchWithFailover = function(request, enableReconnection) { - console.debug("Requesting " + request.url), request.timeout = 3e4; - var instance = this; - return getFetchPromise(request).then(function(response) { - return instance.lastFetch = (new Date).getTime(), response.status < 400 ? "json" === request.dataType || "application/json" === request.headers.accept ? response.json() : "text" === request.dataType || 0 === (response.headers.get("Content-Type") || "").toLowerCase().indexOf("text/") ? response.text() : response : (onFetchFail(instance, request.url, response), Promise.reject(response)) - }, function(error) { - if (error ? console.error("Request failed to " + request.url + " " + (error.status || "") + " " + error.toString()) : console.error("Request timed out to " + request.url), error && error.status || !enableReconnection) throw console.error("Reporting request failure"), onFetchFail(instance, request.url, {}), error; - console.debug("Attempting reconnection"); - var previousServerAddress = instance.serverAddress(); - return tryReconnect(instance).then(function() { - return console.debug("Reconnect succeesed"), request.url = request.url.replace(previousServerAddress, instance.serverAddress()), instance.fetchWithFailover(request, !1) - }, function(innerError) { - throw console.error("Reconnect failed"), onFetchFail(instance, request.url, {}), innerError - }) - }) - }, ApiClient.prototype.fetch = function(request, includeAuthorization) { - if (!request) throw new Error("Request cannot be null"); - if (request.headers = request.headers || {}, !1 !== includeAuthorization && this.setRequestHeaders(request.headers), !1 === this.enableAutomaticNetworking || "GET" !== request.type) { - console.debug("Requesting url without automatic networking: " + request.url); - var instance = this; - return getFetchPromise(request).then(function(response) { - return instance.lastFetch = (new Date).getTime(), response.status < 400 ? "json" === request.dataType || "application/json" === request.headers.accept ? response.json() : "text" === request.dataType || 0 === (response.headers.get("Content-Type") || "").toLowerCase().indexOf("text/") ? response.text() : response : (onFetchFail(instance, request.url, response), Promise.reject(response)) - }, function(error) { - throw onFetchFail(instance, request.url, {}), error - }) - } - return this.fetchWithFailover(request, !0) - }, ApiClient.prototype.setAuthenticationInfo = function(accessKey, userId) { - this._currentUser = null, this._serverInfo.AccessToken = accessKey, this._serverInfo.UserId = userId, redetectBitrate(this) - }, ApiClient.prototype.serverInfo = function(info) { - return info && (this._serverInfo = info), this._serverInfo - }, ApiClient.prototype.getCurrentUserId = function() { - return this._serverInfo.UserId - }, ApiClient.prototype.accessToken = function() { - return this._serverInfo.AccessToken - }, ApiClient.prototype.serverId = function() { - return this.serverInfo().Id - }, ApiClient.prototype.serverName = function() { - return this.serverInfo().Name - }, ApiClient.prototype.ajax = function(request, includeAuthorization) { - if (!request) throw new Error("Request cannot be null"); - return this.fetch(request, includeAuthorization) - }, ApiClient.prototype.getCurrentUser = function(enableCache) { - if (this._currentUser) return Promise.resolve(this._currentUser); - var userId = this.getCurrentUserId(); - if (!userId) return Promise.reject(); - var user, instance = this, - serverPromise = this.getUser(userId).then(function(user) { - return appStorage.setItem("user-" + user.Id + "-" + user.ServerId, JSON.stringify(user)), instance._currentUser = user, user - }, function(response) { - if (!response.status && userId && instance.accessToken() && (user = getCachedUser(instance, userId))) return Promise.resolve(user); - throw response - }); - return !this.lastFetch && !1 !== enableCache && (user = getCachedUser(instance, userId)) ? Promise.resolve(user) : serverPromise - }, ApiClient.prototype.isLoggedIn = function() { - var info = this.serverInfo(); - return !!(info && info.UserId && info.AccessToken) - }, ApiClient.prototype.logout = function() { - stopBitrateDetection(this), this.closeWebSocket(); - var done = function() { - appStorage.removeItem("user-" + this._currentUser.Id + "-" + this._currentUser.ServerId) - this.setAuthenticationInfo(null, null) - }.bind(this); - if (this.accessToken()) { - var url = this.getUrl("Sessions/Logout"); - return this.ajax({ - type: "POST", - url: url - }).then(done, done) - } - return done(), Promise.resolve() - }, ApiClient.prototype.authenticateUserByName = function(name, password) { - if (!name) return Promise.reject(); - var url = this.getUrl("Users/authenticatebyname"), - instance = this; - return new Promise(function(resolve, reject) { - var postData = { - Username: name, - Pw: password || "" - }; - instance.ajax({ - type: "POST", - url: url, - data: JSON.stringify(postData), - dataType: "json", - contentType: "application/json" - }).then(function(result) { - var afterOnAuthenticated = function() { - redetectBitrate(instance), resolve(result) - }; - instance.onAuthenticated ? instance.onAuthenticated(instance, result).then(afterOnAuthenticated) : afterOnAuthenticated() - }, reject) - }) - }, ApiClient.prototype.ensureWebSocket = function() { - if (!this.isWebSocketOpenOrConnecting() && this.isWebSocketSupported()) try { - this.openWebSocket() - } catch (err) { - console.error("error opening web socket: " + err) - } - }; - var messageIdsReceived = {}; - return ApiClient.prototype.openWebSocket = function() { - var accessToken = this.accessToken(); - if (!accessToken) throw new Error("Cannot open web socket without access token."); - var url = this.getUrl("socket"); - url = replaceAll(url, "emby/socket", "embywebsocket"), url = replaceAll(url, "https:", "wss:"), url = replaceAll(url, "http:", "ws:"), url += "?api_key=" + accessToken, url += "&deviceId=" + this.deviceId(), console.debug("opening web socket with url: " + url); - var webSocket = new WebSocket(url); - webSocket.onmessage = onWebSocketMessage.bind(this), webSocket.onopen = onWebSocketOpen.bind(this), webSocket.onerror = onWebSocketError.bind(this), setSocketOnClose(this, webSocket), this._webSocket = webSocket - }, ApiClient.prototype.closeWebSocket = function() { - var socket = this._webSocket; - socket && socket.readyState === WebSocket.OPEN && socket.close() - }, ApiClient.prototype.sendWebSocketMessage = function(name, data) { - console.debug("Sending web socket message: " + name); - var msg = { - MessageType: name - }; - data && (msg.Data = data), msg = JSON.stringify(msg), this._webSocket.send(msg) - }, ApiClient.prototype.sendMessage = function(name, data) { - this.isWebSocketOpen() && this.sendWebSocketMessage(name, data) - }, ApiClient.prototype.isMessageChannelOpen = function() { - return this.isWebSocketOpen() - }, ApiClient.prototype.isWebSocketOpen = function() { - var socket = this._webSocket; - return !!socket && socket.readyState === WebSocket.OPEN - }, ApiClient.prototype.isWebSocketOpenOrConnecting = function() { - var socket = this._webSocket; - return !!socket && (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) - }, ApiClient.prototype.get = function(url) { - return this.ajax({ - type: "GET", - url: url - }) - }, ApiClient.prototype.getJSON = function(url, includeAuthorization) { - return this.fetch({ - url: url, - type: "GET", - dataType: "json", - headers: { - accept: "application/json" - } - }, includeAuthorization) - }, ApiClient.prototype.updateServerInfo = function(server, serverUrl) { - if (null == server) throw new Error("server cannot be null"); - if (this.serverInfo(server), !serverUrl) throw new Error("serverUrl cannot be null. serverInfo: " + JSON.stringify(server)); - console.debug("Setting server address to " + serverUrl), this.serverAddress(serverUrl) - }, ApiClient.prototype.isWebSocketSupported = function() { - try { - return null != WebSocket - } catch (err) { - return !1 - } - }, ApiClient.prototype.clearAuthenticationInfo = function() { - this.setAuthenticationInfo(null, null) - }, ApiClient.prototype.encodeName = function(name) { - name = name.split("/").join("-"), name = name.split("&").join("-"), name = name.split("?").join("-"); - var val = paramsToString({ - name: name - }); - return val.substring(val.indexOf("=") + 1).replace("'", "%27") - }, ApiClient.prototype.getDownloadSpeed = function(byteSize) { - var url = this.getUrl("Playback/BitrateTest", { - Size: byteSize - }), - now = (new Date).getTime(); - return this.ajax({ - type: "GET", - url: url, - timeout: 5e3 - }).then(function() { - var responseTimeSeconds = ((new Date).getTime() - now) / 1e3, - bytesPerSecond = byteSize / responseTimeSeconds; - return Math.round(8 * bytesPerSecond) - }) - }, ApiClient.prototype.detectBitrate = function(force) { - if (!force && this.lastDetectedBitrate && (new Date).getTime() - (this.lastDetectedBitrateTime || 0) <= 36e5) return Promise.resolve(this.lastDetectedBitrate); - var instance = this; - return this.getEndpointInfo().then(function(info) { - return detectBitrateWithEndpointInfo(instance, info) - }, function(info) { - return detectBitrateWithEndpointInfo(instance, {}) - }) - }, ApiClient.prototype.getItem = function(userId, itemId) { - if (!itemId) throw new Error("null itemId"); - var url = userId ? this.getUrl("Users/" + userId + "/Items/" + itemId) : this.getUrl("Items/" + itemId); - return this.getJSON(url) - }, ApiClient.prototype.getRootFolder = function(userId) { - if (!userId) throw new Error("null userId"); - var url = this.getUrl("Users/" + userId + "/Items/Root"); - return this.getJSON(url) - }, ApiClient.prototype.getNotificationSummary = function(userId) { - if (!userId) throw new Error("null userId"); - var url = this.getUrl("Notifications/" + userId + "/Summary"); - return this.getJSON(url) - }, ApiClient.prototype.getNotifications = function(userId, options) { - if (!userId) throw new Error("null userId"); - var url = this.getUrl("Notifications/" + userId, options || {}); - return this.getJSON(url) - }, ApiClient.prototype.markNotificationsRead = function(userId, idList, isRead) { - if (!userId) throw new Error("null userId"); - if (!idList) throw new Error("null idList"); - var suffix = isRead ? "Read" : "Unread", - params = { - UserId: userId, - Ids: idList.join(",") - }, - url = this.getUrl("Notifications/" + userId + "/" + suffix, params); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.getRemoteImageProviders = function(options) { - if (!options) throw new Error("null options"); - var urlPrefix = getRemoteImagePrefix(this, options), - url = this.getUrl(urlPrefix + "/RemoteImages/Providers", options); - return this.getJSON(url) - }, ApiClient.prototype.getAvailableRemoteImages = function(options) { - if (!options) throw new Error("null options"); - var urlPrefix = getRemoteImagePrefix(this, options), - url = this.getUrl(urlPrefix + "/RemoteImages", options); - return this.getJSON(url) - }, ApiClient.prototype.downloadRemoteImage = function(options) { - if (!options) throw new Error("null options"); - var urlPrefix = getRemoteImagePrefix(this, options), - url = this.getUrl(urlPrefix + "/RemoteImages/Download", options); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.getRecordingFolders = function(userId) { - var url = this.getUrl("LiveTv/Recordings/Folders", { - userId: userId - }); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvInfo = function(options) { - var url = this.getUrl("LiveTv/Info", options || {}); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvGuideInfo = function(options) { - var url = this.getUrl("LiveTv/GuideInfo", options || {}); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvChannel = function(id, userId) { - if (!id) throw new Error("null id"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("LiveTv/Channels/" + id, options); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvChannels = function(options) { - var url = this.getUrl("LiveTv/Channels", options || {}); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvPrograms = function(options) { - return options = options || {}, options.channelIds && options.channelIds.length > 1800 ? this.ajax({ - type: "POST", - url: this.getUrl("LiveTv/Programs"), - data: JSON.stringify(options), - contentType: "application/json", - dataType: "json" - }) : this.ajax({ - type: "GET", - url: this.getUrl("LiveTv/Programs", options), - dataType: "json" - }) - }, ApiClient.prototype.getLiveTvRecommendedPrograms = function(options) { - return options = options || {}, this.ajax({ - type: "GET", - url: this.getUrl("LiveTv/Programs/Recommended", options), - dataType: "json" - }) - }, ApiClient.prototype.getLiveTvRecordings = function(options) { - var url = this.getUrl("LiveTv/Recordings", options || {}); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvRecordingSeries = function(options) { - var url = this.getUrl("LiveTv/Recordings/Series", options || {}); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvRecordingGroups = function(options) { - var url = this.getUrl("LiveTv/Recordings/Groups", options || {}); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvRecordingGroup = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("LiveTv/Recordings/Groups/" + id); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvRecording = function(id, userId) { - if (!id) throw new Error("null id"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("LiveTv/Recordings/" + id, options); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvProgram = function(id, userId) { - if (!id) throw new Error("null id"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("LiveTv/Programs/" + id, options); - return this.getJSON(url) - }, ApiClient.prototype.deleteLiveTvRecording = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("LiveTv/Recordings/" + id); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.cancelLiveTvTimer = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("LiveTv/Timers/" + id); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.getLiveTvTimers = function(options) { - var url = this.getUrl("LiveTv/Timers", options || {}); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvTimer = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("LiveTv/Timers/" + id); - return this.getJSON(url) - }, ApiClient.prototype.getNewLiveTvTimerDefaults = function(options) { - options = options || {}; - var url = this.getUrl("LiveTv/Timers/Defaults", options); - return this.getJSON(url) - }, ApiClient.prototype.createLiveTvTimer = function(item) { - if (!item) throw new Error("null item"); - var url = this.getUrl("LiveTv/Timers"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(item), - contentType: "application/json" - }) - }, ApiClient.prototype.updateLiveTvTimer = function(item) { - if (!item) throw new Error("null item"); - var url = this.getUrl("LiveTv/Timers/" + item.Id); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(item), - contentType: "application/json" - }) - }, ApiClient.prototype.resetLiveTvTuner = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("LiveTv/Tuners/" + id + "/Reset"); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.getLiveTvSeriesTimers = function(options) { - var url = this.getUrl("LiveTv/SeriesTimers", options || {}); - return this.getJSON(url) - }, ApiClient.prototype.getLiveTvSeriesTimer = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("LiveTv/SeriesTimers/" + id); - return this.getJSON(url) - }, ApiClient.prototype.cancelLiveTvSeriesTimer = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("LiveTv/SeriesTimers/" + id); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.createLiveTvSeriesTimer = function(item) { - if (!item) throw new Error("null item"); - var url = this.getUrl("LiveTv/SeriesTimers"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(item), - contentType: "application/json" - }) - }, ApiClient.prototype.updateLiveTvSeriesTimer = function(item) { - if (!item) throw new Error("null item"); - var url = this.getUrl("LiveTv/SeriesTimers/" + item.Id); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(item), - contentType: "application/json" - }) - }, ApiClient.prototype.getRegistrationInfo = function(feature) { - var url = this.getUrl("Registrations/" + feature); - return this.getJSON(url) - }, ApiClient.prototype.getSystemInfo = function() { - var url = this.getUrl("System/Info"), - instance = this; - return this.getJSON(url).then(function(info) { - return instance.setSystemInfo(info), Promise.resolve(info) - }) - }, ApiClient.prototype.getSyncStatus = function(itemId) { - var url = this.getUrl("Sync/" + itemId + "/Status"); - return this.ajax({ - url: url, - type: "POST", - dataType: "json", - contentType: "application/json", - data: JSON.stringify({ - TargetId: this.deviceId() - }) - }) - }, ApiClient.prototype.getPublicSystemInfo = function() { - var url = this.getUrl("System/Info/Public"), - instance = this; - return this.getJSON(url).then(function(info) { - return instance.setSystemInfo(info), Promise.resolve(info) - }) - }, ApiClient.prototype.getInstantMixFromItem = function(itemId, options) { - var url = this.getUrl("Items/" + itemId + "/InstantMix", options); - return this.getJSON(url) - }, ApiClient.prototype.getEpisodes = function(itemId, options) { - var url = this.getUrl("Shows/" + itemId + "/Episodes", options); - return this.getJSON(url) - }, ApiClient.prototype.getDisplayPreferences = function(id, userId, app) { - var url = this.getUrl("DisplayPreferences/" + id, { - userId: userId, - client: app - }); - return this.getJSON(url) - }, ApiClient.prototype.updateDisplayPreferences = function(id, obj, userId, app) { - var url = this.getUrl("DisplayPreferences/" + id, { - userId: userId, - client: app - }); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(obj), - contentType: "application/json" - }) - }, ApiClient.prototype.getSeasons = function(itemId, options) { - var url = this.getUrl("Shows/" + itemId + "/Seasons", options); - return this.getJSON(url) - }, ApiClient.prototype.getSimilarItems = function(itemId, options) { - var url = this.getUrl("Items/" + itemId + "/Similar", options); - return this.getJSON(url) - }, ApiClient.prototype.getCultures = function() { - var url = this.getUrl("Localization/cultures"); - return this.getJSON(url) - }, ApiClient.prototype.getCountries = function() { - var url = this.getUrl("Localization/countries"); - return this.getJSON(url) - }, ApiClient.prototype.getPlaybackInfo = function(itemId, options, deviceProfile) { - var postData = { - DeviceProfile: deviceProfile - }; - return this.ajax({ - url: this.getUrl("Items/" + itemId + "/PlaybackInfo", options), - type: "POST", - data: JSON.stringify(postData), - contentType: "application/json", - dataType: "json" - }) - }, ApiClient.prototype.getLiveStreamMediaInfo = function(liveStreamId) { - var postData = { - LiveStreamId: liveStreamId - }; - return this.ajax({ - url: this.getUrl("LiveStreams/MediaInfo"), - type: "POST", - data: JSON.stringify(postData), - contentType: "application/json", - dataType: "json" - }) - }, ApiClient.prototype.getIntros = function(itemId) { - return this.getJSON(this.getUrl("Users/" + this.getCurrentUserId() + "/Items/" + itemId + "/Intros")) - }, ApiClient.prototype.getDirectoryContents = function(path, options) { - if (!path) throw new Error("null path"); - if ("string" != typeof path) throw new Error("invalid path"); - options = options || {}, options.path = path; - var url = this.getUrl("Environment/DirectoryContents", options); - return this.getJSON(url) - }, ApiClient.prototype.getNetworkShares = function(path) { - if (!path) throw new Error("null path"); - var options = {}; - options.path = path; - var url = this.getUrl("Environment/NetworkShares", options); - return this.getJSON(url) - }, ApiClient.prototype.getParentPath = function(path) { - if (!path) throw new Error("null path"); - var options = {}; - options.path = path; - var url = this.getUrl("Environment/ParentPath", options); - return this.ajax({ - type: "GET", - url: url, - dataType: "text" - }) - }, ApiClient.prototype.getDrives = function() { - var url = this.getUrl("Environment/Drives"); - return this.getJSON(url) - }, ApiClient.prototype.getNetworkDevices = function() { - var url = this.getUrl("Environment/NetworkDevices"); - return this.getJSON(url) - }, ApiClient.prototype.cancelPackageInstallation = function(installationId) { - if (!installationId) throw new Error("null installationId"); - var url = this.getUrl("Packages/Installing/" + installationId); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.refreshItem = function(itemId, options) { - if (!itemId) throw new Error("null itemId"); - var url = this.getUrl("Items/" + itemId + "/Refresh", options || {}); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.installPlugin = function(name, guid, updateClass, version) { - if (!name) throw new Error("null name"); - if (!updateClass) throw new Error("null updateClass"); - var options = { - updateClass: updateClass, - AssemblyGuid: guid - }; - version && (options.version = version); - var url = this.getUrl("Packages/Installed/" + name, options); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.restartServer = function() { - var url = this.getUrl("System/Restart"); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.shutdownServer = function() { - var url = this.getUrl("System/Shutdown"); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.getPackageInfo = function(name, guid) { - if (!name) throw new Error("null name"); - var options = { - AssemblyGuid: guid - }, - url = this.getUrl("Packages/" + name, options); - return this.getJSON(url) - }, ApiClient.prototype.getVirtualFolders = function() { - var url = "Library/VirtualFolders"; - return url = this.getUrl(url), this.getJSON(url) - }, ApiClient.prototype.getPhysicalPaths = function() { - var url = this.getUrl("Library/PhysicalPaths"); - return this.getJSON(url) - }, ApiClient.prototype.getServerConfiguration = function() { - var url = this.getUrl("System/Configuration"); - return this.getJSON(url) - }, ApiClient.prototype.getDevicesOptions = function() { - var url = this.getUrl("System/Configuration/devices"); - return this.getJSON(url) - }, ApiClient.prototype.getContentUploadHistory = function() { - var url = this.getUrl("Devices/CameraUploads", { - DeviceId: this.deviceId() - }); - return this.getJSON(url) - }, ApiClient.prototype.getNamedConfiguration = function(name) { - var url = this.getUrl("System/Configuration/" + name); - return this.getJSON(url) - }, ApiClient.prototype.getScheduledTasks = function(options) { - options = options || {}; - var url = this.getUrl("ScheduledTasks", options); - return this.getJSON(url) - }, ApiClient.prototype.startScheduledTask = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("ScheduledTasks/Running/" + id); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.getScheduledTask = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("ScheduledTasks/" + id); - return this.getJSON(url) - }, ApiClient.prototype.getNextUpEpisodes = function(options) { - var url = this.getUrl("Shows/NextUp", options); - return this.getJSON(url) - }, ApiClient.prototype.stopScheduledTask = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("ScheduledTasks/Running/" + id); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.getPluginConfiguration = function(id) { - if (!id) throw new Error("null Id"); - var url = this.getUrl("Plugins/" + id + "/Configuration"); - return this.getJSON(url) - }, ApiClient.prototype.getAvailablePlugins = function(options) { - options = options || {}, options.PackageType = "UserInstalled"; - var url = this.getUrl("Packages", options); - return this.getJSON(url) - }, ApiClient.prototype.uninstallPlugin = function(id) { - if (!id) throw new Error("null Id"); - var url = this.getUrl("Plugins/" + id); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.removeVirtualFolder = function(name, refreshLibrary) { - if (!name) throw new Error("null name"); - var url = "Library/VirtualFolders"; - return url = this.getUrl(url, { - refreshLibrary: !!refreshLibrary, - name: name - }), this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.addVirtualFolder = function(name, type, refreshLibrary, libraryOptions) { - if (!name) throw new Error("null name"); - var options = {}; - type && (options.collectionType = type), options.refreshLibrary = !!refreshLibrary, options.name = name; - var url = "Library/VirtualFolders"; - return url = this.getUrl(url, options), this.ajax({ - type: "POST", - url: url, - data: JSON.stringify({ - LibraryOptions: libraryOptions - }), - contentType: "application/json" - }) - }, ApiClient.prototype.updateVirtualFolderOptions = function(id, libraryOptions) { - if (!id) throw new Error("null name"); - var url = "Library/VirtualFolders/LibraryOptions"; - return url = this.getUrl(url), this.ajax({ - type: "POST", - url: url, - data: JSON.stringify({ - Id: id, - LibraryOptions: libraryOptions - }), - contentType: "application/json" - }) - }, ApiClient.prototype.renameVirtualFolder = function(name, newName, refreshLibrary) { - if (!name) throw new Error("null name"); - var url = "Library/VirtualFolders/Name"; - return url = this.getUrl(url, { - refreshLibrary: !!refreshLibrary, - newName: newName, - name: name - }), this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.addMediaPath = function(virtualFolderName, mediaPath, networkSharePath, refreshLibrary) { - if (!virtualFolderName) throw new Error("null virtualFolderName"); - if (!mediaPath) throw new Error("null mediaPath"); - var url = "Library/VirtualFolders/Paths", - pathInfo = { - Path: mediaPath - }; - return networkSharePath && (pathInfo.NetworkPath = networkSharePath), url = this.getUrl(url, { - refreshLibrary: !!refreshLibrary - }), this.ajax({ - type: "POST", - url: url, - data: JSON.stringify({ - Name: virtualFolderName, - PathInfo: pathInfo - }), - contentType: "application/json" - }) - }, ApiClient.prototype.updateMediaPath = function(virtualFolderName, pathInfo) { - if (!virtualFolderName) throw new Error("null virtualFolderName"); - if (!pathInfo) throw new Error("null pathInfo"); - var url = "Library/VirtualFolders/Paths/Update"; - return url = this.getUrl(url), this.ajax({ - type: "POST", - url: url, - data: JSON.stringify({ - Name: virtualFolderName, - PathInfo: pathInfo - }), - contentType: "application/json" - }) - }, ApiClient.prototype.removeMediaPath = function(virtualFolderName, mediaPath, refreshLibrary) { - if (!virtualFolderName) throw new Error("null virtualFolderName"); - if (!mediaPath) throw new Error("null mediaPath"); - var url = "Library/VirtualFolders/Paths"; - return url = this.getUrl(url, { - refreshLibrary: !!refreshLibrary, - path: mediaPath, - name: virtualFolderName - }), this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.deleteUser = function(id) { - if (!id) throw new Error("null id"); - var url = this.getUrl("Users/" + id); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.deleteUserImage = function(userId, imageType, imageIndex) { - if (!userId) throw new Error("null userId"); - if (!imageType) throw new Error("null imageType"); - var url = this.getUrl("Users/" + userId + "/Images/" + imageType); - return null != imageIndex && (url += "/" + imageIndex), this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.deleteItemImage = function(itemId, imageType, imageIndex) { - if (!imageType) throw new Error("null imageType"); - var url = this.getUrl("Items/" + itemId + "/Images"); - return url += "/" + imageType, null != imageIndex && (url += "/" + imageIndex), this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.deleteItem = function(itemId) { - if (!itemId) throw new Error("null itemId"); - var url = this.getUrl("Items/" + itemId); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.stopActiveEncodings = function(playSessionId) { - var options = { - deviceId: this.deviceId() - }; - playSessionId && (options.PlaySessionId = playSessionId); - var url = this.getUrl("Videos/ActiveEncodings", options); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.reportCapabilities = function(options) { - var url = this.getUrl("Sessions/Capabilities/Full"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(options), - contentType: "application/json" - }) - }, ApiClient.prototype.updateItemImageIndex = function(itemId, imageType, imageIndex, newIndex) { - if (!imageType) throw new Error("null imageType"); - var options = { - newIndex: newIndex - }, - url = this.getUrl("Items/" + itemId + "/Images/" + imageType + "/" + imageIndex + "/Index", options); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.getItemImageInfos = function(itemId) { - var url = this.getUrl("Items/" + itemId + "/Images"); - return this.getJSON(url) - }, ApiClient.prototype.getCriticReviews = function(itemId, options) { - if (!itemId) throw new Error("null itemId"); - var url = this.getUrl("Items/" + itemId + "/CriticReviews", options); - return this.getJSON(url) - }, ApiClient.prototype.getItemDownloadUrl = function(itemId) { - if (!itemId) throw new Error("itemId cannot be empty"); - var url = "Items/" + itemId + "/Download"; - return this.getUrl(url, { - api_key: this.accessToken() - }) - }, ApiClient.prototype.getSessions = function(options) { - var url = this.getUrl("Sessions", options); - return this.getJSON(url) - }, ApiClient.prototype.uploadUserImage = function(userId, imageType, file) { - if (!userId) throw new Error("null userId"); - if (!imageType) throw new Error("null imageType"); - if (!file) throw new Error("File must be an image."); - if ("image/png" !== file.type && "image/jpeg" !== file.type && "image/jpeg" !== file.type) throw new Error("File must be an image."); - var instance = this; - return new Promise(function(resolve, reject) { - var reader = new FileReader; - reader.onerror = function() { - reject() - }, reader.onabort = function() { - reject() - }, reader.onload = function(e) { - var data = e.target.result.split(",")[1], - url = instance.getUrl("Users/" + userId + "/Images/" + imageType); - instance.ajax({ - type: "POST", - url: url, - data: data, - contentType: "image/" + file.name.substring(file.name.lastIndexOf(".") + 1) - }).then(resolve, reject) - }, reader.readAsDataURL(file) - }) - }, ApiClient.prototype.uploadItemImage = function(itemId, imageType, file) { - if (!itemId) throw new Error("null itemId"); - if (!imageType) throw new Error("null imageType"); - if (!file) throw new Error("File must be an image."); - if ("image/png" !== file.type && "image/jpeg" !== file.type && "image/jpeg" !== file.type) throw new Error("File must be an image."); - var url = this.getUrl("Items/" + itemId + "/Images"); - url += "/" + imageType; - var instance = this; - return new Promise(function(resolve, reject) { - var reader = new FileReader; - reader.onerror = function() { - reject() - }, reader.onabort = function() { - reject() - }, reader.onload = function(e) { - var data = e.target.result.split(",")[1]; - instance.ajax({ - type: "POST", - url: url, - data: data, - contentType: "image/" + file.name.substring(file.name.lastIndexOf(".") + 1) - }).then(resolve, reject) - }, reader.readAsDataURL(file) - }) - }, ApiClient.prototype.getInstalledPlugins = function() { - var options = {}, - url = this.getUrl("Plugins", options); - return this.getJSON(url) - }, ApiClient.prototype.getUser = function(id) { - if (!id) throw new Error("Must supply a userId"); - var url = this.getUrl("Users/" + id); - return this.getJSON(url) - }, ApiClient.prototype.getStudio = function(name, userId) { - if (!name) throw new Error("null name"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("Studios/" + this.encodeName(name), options); - return this.getJSON(url) - }, ApiClient.prototype.getGenre = function(name, userId) { - if (!name) throw new Error("null name"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("Genres/" + this.encodeName(name), options); - return this.getJSON(url) - }, ApiClient.prototype.getMusicGenre = function(name, userId) { - if (!name) throw new Error("null name"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("MusicGenres/" + this.encodeName(name), options); - return this.getJSON(url) - }, ApiClient.prototype.getArtist = function(name, userId) { - if (!name) throw new Error("null name"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("Artists/" + this.encodeName(name), options); - return this.getJSON(url) - }, ApiClient.prototype.getPerson = function(name, userId) { - if (!name) throw new Error("null name"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("Persons/" + this.encodeName(name), options); - return this.getJSON(url) - }, ApiClient.prototype.getPublicUsers = function() { - var url = this.getUrl("users/public"); - return this.ajax({ - type: "GET", - url: url, - dataType: "json" - }, !1) - }, ApiClient.prototype.getUsers = function(options) { - var url = this.getUrl("users", options || {}); - return this.getJSON(url) - }, ApiClient.prototype.getParentalRatings = function() { - var url = this.getUrl("Localization/ParentalRatings"); - return this.getJSON(url) - }, ApiClient.prototype.getDefaultImageQuality = function(imageType) { - return "backdrop" === imageType.toLowerCase() ? 80 : 90 - }, ApiClient.prototype.getUserImageUrl = function(userId, options) { - if (!userId) throw new Error("null userId"); - options = options || {}; - var url = "Users/" + userId + "/Images/" + options.type; - return null != options.index && (url += "/" + options.index), normalizeImageOptions(this, options), delete options.type, delete options.index, this.getUrl(url, options) - }, ApiClient.prototype.getImageUrl = function(itemId, options) { - if (!itemId) throw new Error("itemId cannot be empty"); - options = options || {}; - var url = "Items/" + itemId + "/Images/" + options.type; - return null != options.index && (url += "/" + options.index), options.quality = options.quality || this.getDefaultImageQuality(options.type), this.normalizeImageOptions && this.normalizeImageOptions(options), delete options.type, delete options.index, this.getUrl(url, options) - }, ApiClient.prototype.getScaledImageUrl = function(itemId, options) { - if (!itemId) throw new Error("itemId cannot be empty"); - options = options || {}; - var url = "Items/" + itemId + "/Images/" + options.type; - return null != options.index && (url += "/" + options.index), normalizeImageOptions(this, options), delete options.type, delete options.index, delete options.minScale, this.getUrl(url, options) - }, ApiClient.prototype.getThumbImageUrl = function(item, options) { - if (!item) throw new Error("null item"); - return options = options || {}, options.imageType = "thumb", item.ImageTags && item.ImageTags.Thumb ? (options.tag = item.ImageTags.Thumb, this.getImageUrl(item.Id, options)) : item.ParentThumbItemId ? (options.tag = item.ImageTags.ParentThumbImageTag, this.getImageUrl(item.ParentThumbItemId, options)) : null - }, ApiClient.prototype.updateUserPassword = function(userId, currentPassword, newPassword) { - if (!userId) return Promise.reject(); - var url = this.getUrl("Users/" + userId + "/Password"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify({ - CurrentPw: currentPassword || "", - NewPw: newPassword - }), - contentType: "application/json" - }) - }, ApiClient.prototype.updateEasyPassword = function(userId, newPassword) { - if (!userId) return void Promise.reject(); - var url = this.getUrl("Users/" + userId + "/EasyPassword"); - return this.ajax({ - type: "POST", - url: url, - data: { - NewPw: newPassword - } - }) - }, ApiClient.prototype.resetUserPassword = function(userId) { - if (!userId) throw new Error("null userId"); - var url = this.getUrl("Users/" + userId + "/Password"), - postData = {}; - return postData.resetPassword = !0, this.ajax({ - type: "POST", - url: url, - data: postData - }) - }, ApiClient.prototype.resetEasyPassword = function(userId) { - if (!userId) throw new Error("null userId"); - var url = this.getUrl("Users/" + userId + "/EasyPassword"), - postData = {}; - return postData.resetPassword = !0, this.ajax({ - type: "POST", - url: url, - data: postData - }) - }, ApiClient.prototype.updateServerConfiguration = function(configuration) { - if (!configuration) throw new Error("null configuration"); - var url = this.getUrl("System/Configuration"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(configuration), - contentType: "application/json" - }) - }, ApiClient.prototype.updateNamedConfiguration = function(name, configuration) { - if (!configuration) throw new Error("null configuration"); - var url = this.getUrl("System/Configuration/" + name); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(configuration), - contentType: "application/json" - }) - }, ApiClient.prototype.updateItem = function(item) { - if (!item) throw new Error("null item"); - var url = this.getUrl("Items/" + item.Id); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(item), - contentType: "application/json" - }) - }, ApiClient.prototype.updatePluginSecurityInfo = function(info) { - var url = this.getUrl("Plugins/SecurityInfo"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(info), - contentType: "application/json" - }) - }, ApiClient.prototype.createUser = function(user) { - var url = this.getUrl("Users/New"); - return this.ajax({ - type: "POST", - url: url, - data: user, - dataType: "json" - }) - }, ApiClient.prototype.updateUser = function(user) { - if (!user) throw new Error("null user"); - var url = this.getUrl("Users/" + user.Id); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(user), - contentType: "application/json" - }) - }, ApiClient.prototype.updateUserPolicy = function(userId, policy) { - if (!userId) throw new Error("null userId"); - if (!policy) throw new Error("null policy"); - var url = this.getUrl("Users/" + userId + "/Policy"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(policy), - contentType: "application/json" - }) - }, ApiClient.prototype.updateUserConfiguration = function(userId, configuration) { - if (!userId) throw new Error("null userId"); - if (!configuration) throw new Error("null configuration"); - var url = this.getUrl("Users/" + userId + "/Configuration"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(configuration), - contentType: "application/json" - }) - }, ApiClient.prototype.updateScheduledTaskTriggers = function(id, triggers) { - if (!id) throw new Error("null id"); - if (!triggers) throw new Error("null triggers"); - var url = this.getUrl("ScheduledTasks/" + id + "/Triggers"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(triggers), - contentType: "application/json" - }) - }, ApiClient.prototype.updatePluginConfiguration = function(id, configuration) { - if (!id) throw new Error("null Id"); - if (!configuration) throw new Error("null configuration"); - var url = this.getUrl("Plugins/" + id + "/Configuration"); - return this.ajax({ - type: "POST", - url: url, - data: JSON.stringify(configuration), - contentType: "application/json" - }) - }, ApiClient.prototype.getAncestorItems = function(itemId, userId) { - if (!itemId) throw new Error("null itemId"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("Items/" + itemId + "/Ancestors", options); - return this.getJSON(url) - }, ApiClient.prototype.getItems = function(userId, options) { - var url; - return url = "string" === (typeof userId).toString().toLowerCase() ? this.getUrl("Users/" + userId + "/Items", options) : this.getUrl("Items", options), this.getJSON(url) - }, ApiClient.prototype.getResumableItems = function(userId, options) { - return this.isMinServerVersion("3.2.33") ? this.getJSON(this.getUrl("Users/" + userId + "/Items/Resume", options)) : this.getItems(userId, Object.assign({ - SortBy: "DatePlayed", - SortOrder: "Descending", - Filters: "IsResumable", - Recursive: !0, - CollapseBoxSetItems: !1, - ExcludeLocationTypes: "Virtual" - }, options)) - }, ApiClient.prototype.getMovieRecommendations = function(options) { - return this.getJSON(this.getUrl("Movies/Recommendations", options)) - }, ApiClient.prototype.getUpcomingEpisodes = function(options) { - return this.getJSON(this.getUrl("Shows/Upcoming", options)) - }, ApiClient.prototype.getUserViews = function(options, userId) { - options = options || {}; - var url = this.getUrl("Users/" + (userId || this.getCurrentUserId()) + "/Views", options); - return this.getJSON(url) - }, ApiClient.prototype.getArtists = function(userId, options) { - if (!userId) throw new Error("null userId"); - options = options || {}, options.userId = userId; - var url = this.getUrl("Artists", options); - return this.getJSON(url) - }, ApiClient.prototype.getAlbumArtists = function(userId, options) { - if (!userId) throw new Error("null userId"); - options = options || {}, options.userId = userId; - var url = this.getUrl("Artists/AlbumArtists", options); - return this.getJSON(url) - }, ApiClient.prototype.getGenres = function(userId, options) { - if (!userId) throw new Error("null userId"); - options = options || {}, options.userId = userId; - var url = this.getUrl("Genres", options); - return this.getJSON(url) - }, ApiClient.prototype.getMusicGenres = function(userId, options) { - if (!userId) throw new Error("null userId"); - options = options || {}, options.userId = userId; - var url = this.getUrl("MusicGenres", options); - return this.getJSON(url) - }, ApiClient.prototype.getPeople = function(userId, options) { - if (!userId) throw new Error("null userId"); - options = options || {}, options.userId = userId; - var url = this.getUrl("Persons", options); - return this.getJSON(url) - }, ApiClient.prototype.getStudios = function(userId, options) { - if (!userId) throw new Error("null userId"); - options = options || {}, options.userId = userId; - var url = this.getUrl("Studios", options); - return this.getJSON(url) - }, ApiClient.prototype.getLocalTrailers = function(userId, itemId) { - if (!userId) throw new Error("null userId"); - if (!itemId) throw new Error("null itemId"); - var url = this.getUrl("Users/" + userId + "/Items/" + itemId + "/LocalTrailers"); - return this.getJSON(url) - }, ApiClient.prototype.getAdditionalVideoParts = function(userId, itemId) { - if (!itemId) throw new Error("null itemId"); - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("Videos/" + itemId + "/AdditionalParts", options); - return this.getJSON(url) - }, ApiClient.prototype.getThemeMedia = function(userId, itemId, inherit) { - if (!itemId) throw new Error("null itemId"); - var options = {}; - userId && (options.userId = userId), options.InheritFromParent = inherit || !1; - var url = this.getUrl("Items/" + itemId + "/ThemeMedia", options); - return this.getJSON(url) - }, ApiClient.prototype.getSearchHints = function(options) { - var url = this.getUrl("Search/Hints", options), - serverId = this.serverId(); - return this.getJSON(url).then(function(result) { - return result.SearchHints.forEach(function(i) { - i.ServerId = serverId - }), result - }) - }, ApiClient.prototype.getSpecialFeatures = function(userId, itemId) { - if (!userId) throw new Error("null userId"); - if (!itemId) throw new Error("null itemId"); - var url = this.getUrl("Users/" + userId + "/Items/" + itemId + "/SpecialFeatures"); - return this.getJSON(url) - }, ApiClient.prototype.getDateParamValue = function(date) { - function formatDigit(i) { - return i < 10 ? "0" + i : i - } - var d = date; - return "" + d.getFullYear() + formatDigit(d.getMonth() + 1) + formatDigit(d.getDate()) + formatDigit(d.getHours()) + formatDigit(d.getMinutes()) + formatDigit(d.getSeconds()) - }, ApiClient.prototype.markPlayed = function(userId, itemId, date) { - if (!userId) throw new Error("null userId"); - if (!itemId) throw new Error("null itemId"); - var options = {}; - date && (options.DatePlayed = this.getDateParamValue(date)); - var url = this.getUrl("Users/" + userId + "/PlayedItems/" + itemId, options); - return this.ajax({ - type: "POST", - url: url, - dataType: "json" - }) - }, ApiClient.prototype.markUnplayed = function(userId, itemId) { - if (!userId) throw new Error("null userId"); - if (!itemId) throw new Error("null itemId"); - var url = this.getUrl("Users/" + userId + "/PlayedItems/" + itemId); - return this.ajax({ - type: "DELETE", - url: url, - dataType: "json" - }) - }, ApiClient.prototype.updateFavoriteStatus = function(userId, itemId, isFavorite) { - if (!userId) throw new Error("null userId"); - if (!itemId) throw new Error("null itemId"); - var url = this.getUrl("Users/" + userId + "/FavoriteItems/" + itemId), - method = isFavorite ? "POST" : "DELETE"; - return this.ajax({ - type: method, - url: url, - dataType: "json" - }) - }, ApiClient.prototype.updateUserItemRating = function(userId, itemId, likes) { - if (!userId) throw new Error("null userId"); - if (!itemId) throw new Error("null itemId"); - var url = this.getUrl("Users/" + userId + "/Items/" + itemId + "/Rating", { - likes: likes - }); - return this.ajax({ - type: "POST", - url: url, - dataType: "json" - }) - }, ApiClient.prototype.getItemCounts = function(userId) { - var options = {}; - userId && (options.userId = userId); - var url = this.getUrl("Items/Counts", options); - return this.getJSON(url) - }, ApiClient.prototype.clearUserItemRating = function(userId, itemId) { - if (!userId) throw new Error("null userId"); - if (!itemId) throw new Error("null itemId"); - var url = this.getUrl("Users/" + userId + "/Items/" + itemId + "/Rating"); - return this.ajax({ - type: "DELETE", - url: url, - dataType: "json" - }) - }, ApiClient.prototype.reportPlaybackStart = function(options) { - if (!options) throw new Error("null options"); - this.lastPlaybackProgressReport = 0, this.lastPlaybackProgressReportTicks = null, stopBitrateDetection(this); - cancelReportPlaybackProgressPromise(this); - var url = this.getUrl("Sessions/Playing"); - return this.ajax({ - type: "POST", - data: JSON.stringify(options), - contentType: "application/json", - url: url - }) - }, ApiClient.prototype.reportPlaybackProgress = function(options) { - if (!options) throw new Error("null options"); - - const eventName = options.EventName || "timeupdate"; - let reportRateLimitTime = reportRateLimits[eventName] || 0; - - const now = (new Date).getTime(); - const msSinceLastReport = now - (this.lastPlaybackProgressReport || 0); - const newPositionTicks = options.PositionTicks; - - if (msSinceLastReport < reportRateLimitTime && eventName === "timeupdate" && newPositionTicks) { - const expectedReportTicks = 1e4 * msSinceLastReport + (this.lastPlaybackProgressReportTicks || 0); - if (Math.abs(newPositionTicks - expectedReportTicks) >= 5e7) reportRateLimitTime = 0; - } - - if (reportRateLimitTime < (this.reportPlaybackProgressTimeout !== undefined ? this.reportPlaybackProgressTimeout : 1e6)) { - cancelReportPlaybackProgressPromise(this); - } - - this.lastPlaybackProgressOptions = options; - - if (this.reportPlaybackProgressPromise) return Promise.resolve(); - - let instance = this; - let promise; - let cancelled = false; - - let resetPromise = function () { - if (instance.reportPlaybackProgressPromise !== promise) return; - - delete instance.lastPlaybackProgressOptions; - delete instance.reportPlaybackProgressTimeout; - delete instance.reportPlaybackProgressPromise; - delete instance.reportPlaybackProgressCancel; - }; - - let sendReport = function (lastOptions) { - resetPromise(); - - if (!lastOptions) throw new Error("null options"); - - instance.lastPlaybackProgressReport = (new Date).getTime(); - instance.lastPlaybackProgressReportTicks = lastOptions.PositionTicks; - - const url = instance.getUrl("Sessions/Playing/Progress"); - return instance.ajax({ - type: "POST", - data: JSON.stringify(lastOptions), - contentType: "application/json", - url: url - }); - }; - - let delay = Math.max(0, reportRateLimitTime - msSinceLastReport); - - promise = new Promise((resolve, reject) => setTimeout(resolve, delay)).then(() => { - if (cancelled) return Promise.resolve(); - return sendReport(instance.lastPlaybackProgressOptions); - }).finally(() => { - resetPromise(); - }); - - this.reportPlaybackProgressTimeout = reportRateLimitTime; - this.reportPlaybackProgressPromise = promise; - this.reportPlaybackProgressCancel = function () { - cancelled = true; - resetPromise(); - }; - - return promise; - }, ApiClient.prototype.reportOfflineActions = function(actions) { - if (!actions) throw new Error("null actions"); - var url = this.getUrl("Sync/OfflineActions"); - return this.ajax({ - type: "POST", - data: JSON.stringify(actions), - contentType: "application/json", - url: url - }) - }, ApiClient.prototype.syncData = function(data) { - if (!data) throw new Error("null data"); - var url = this.getUrl("Sync/Data"); - return this.ajax({ - type: "POST", - data: JSON.stringify(data), - contentType: "application/json", - url: url, - dataType: "json" - }) - }, ApiClient.prototype.getReadySyncItems = function(deviceId) { - if (!deviceId) throw new Error("null deviceId"); - var url = this.getUrl("Sync/Items/Ready", { - TargetId: deviceId - }); - return this.getJSON(url) - }, ApiClient.prototype.reportSyncJobItemTransferred = function(syncJobItemId) { - if (!syncJobItemId) throw new Error("null syncJobItemId"); - var url = this.getUrl("Sync/JobItems/" + syncJobItemId + "/Transferred"); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.cancelSyncItems = function(itemIds, targetId) { - if (!itemIds) throw new Error("null itemIds"); - var url = this.getUrl("Sync/" + (targetId || this.deviceId()) + "/Items", { - ItemIds: itemIds.join(",") - }); - return this.ajax({ - type: "DELETE", - url: url - }) - }, ApiClient.prototype.reportPlaybackStopped = function(options) { - if (!options) throw new Error("null options"); - this.lastPlaybackProgressReport = 0, this.lastPlaybackProgressReportTicks = null, redetectBitrate(this); - cancelReportPlaybackProgressPromise(this); - var url = this.getUrl("Sessions/Playing/Stopped"); - return this.ajax({ - type: "POST", - data: JSON.stringify(options), - contentType: "application/json", - url: url - }) - }, ApiClient.prototype.sendPlayCommand = function(sessionId, options) { - if (!sessionId) throw new Error("null sessionId"); - if (!options) throw new Error("null options"); - var url = this.getUrl("Sessions/" + sessionId + "/Playing", options); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.sendCommand = function(sessionId, command) { - if (!sessionId) throw new Error("null sessionId"); - if (!command) throw new Error("null command"); - var url = this.getUrl("Sessions/" + sessionId + "/Command"), - ajaxOptions = { - type: "POST", - url: url - }; - return ajaxOptions.data = JSON.stringify(command), ajaxOptions.contentType = "application/json", this.ajax(ajaxOptions) - }, ApiClient.prototype.sendMessageCommand = function(sessionId, options) { - if (!sessionId) throw new Error("null sessionId"); - if (!options) throw new Error("null options"); - var url = this.getUrl("Sessions/" + sessionId + "/Message"), - ajaxOptions = { - type: "POST", - url: url - }; - return ajaxOptions.data = JSON.stringify(options), ajaxOptions.contentType = "application/json", this.ajax(ajaxOptions) - }, ApiClient.prototype.sendPlayStateCommand = function(sessionId, command, options) { - if (!sessionId) throw new Error("null sessionId"); - if (!command) throw new Error("null command"); - var url = this.getUrl("Sessions/" + sessionId + "/Playing/" + command, options || {}); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.createPackageReview = function(review) { - var url = this.getUrl("Packages/Reviews/" + review.id, review); - return this.ajax({ - type: "POST", - url: url - }) - }, ApiClient.prototype.getPackageReviews = function(packageId, minRating, maxRating, limit) { - if (!packageId) throw new Error("null packageId"); - var options = {}; - minRating && (options.MinRating = minRating), maxRating && (options.MaxRating = maxRating), limit && (options.Limit = limit); - var url = this.getUrl("Packages/" + packageId + "/Reviews", options); - return this.getJSON(url) - }, ApiClient.prototype.getSavedEndpointInfo = function() { - return this._endPointInfo - }, ApiClient.prototype.getEndpointInfo = function() { - var savedValue = this._endPointInfo; - if (savedValue) return Promise.resolve(savedValue); - var instance = this; - return this.getJSON(this.getUrl("System/Endpoint")).then(function(endPointInfo) { - return setSavedEndpointInfo(instance, endPointInfo), endPointInfo - }) - }, ApiClient.prototype.getLatestItems = function(options) { - return options = options || {}, this.getJSON(this.getUrl("Users/" + this.getCurrentUserId() + "/Items/Latest", options)) - }, ApiClient.prototype.getFilters = function(options) { - return this.getJSON(this.getUrl("Items/Filters2", options)) - }, ApiClient.prototype.setSystemInfo = function(info) { - this._serverVersion = info.Version - }, ApiClient.prototype.serverVersion = function() { - return this._serverVersion - }, ApiClient.prototype.isMinServerVersion = function(version) { - var serverVersion = this.serverVersion(); - return !!serverVersion && compareVersions(serverVersion, version) >= 0 - }, ApiClient.prototype.handleMessageReceived = function(msg) { - onMessageReceivedInternal(this, msg) - }, ApiClient -}); diff --git a/src/libraries/apiclient/appStorage.js b/src/libraries/apiclient/appStorage.js deleted file mode 100644 index dacf38822..000000000 --- a/src/libraries/apiclient/appStorage.js +++ /dev/null @@ -1,53 +0,0 @@ -define([], function() { - "use strict"; - - function onCachePutFail(e) { - console.error("cannot put to a cache: " + e); - } - - function updateCache(instance) { - if (instance.cache) { - instance.cache.put("data", new Response(JSON.stringify(instance.localData))).catch(onCachePutFail); - } - } - - function onCacheOpened(result) { - this.cache = result; - this.localData = {}; - } - - function MyStore() { - - this.setItem = function(name, value) { - localStorage.setItem(name, value); - - if (this.localData && this.localData[name] !== value) { - this.localData[name] = value; - updateCache(this); - } - }; - - this.getItem = function(name) { - return localStorage.getItem(name); - }; - - this.removeItem = function(name) { - localStorage.removeItem(name); - - if (this.localData) { - delete this.localData[name]; - updateCache(this); - } - }; - - try { - if (self.caches) { - self.caches.open("embydata").then(onCacheOpened.bind(this)); - } - } catch (err) { - console.error("error opening cache: " + err); - } - } - - return new MyStore; -}); diff --git a/src/libraries/apiclient/connectionmanager.js b/src/libraries/apiclient/connectionmanager.js deleted file mode 100644 index dc5ef406e..000000000 --- a/src/libraries/apiclient/connectionmanager.js +++ /dev/null @@ -1,807 +0,0 @@ -define(["events", "apiclient", "appStorage"], function (events, apiClientFactory, appStorage) { - "use strict"; - - function getServerAddress(server, mode) { - switch (mode) { - case ConnectionMode.Local: - return server.LocalAddress; - - case ConnectionMode.Manual: - return server.ManualAddress; - - case ConnectionMode.Remote: - return server.RemoteAddress; - - default: - return server.ManualAddress || server.LocalAddress || server.RemoteAddress; - } - } - - function paramsToString(params) { - var values = []; - - for (var key in params) { - var value = params[key]; - - if (null !== value && void 0 !== value && "" !== value) { - values.push(encodeURIComponent(key) + "=" + encodeURIComponent(value)); - } - } - - return values.join("&"); - } - - function resolveFailure(instance, resolve) { - resolve({ - State: "Unavailable", - }); - } - - function mergeServers(credentialProvider, list1, list2) { - for (var i = 0, length = list2.length; i < length; i++) { - credentialProvider.addOrUpdateServer(list1, list2[i]); - } - - return list1; - } - - function updateServerInfo(server, systemInfo) { - server.Name = systemInfo.ServerName; - if (systemInfo.Id) { - server.Id = systemInfo.Id; - } - - if (systemInfo.LocalAddress) { - server.LocalAddress = systemInfo.LocalAddress; - } - } - - function getEmbyServerUrl(baseUrl, handler) { - return baseUrl + "/" + handler; - } - - function getFetchPromise(request) { - var headers = request.headers || {}; - - if ("json" === request.dataType) { - headers.accept = "application/json"; - } - - var fetchRequest = { - headers: headers, - method: request.type, - credentials: "same-origin" - }; - var contentType = request.contentType; - - if (request.data) { - if ("string" == typeof request.data) { - fetchRequest.body = request.data; - } else { - fetchRequest.body = paramsToString(request.data); - contentType = contentType || "application/x-www-form-urlencoded; charset=UTF-8"; - } - } - - if (contentType) { - headers["Content-Type"] = contentType; - } - - if (request.timeout) { - return fetchWithTimeout(request.url, fetchRequest, request.timeout); - } - - return fetch(request.url, fetchRequest); - } - - function fetchWithTimeout(url, options, timeoutMs) { - console.debug("fetchWithTimeout: timeoutMs: " + timeoutMs + ", url: " + url); - return new Promise(function (resolve, reject) { - var timeout = setTimeout(reject, timeoutMs); - options = options || {}; - options.credentials = "same-origin"; - fetch(url, options).then(function (response) { - clearTimeout(timeout); - console.debug("fetchWithTimeout: succeeded connecting to url: " + url); - resolve(response); - }, function (error) { - clearTimeout(timeout); - console.error("fetchWithTimeout: timed out connecting to url: " + url); - reject(); - }); - }); - } - - function ajax(request) { - if (!request) { - throw new Error("Request cannot be null"); - } - - request.headers = request.headers || {}; - console.debug("ConnectionManager requesting url: " + request.url); - return getFetchPromise(request).then(function (response) { - console.debug("ConnectionManager response status: " + response.status + ", url: " + request.url); - - if (response.status < 400) { - if ("json" === request.dataType || "application/json" === request.headers.accept) { - return response.json(); - } - - return response; - } - - return Promise.reject(response); - }, function (err) { - console.error("ConnectionManager request failed to url: " + request.url); - throw err; - }); - } - - function replaceAll(originalString, strReplace, strWith) { - var reg = new RegExp(strReplace, "ig"); - return originalString.replace(reg, strWith); - } - - function normalizeAddress(address) { - address = address.trim(); - - if (0 !== address.toLowerCase().indexOf("http")) { - address = "http://" + address; - } - - address = replaceAll(address, "Http:", "http:"); - address = replaceAll(address, "Https:", "https:"); - - return address; - } - - function stringEqualsIgnoreCase(str1, str2) { - return (str1 || "").toLowerCase() === (str2 || "").toLowerCase(); - } - - function compareVersions(a, b) { - a = a.split("."); - b = b.split("."); - - for (var i = 0, length = Math.max(a.length, b.length); i < length; i++) { - var aVal = parseInt(a[i] || "0"); - var bVal = parseInt(b[i] || "0"); - - if (aVal < bVal) { - return -1; - } - - if (aVal > bVal) { - return 1; - } - } - - return 0; - } - - var defaultTimeout = 20000; - var ConnectionMode = { - Local: 0, - Remote: 1, - Manual: 2 - }; - - var ConnectionManager = function (credentialProvider, appName, appVersion, deviceName, deviceId, capabilities) { - - function onAuthenticated(apiClient, result, options, saveCredentials) { - var credentials = credentialProvider.credentials(); - var servers = credentials.Servers.filter(function (s) { - return s.Id === result.ServerId; - }); - var server = servers.length ? servers[0] : apiClient.serverInfo(); - - if (false !== options.updateDateLastAccessed) { - server.DateLastAccessed = new Date().getTime(); - } - - server.Id = result.ServerId; - - if (saveCredentials) { - server.UserId = result.User.Id; - server.AccessToken = result.AccessToken; - } else { - server.UserId = null; - server.AccessToken = null; - } - - credentialProvider.addOrUpdateServer(credentials.Servers, server); - credentialProvider.credentials(credentials); - apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection; - apiClient.serverInfo(server); - afterConnected(apiClient, options); - return onLocalUserSignIn(server, apiClient.serverAddress(), result.User); - } - - function afterConnected(apiClient, options) { - options = options || {}; - - if (false !== options.reportCapabilities) { - apiClient.reportCapabilities(capabilities); - } - - apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection; - - if (false !== options.enableWebSocket) { - console.debug("calling apiClient.ensureWebSocket"); - apiClient.ensureWebSocket(); - } - } - - function onLocalUserSignIn(server, serverUrl, user) { - self._getOrAddApiClient(server, serverUrl); - - var promise = self.onLocalUserSignedIn ? self.onLocalUserSignedIn.call(self, user) : Promise.resolve(); - return promise.then(function () { - events.trigger(self, "localusersignedin", [user]) - }) - } - - function validateAuthentication(server, serverUrl) { - return ajax({ - type: "GET", - url: getEmbyServerUrl(serverUrl, "System/Info"), - dataType: "json", - headers: { - "X-MediaBrowser-Token": server.AccessToken - } - }).then(function (systemInfo) { - updateServerInfo(server, systemInfo); - return Promise.resolve(); - }, function () { - server.UserId = null; - server.AccessToken = null; - return Promise.resolve(); - }); - } - - function getImageUrl(localUser) { - if (localUser && localUser.PrimaryImageTag) { - return { - url: self.getApiClient(localUser).getUserImageUrl(localUser.Id, { - tag: localUser.PrimaryImageTag, - type: "Primary" - }), - supportsParams: true - }; - } - - return { - url: null, - supportsParams: false - }; - } - - function logoutOfServer(apiClient) { - var serverInfo = apiClient.serverInfo() || {}; - var logoutInfo = { - serverId: serverInfo.Id - }; - return apiClient.logout().then(function () { - events.trigger(self, "localusersignedout", [logoutInfo]); - }, function () { - events.trigger(self, "localusersignedout", [logoutInfo]); - }); - } - - function findServers() { - return new Promise(function (resolve, reject) { - var onFinish = function (foundServers) { - var servers = foundServers.map(function (foundServer) { - var info = { - Id: foundServer.Id, - LocalAddress: convertEndpointAddressToManualAddress(foundServer) || foundServer.Address, - Name: foundServer.Name - }; - info.LastConnectionMode = info.ManualAddress ? ConnectionMode.Manual : ConnectionMode.Local; - return info; - }); - resolve(servers); - }; - - if (window.NativeShell && typeof window.NativeShell.findServers === 'function') { - window.NativeShell.findServers(1e3).then(onFinish, function () { - onFinish([]); - }); - } else { - resolve([]); - } - }); - } - - function convertEndpointAddressToManualAddress(info) { - if (info.Address && info.EndpointAddress) { - var address = info.EndpointAddress.split(":")[0]; - var parts = info.Address.split(":"); - - if (parts.length > 1) { - var portString = parts[parts.length - 1]; - - if (!isNaN(parseInt(portString))) { - address += ":" + portString; - } - } - - return normalizeAddress(address); - } - - return null; - } - - function getTryConnectPromise(url, connectionMode, state, resolve, reject) { - console.debug("getTryConnectPromise " + url); - ajax({ - url: getEmbyServerUrl(url, "system/info/public"), - timeout: defaultTimeout, - type: "GET", - dataType: "json" - }).then(function (result) { - if (!state.resolved) { - state.resolved = true; - console.debug("Reconnect succeeded to " + url); - resolve({ - url: url, - connectionMode: connectionMode, - data: result - }); - } - }, function () { - if (!state.resolved) { - console.error("Reconnect failed to " + url); - - if (++state.rejects >= state.numAddresses) { - reject(); - } - } - }); - } - - function tryReconnect(serverInfo) { - var addresses = []; - var addressesStrings = []; - - if (!serverInfo.manualAddressOnly && serverInfo.LocalAddress && -1 === addressesStrings.indexOf(serverInfo.LocalAddress)) { - addresses.push({ - url: serverInfo.LocalAddress, - mode: ConnectionMode.Local, - timeout: 0 - }); - addressesStrings.push(addresses[addresses.length - 1].url); - } - - if (serverInfo.ManualAddress && -1 === addressesStrings.indexOf(serverInfo.ManualAddress)) { - addresses.push({ - url: serverInfo.ManualAddress, - mode: ConnectionMode.Manual, - timeout: 100 - }); - addressesStrings.push(addresses[addresses.length - 1].url); - } - - if (!serverInfo.manualAddressOnly && serverInfo.RemoteAddress && -1 === addressesStrings.indexOf(serverInfo.RemoteAddress)) { - addresses.push({ - url: serverInfo.RemoteAddress, - mode: ConnectionMode.Remote, - timeout: 200 - }); - addressesStrings.push(addresses[addresses.length - 1].url); - } - - console.debug("tryReconnect: " + addressesStrings.join("|")); - return new Promise(function (resolve, reject) { - var state = {}; - state.numAddresses = addresses.length; - state.rejects = 0; - addresses.map(function (url) { - setTimeout(function () { - if (!state.resolved) { - getTryConnectPromise(url.url, url.mode, state, resolve, reject); - } - }, url.timeout); - }); - }); - } - - function onSuccessfulConnection(server, systemInfo, connectionMode, serverUrl, options, resolve) { - var credentials = credentialProvider.credentials(); - options = options || {}; - - afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, true, options, resolve); - } - - function afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, verifyLocalAuthentication, options, resolve) { - options = options || {}; - if (false === options.enableAutoLogin) { - server.UserId = null; - server.AccessToken = null; - } else if (verifyLocalAuthentication && server.AccessToken && false !== options.enableAutoLogin) { - return void validateAuthentication(server, serverUrl).then(function () { - afterConnectValidated(server, credentials, systemInfo, connectionMode, serverUrl, false, options, resolve); - }); - } - - updateServerInfo(server, systemInfo); - server.LastConnectionMode = connectionMode; - - if (false !== options.updateDateLastAccessed) { - server.DateLastAccessed = new Date().getTime(); - } - - credentialProvider.addOrUpdateServer(credentials.Servers, server); - credentialProvider.credentials(credentials); - var result = { - Servers: [] - }; - result.ApiClient = self._getOrAddApiClient(server, serverUrl); - result.ApiClient.setSystemInfo(systemInfo); - result.State = server.AccessToken && false !== options.enableAutoLogin ? "SignedIn" : "ServerSignIn"; - result.Servers.push(server); - result.ApiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection; - result.ApiClient.updateServerInfo(server, serverUrl); - - var resolveActions = function () { - resolve(result); - events.trigger(self, "connected", [result]); - }; - - if ("SignedIn" === result.State) { - afterConnected(result.ApiClient, options); - result.ApiClient.getCurrentUser().then(function (user) { - onLocalUserSignIn(server, serverUrl, user).then(resolveActions, resolveActions); - }, resolveActions); - } else { - resolveActions(); - } - } - - console.debug("Begin ConnectionManager constructor"); - var self = this; - this._apiClients = []; - self._minServerVersion = "3.2.33"; - - self.appVersion = function () { - return appVersion; - }; - - self.appName = function () { - return appName; - }; - - self.capabilities = function () { - return capabilities; - }; - - self.deviceId = function () { - return deviceId; - }; - - self.credentialProvider = function () { - return credentialProvider; - }; - - self.getServerInfo = function (id) { - return credentialProvider.credentials().Servers.filter(function (s) { - return s.Id === id; - })[0]; - }; - - self.getLastUsedServer = function () { - var servers = credentialProvider.credentials().Servers; - servers.sort(function (a, b) { - return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0); - }); - - if (servers.length) { - return servers[0]; - } - - return null; - }; - - self.addApiClient = function (apiClient) { - self._apiClients.push(apiClient); - - var existingServers = credentialProvider.credentials().Servers.filter(function (s) { - return stringEqualsIgnoreCase(s.ManualAddress, apiClient.serverAddress()) || stringEqualsIgnoreCase(s.LocalAddress, apiClient.serverAddress()) || stringEqualsIgnoreCase(s.RemoteAddress, apiClient.serverAddress()); - }); - var existingServer = existingServers.length ? existingServers[0] : apiClient.serverInfo(); - - existingServer.DateLastAccessed = new Date().getTime(); - existingServer.LastConnectionMode = ConnectionMode.Manual; - existingServer.ManualAddress = apiClient.serverAddress(); - if (apiClient.manualAddressOnly) { - existingServer.manualAddressOnly = true; - } - apiClient.serverInfo(existingServer); - apiClient.onAuthenticated = function (instance, result) { - return onAuthenticated(instance, result, {}, true); - }; - if (!existingServers.length) { - var credentials = credentialProvider.credentials(); - credentials.Servers = [existingServer]; - credentialProvider.credentials(credentials); - } - - events.trigger(self, "apiclientcreated", [apiClient]); - }; - - self.clearData = function () { - console.debug("connection manager clearing data"); - var credentials = credentialProvider.credentials(); - credentials.Servers = []; - credentialProvider.credentials(credentials); - }; - - self._getOrAddApiClient = function (server, serverUrl) { - var apiClient = self.getApiClient(server.Id); - - if (!apiClient) { - apiClient = new apiClientFactory(serverUrl, appName, appVersion, deviceName, deviceId); - self._apiClients.push(apiClient); - apiClient.serverInfo(server); - apiClient.onAuthenticated = function (instance, result) { - return onAuthenticated(instance, result, {}, true); - }; - - events.trigger(self, "apiclientcreated", [apiClient]); - } - - console.debug("returning instance from getOrAddApiClient"); - return apiClient; - }; - - self.getOrCreateApiClient = function (serverId) { - var credentials = credentialProvider.credentials(); - var servers = credentials.Servers.filter(function (s) { - return stringEqualsIgnoreCase(s.Id, serverId); - }); - - if (!servers.length) { - throw new Error("Server not found: " + serverId); - } - - var server = servers[0]; - return self._getOrAddApiClient(server, getServerAddress(server, server.LastConnectionMode)); - }; - - self.user = function (apiClient) { - return new Promise(function (resolve, reject) { - function onLocalUserDone(e) { - if (apiClient && apiClient.getCurrentUserId()) { - apiClient.getCurrentUser().then(function (u) { - localUser = u; - var image = getImageUrl(localUser); - resolve({ - localUser: localUser, - name: localUser ? localUser.Name : null, - imageUrl: image.url, - supportsImageParams: image.supportsParams, - }); - }, onLocalUserDone); - } - } - var localUser; - if (apiClient && apiClient.getCurrentUserId()) { - onLocalUserDone(); - } - }); - }; - - self.logout = function () { - console.debug("begin connectionManager loguot"); - var promises = []; - - for (var i = 0, length = self._apiClients.length; i < length; i++) { - var apiClient = self._apiClients[i]; - - if (apiClient.accessToken()) { - promises.push(logoutOfServer(apiClient)); - } - } - - return Promise.all(promises).then(function () { - var credentials = credentialProvider.credentials(); - var servers = credentials.Servers.filter(function (u) { - return "Guest" !== u.UserLinkType; - }); - - for (var j = 0, numServers = servers.length; j < numServers; j++) { - var server = servers[j]; - server.UserId = null; - server.AccessToken = null; - server.ExchangeToken = null; - } - }); - }; - - self.getSavedServers = function () { - var credentials = credentialProvider.credentials(); - var servers = credentials.Servers.slice(0); - servers.sort(function (a, b) { - return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0); - }); - return servers; - }; - - self.getAvailableServers = function () { - console.debug("begin getAvailableServers"); - var credentials = credentialProvider.credentials(); - return Promise.all([findServers()]).then(function (responses) { - var foundServers = responses[0]; - var servers = credentials.Servers.slice(0); - mergeServers(credentialProvider, servers, foundServers); - servers.sort(function (a, b) { - return (b.DateLastAccessed || 0) - (a.DateLastAccessed || 0); - }); - credentials.Servers = servers; - credentialProvider.credentials(credentials); - return servers; - }); - }; - - self.connectToServers = function (servers, options) { - console.debug("begin connectToServers, with " + servers.length + " servers"); - var firstServer = servers.length ? servers[0] : null; - - if (firstServer) { - return self.connectToServer(firstServer, options).then(function (result) { - if ("Unavailable" === result.State) { - result.State = "ServerSelection"; - } - - console.debug("resolving connectToServers with result.State: " + result.State); - return result; - }); - } - - return Promise.resolve({ - Servers: servers, - State: "ServerSelection" - }); - }; - - self.connectToServer = function (server, options) { - console.debug("begin connectToServer"); - return new Promise(function (resolve, reject) { - options = options || {}; - tryReconnect(server).then(function (result) { - var serverUrl = result.url; - var connectionMode = result.connectionMode; - result = result.data; - - if (1 === compareVersions(self.minServerVersion(), result.Version)) { - console.debug("minServerVersion requirement not met. Server version: " + result.Version); - resolve({ - State: "ServerUpdateNeeded", - Servers: [server] - }); - } else { - if (server.Id && result.Id !== server.Id) { - console.debug("http request succeeded, but found a different server Id than what was expected"); - resolveFailure(self, resolve); - } else { - onSuccessfulConnection(server, result, connectionMode, serverUrl, options, resolve); - } - } - }, function () { - resolveFailure(self, resolve); - }); - }); - }; - - self.connectToAddress = function (address, options) { - function onFail() { - console.error("connectToAddress " + address + " failed"); - return Promise.resolve({ - State: "Unavailable", - }); - } - - if (!address) { - return Promise.reject(); - } - - address = normalizeAddress(address); - var instance = this; - var server = { - ManualAddress: address, - LastConnectionMode: ConnectionMode.Manual - }; - return self.connectToServer(server, options).catch(onFail); - }; - - self.deleteServer = function (serverId) { - if (!serverId) { - throw new Error("null serverId"); - } - - var server = credentialProvider.credentials().Servers.filter(function (s) { - return s.Id === serverId; - }); - server = server.length ? server[0] : null; - return new Promise(function (resolve, reject) { - function onDone() { - var credentials = credentialProvider.credentials(); - credentials.Servers = credentials.Servers.filter(function (s) { - return s.Id !== serverId; - }); - credentialProvider.credentials(credentials); - resolve(); - } - - if (!server.ConnectServerId) { - return void onDone(); - } - }); - }; - }; - - ConnectionManager.prototype.connect = function (options) { - console.debug("begin connect"); - var instance = this; - return instance.getAvailableServers().then(function (servers) { - return instance.connectToServers(servers, options); - }); - }; - - ConnectionManager.prototype.getApiClients = function () { - var servers = this.getSavedServers(); - - for (var i = 0, length = servers.length; i < length; i++) { - var server = servers[i]; - - if (server.Id) { - this._getOrAddApiClient(server, getServerAddress(server, server.LastConnectionMode)); - } - } - - return this._apiClients; - }; - - ConnectionManager.prototype.getApiClient = function (item) { - if (!item) { - throw new Error("item or serverId cannot be null"); - } - - if (item.ServerId) { - item = item.ServerId; - } - - return this._apiClients.filter(function (a) { - var serverInfo = a.serverInfo(); - return !serverInfo || serverInfo.Id === item; - })[0]; - }; - - ConnectionManager.prototype.minServerVersion = function (val) { - if (val) { - this._minServerVersion = val; - } - - return this._minServerVersion; - }; - - ConnectionManager.prototype.handleMessageReceived = function (msg) { - var serverId = msg.ServerId; - - if (serverId) { - var apiClient = this.getApiClient(serverId); - - if (apiClient) { - if ("string" == typeof msg.Data) { - try { - msg.Data = JSON.parse(msg.Data); - } catch (err) {} - } - - apiClient.handleMessageReceived(msg); - } - } - }; - - return ConnectionManager; -}); diff --git a/src/libraries/apiclient/credentialprovider.js b/src/libraries/apiclient/credentialprovider.js deleted file mode 100644 index 4ae809cac..000000000 --- a/src/libraries/apiclient/credentialprovider.js +++ /dev/null @@ -1,29 +0,0 @@ -define(["events", "appStorage"], function(events, appStorage) { - "use strict"; - - function ensure(instance, data) { - if (!instance._credentials) { - var json = appStorage.getItem(instance.key) || "{}"; - console.debug("credentials initialized with: " + json), instance._credentials = JSON.parse(json), instance._credentials.Servers = instance._credentials.Servers || [] - } - } - - function set(instance, data) { - data ? (instance._credentials = data, appStorage.setItem(instance.key, JSON.stringify(data))) : instance.clear(), events.trigger(instance, "credentialsupdated") - } - - function Credentials(key) { - this.key = key || "jellyfin_credentials" - } - return Credentials.prototype.clear = function() { - this._credentials = null, appStorage.removeItem(this.key) - }, Credentials.prototype.credentials = function(data) { - return data && set(this, data), ensure(this), this._credentials - }, Credentials.prototype.addOrUpdateServer = function(list, server) { - if (!server.Id) throw new Error("Server.Id cannot be null or empty"); - var existing = list.filter(function(s) { - return s.Id === server.Id - })[0]; - return existing ? (existing.DateLastAccessed = Math.max(existing.DateLastAccessed || 0, server.DateLastAccessed || 0), existing.UserLinkType = server.UserLinkType, server.AccessToken && (existing.AccessToken = server.AccessToken, existing.UserId = server.UserId), server.ExchangeToken && (existing.ExchangeToken = server.ExchangeToken), server.RemoteAddress && (existing.RemoteAddress = server.RemoteAddress), server.ManualAddress && (existing.ManualAddress = server.ManualAddress), server.LocalAddress && (existing.LocalAddress = server.LocalAddress), server.Name && (existing.Name = server.Name), null != server.LastConnectionMode && (existing.LastConnectionMode = server.LastConnectionMode), server.ConnectServerId && (existing.ConnectServerId = server.ConnectServerId), existing) : (list.push(server), server) - }, Credentials -}); diff --git a/src/libraries/apiclient/events.js b/src/libraries/apiclient/events.js deleted file mode 100644 index c109ee9c4..000000000 --- a/src/libraries/apiclient/events.js +++ /dev/null @@ -1,30 +0,0 @@ -define([], function() { - "use strict"; - - function getCallbacks(obj, name) { - if (!obj) throw new Error("obj cannot be null!"); - obj._callbacks = obj._callbacks || {}; - var list = obj._callbacks[name]; - return list || (obj._callbacks[name] = [], list = obj._callbacks[name]), list - } - return { - on: function(obj, eventName, fn) { - getCallbacks(obj, eventName).push(fn) - }, - off: function(obj, eventName, fn) { - var list = getCallbacks(obj, eventName), - i = list.indexOf(fn); - 1 !== i && list.splice(i, 1) - }, - trigger: function(obj, eventName) { - var eventObject = { - type: eventName - }, - eventArgs = []; - eventArgs.push(eventObject); - for (var additionalArgs = arguments[2] || [], i = 0, length = additionalArgs.length; i < length; i++) eventArgs.push(additionalArgs[i]); - getCallbacks(obj, eventName).slice(0).forEach(function(c) { - c.apply(obj, eventArgs) - }) - } - } -}); diff --git a/src/libraries/apiclient/localassetmanager.js b/src/libraries/apiclient/localassetmanager.js deleted file mode 100644 index 6fb1d4722..000000000 --- a/src/libraries/apiclient/localassetmanager.js +++ /dev/null @@ -1,406 +0,0 @@ -define(["filerepository", "itemrepository", "useractionrepository", "transfermanager"], function(filerepository, itemrepository, useractionrepository, transfermanager) { - "use strict"; - - function getLocalItem(serverId, itemId) { - return console.debug("localassetmanager: begin getLocalItem"), itemrepository.get(serverId, itemId) - } - - function recordUserAction(action) { - return action.Id = createGuid(), useractionrepository.set(action.Id, action) - } - - function getUserActions(serverId) { - return useractionrepository.getByServerId(serverId) - } - - function deleteUserAction(action) { - return useractionrepository.remove(action.Id) - } - - function deleteUserActions(actions) { - var results = []; - return actions.forEach(function(action) { - results.push(deleteUserAction(action)) - }), Promise.all(results) - } - - function getServerItems(serverId) { - return console.debug("localassetmanager: begin getServerItems"), itemrepository.getAll(serverId) - } - - function getItemsFromIds(serverId, ids) { - var actions = ids.map(function(id) { - var strippedId = stripStart(id, "local:"); - return getLocalItem(serverId, strippedId) - }); - return Promise.all(actions).then(function(items) { - var libItems = items.map(function(locItem) { - return locItem.Item - }); - return Promise.resolve(libItems) - }) - } - - function getViews(serverId, userId) { - return itemrepository.getServerItemTypes(serverId, userId).then(function(types) { - var item, list = []; - return types.indexOf("Audio") > -1 && (item = { - Name: "Music", - ServerId: serverId, - Id: "localview:MusicView", - Type: "MusicView", - CollectionType: "music", - IsFolder: !0 - }, list.push(item)), types.indexOf("Photo") > -1 && (item = { - Name: "Photos", - ServerId: serverId, - Id: "localview:PhotosView", - Type: "PhotosView", - CollectionType: "photos", - IsFolder: !0 - }, list.push(item)), types.indexOf("Episode") > -1 && (item = { - Name: "TV", - ServerId: serverId, - Id: "localview:TVView", - Type: "TVView", - CollectionType: "tvshows", - IsFolder: !0 - }, list.push(item)), types.indexOf("Movie") > -1 && (item = { - Name: "Movies", - ServerId: serverId, - Id: "localview:MoviesView", - Type: "MoviesView", - CollectionType: "movies", - IsFolder: !0 - }, list.push(item)), types.indexOf("Video") > -1 && (item = { - Name: "Videos", - ServerId: serverId, - Id: "localview:VideosView", - Type: "VideosView", - CollectionType: "videos", - IsFolder: !0 - }, list.push(item)), types.indexOf("MusicVideo") > -1 && (item = { - Name: "Music Videos", - ServerId: serverId, - Id: "localview:MusicVideosView", - Type: "MusicVideosView", - CollectionType: "videos", - IsFolder: !0 - }, list.push(item)), Promise.resolve(list) - }) - } - - function updateFiltersForTopLevelView(parentId, mediaTypes, includeItemTypes, query) { - switch (parentId) { - case "MusicView": - return query.Recursive ? includeItemTypes.push("Audio") : includeItemTypes.push("MusicAlbum"), !0; - case "PhotosView": - return query.Recursive ? includeItemTypes.push("Photo") : includeItemTypes.push("PhotoAlbum"), !0; - case "TVView": - return query.Recursive ? includeItemTypes.push("Episode") : includeItemTypes.push("Series"), !0; - case "VideosView": - return query.Recursive, includeItemTypes.push("Video"), !0; - case "MoviesView": - return query.Recursive, includeItemTypes.push("Movie"), !0; - case "MusicVideosView": - return query.Recursive, includeItemTypes.push("MusicVideo"), !0 - } - return !1 - } - - function normalizeId(id) { - return id ? (id = stripStart(id, "localview:"), id = stripStart(id, "local:")) : null - } - - function normalizeIdList(val) { - return val ? val.split(",").map(normalizeId) : [] - } - - function shuffle(array) { - for (var temporaryValue, randomIndex, currentIndex = array.length; 0 !== currentIndex;) randomIndex = Math.floor(Math.random() * currentIndex), currentIndex -= 1, temporaryValue = array[currentIndex], array[currentIndex] = array[randomIndex], array[randomIndex] = temporaryValue; - return array - } - - function sortItems(items, query) { - if (!query.SortBy || 0 === query.SortBy.length) return items; - if ("Random" === query.SortBy) return shuffle(items); - var sortSpec = getSortSpec(query); - return items.sort(function(a, b) { - for (var i = 0; i < sortSpec.length; i++) { - var result = compareValues(a, b, sortSpec[i].Field, sortSpec[i].OrderDescending); - if (0 !== result) return result - } - return 0 - }), items - } - - function compareValues(a, b, field, orderDesc) { - if (!a.hasOwnProperty(field) || !b.hasOwnProperty(field)) return 0; - var valA = a[field], - valB = b[field], - result = 0; - return "string" == typeof valA || "string" == typeof valB ? (valA = valA || "", valB = valB || "", result = valA.toLowerCase().localeCompare(valB.toLowerCase())) : valA > valB ? result = 1 : valA < valB && (result = -1), orderDesc && (result *= -1), result - } - - function getSortSpec(query) { - for (var sortFields = (query.SortBy || "").split(","), sortOrders = (query.SortOrder || "").split(","), sortSpec = [], i = 0; i < sortFields.length; i++) { - var orderDesc = !1; - i < sortOrders.length && -1 !== sortOrders[i].toLowerCase().indexOf("desc") && (orderDesc = !0), sortSpec.push({ - Field: sortFields[i], - OrderDescending: orderDesc - }) - } - return sortSpec - } - - function getViewItems(serverId, userId, options) { - var searchParentId = options.ParentId; - searchParentId = normalizeId(searchParentId); - var seasonId = normalizeId(options.SeasonId || options.seasonId), - seriesId = normalizeId(options.SeriesId || options.seriesId), - albumIds = normalizeIdList(options.AlbumIds || options.albumIds), - includeItemTypes = options.IncludeItemTypes ? options.IncludeItemTypes.split(",") : [], - filters = options.Filters ? options.Filters.split(",") : [], - mediaTypes = options.MediaTypes ? options.MediaTypes.split(",") : []; - return updateFiltersForTopLevelView(searchParentId, mediaTypes, includeItemTypes, options) && (searchParentId = null), getServerItems(serverId).then(function(items) { - var itemsMap = new Map, - subtreeIdSet = new Set; - if (items.forEach(function(item) { - item.Item.LocalChildren = [], itemsMap.set(item.Item.Id, item.Item) - }), itemsMap.forEach(function(item, ignored, ignored2) { - if (item.ParentId && itemsMap.has(item.ParentId)) { - itemsMap.get(item.ParentId).LocalChildren.push(item) - } - }), options.Recursive && searchParentId && itemsMap.has(searchParentId)) { - var addSubtreeIds = function(recurseItem) { - subtreeIdSet.has(recurseItem.Id) || subtreeIdSet.add(recurseItem.Id), recurseItem.LocalChildren.forEach(function(childItem) { - addSubtreeIds(childItem) - }) - }, - searchParentItem = itemsMap.get(searchParentId); - addSubtreeIds(searchParentItem) - } - var resultItems = items.filter(function(item) { - return (!item.SyncStatus || "synced" === item.SyncStatus) && ((!mediaTypes.length || -1 !== mediaTypes.indexOf(item.Item.MediaType || "")) && ((!seriesId || item.Item.SeriesId === seriesId) && ((!seasonId || item.Item.SeasonId === seasonId) && ((!albumIds.length || -1 !== albumIds.indexOf(item.Item.AlbumId || "")) && ((!item.Item.IsFolder || -1 === filters.indexOf("IsNotFolder")) && (!(!item.Item.IsFolder && -1 !== filters.indexOf("IsFolder")) && ((!includeItemTypes.length || -1 !== includeItemTypes.indexOf(item.Item.Type || "")) && (!searchParentId || (options.Recursive ? subtreeIdSet.has(item.Item.Id) : item.Item.ParentId === searchParentId))))))))) - }).map(function(item2) { - return item2.Item - }); - return resultItems = sortItems(resultItems, options), options.Limit && (resultItems = resultItems.slice(0, options.Limit)), Promise.resolve(resultItems) - }) - } - - function removeObsoleteContainerItems(serverId) { - return getServerItems(serverId).then(function(items) { - var seriesItems = items.filter(function(item) { - return "series" === (item.Item.Type || "").toLowerCase() - }), - seasonItems = items.filter(function(item) { - return "season" === (item.Item.Type || "").toLowerCase() - }), - albumItems = items.filter(function(item) { - var type = (item.Item.Type || "").toLowerCase(); - return "musicalbum" === type || "photoalbum" === type - }), - requiredSeriesIds = items.filter(function(item) { - return "episode" === (item.Item.Type || "").toLowerCase() - }).map(function(item2) { - return item2.Item.SeriesId - }).filter(filterDistinct), - requiredSeasonIds = items.filter(function(item) { - return "episode" === (item.Item.Type || "").toLowerCase() - }).map(function(item2) { - return item2.Item.SeasonId - }).filter(filterDistinct), - requiredAlbumIds = items.filter(function(item) { - var type = (item.Item.Type || "").toLowerCase(); - return "audio" === type || "photo" === type - }).map(function(item2) { - return item2.Item.AlbumId - }).filter(filterDistinct), - obsoleteItems = []; - seriesItems.forEach(function(item) { - requiredSeriesIds.indexOf(item.Item.Id) < 0 && obsoleteItems.push(item) - }), seasonItems.forEach(function(item) { - requiredSeasonIds.indexOf(item.Item.Id) < 0 && obsoleteItems.push(item) - }), albumItems.forEach(function(item) { - requiredAlbumIds.indexOf(item.Item.Id) < 0 && obsoleteItems.push(item) - }); - var p = Promise.resolve(); - return obsoleteItems.forEach(function(item) { - p = p.then(function() { - return itemrepository.remove(item.ServerId, item.Id) - }) - }), p - }) - } - - function removeLocalItem(localItem) { - return itemrepository.get(localItem.ServerId, localItem.Id).then(function(item) { - var onFileDeletedSuccessOrFail = function() { - return itemrepository.remove(localItem.ServerId, localItem.Id) - }, - p = Promise.resolve(); - return item.LocalPath && (p = p.then(function() { - return filerepository.deleteFile(item.LocalPath) - })), item && item.Item && item.Item.MediaSources && item.Item.MediaSources.forEach(function(mediaSource) { - mediaSource.MediaStreams && mediaSource.MediaStreams.length > 0 && mediaSource.MediaStreams.forEach(function(mediaStream) { - mediaStream.Path && (p = p.then(function() { - return filerepository.deleteFile(mediaStream.Path) - })) - }) - }), p.then(onFileDeletedSuccessOrFail, onFileDeletedSuccessOrFail) - }, function(item) { - return Promise.resolve() - }) - } - - function addOrUpdateLocalItem(localItem) { - return itemrepository.set(localItem.ServerId, localItem.Id, localItem) - } - - function getSubtitleSaveFileName(localItem, mediaPath, language, isForced, format) { - var name = getNameWithoutExtension(mediaPath); - name = filerepository.getValidFileName(name), language && (name += "." + language.toLowerCase()), isForced && (name += ".foreign"), name = name + "." + format.toLowerCase(); - var mediaFolder = filerepository.getParentPath(localItem.LocalPath); - return filerepository.combinePath(mediaFolder, name) - } - - function getItemFileSize(path) { - return filerepository.getItemFileSize(path) - } - - function getNameWithoutExtension(path) { - var fileName = path, - pos = fileName.lastIndexOf("."); - return pos > 0 && (fileName = fileName.substring(0, pos)), fileName - } - - function downloadFile(url, localItem) { - var imageUrl = getImageUrl(localItem.Item.ServerId, localItem.Item.Id, { - type: "Primary", - index: 0 - }); - return transfermanager.downloadFile(url, localItem, imageUrl) - } - - function downloadSubtitles(url, fileName) { - return transfermanager.downloadSubtitles(url, fileName) - } - - function getImageUrl(serverId, itemId, imageOptions) { - var imageType = imageOptions.type, - index = imageOptions.index, - pathArray = getImagePath(serverId, itemId, imageType, index); - return filerepository.getImageUrl(pathArray) - } - - function hasImage(serverId, itemId, imageType, index) { - var pathArray = getImagePath(serverId, itemId, imageType, index), - localFilePath = filerepository.getFullMetadataPath(pathArray); - return filerepository.fileExists(localFilePath).then(function(exists) { - return Promise.resolve(exists) - }, function(err) { - return Promise.resolve(!1) - }) - } - - function fileExists(localFilePath) { - return filerepository.fileExists(localFilePath) - } - - function downloadImage(localItem, url, serverId, itemId, imageType, index) { - var localPathParts = getImagePath(serverId, itemId, imageType, index); - return transfermanager.downloadImage(url, localPathParts) - } - - function isDownloadFileInQueue(path) { - return transfermanager.isDownloadFileInQueue(path) - } - - function getDownloadItemCount() { - return transfermanager.getDownloadItemCount() - } - - function getDirectoryPath(item) { - var parts = [], - itemtype = item.Type.toLowerCase(), - mediaType = (item.MediaType || "").toLowerCase(); - "episode" === itemtype || "series" === itemtype || "season" === itemtype ? parts.push("TV") : "video" === mediaType ? parts.push("Videos") : "audio" === itemtype || "musicalbum" === itemtype || "musicartist" === itemtype ? parts.push("Music") : "photo" === itemtype || "photoalbum" === itemtype ? parts.push("Photos") : null; - var albumArtist = item.AlbumArtist; - albumArtist && parts.push(albumArtist); - var seriesName = item.SeriesName; - seriesName && parts.push(seriesName); - var seasonName = item.SeasonName; - seasonName && parts.push(seasonName), item.Album && parts.push(item.Album), ("video" === mediaType && "episode" !== itemtype || item.IsFolder) && parts.push(item.Name); - for (var finalParts = [], i = 0; i < parts.length; i++) finalParts.push(filerepository.getValidFileName(parts[i])); - return finalParts - } - - function getImagePath(serverId, itemId, imageType, index) { - var parts = []; - parts.push("images"), index = index || 0, parts.push(itemId + "_" + imageType + "_" + index.toString()); - for (var finalParts = [], i = 0; i < parts.length; i++) finalParts.push(parts[i]); - return finalParts - } - - function getLocalFileName(item, originalFileName) { - var filename = originalFileName || item.Name; - return filerepository.getValidFileName(filename) - } - - function resyncTransfers() { - return transfermanager.resyncTransfers() - } - - function createGuid() { - var d = (new Date).getTime(); - return window.performance && "function" == typeof window.performance.now && (d += performance.now()), "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { - var r = (d + 16 * Math.random()) % 16 | 0; - return d = Math.floor(d / 16), ("x" === c ? r : 3 & r | 8).toString(16) - }) - } - - function startsWith(str, find) { - return !!(str && find && str.length > find.length && 0 === str.indexOf(find)) - } - - function stripStart(str, find) { - return startsWith(str, find) ? str.substr(find.length) : str - } - - function filterDistinct(value, index, self) { - return self.indexOf(value) === index - } - - function enableBackgroundCompletion() { - return transfermanager.enableBackgroundCompletion - } - return { - getLocalItem: getLocalItem, - getDirectoryPath: getDirectoryPath, - getLocalFileName: getLocalFileName, - recordUserAction: recordUserAction, - getUserActions: getUserActions, - deleteUserAction: deleteUserAction, - deleteUserActions: deleteUserActions, - removeLocalItem: removeLocalItem, - addOrUpdateLocalItem: addOrUpdateLocalItem, - downloadFile: downloadFile, - downloadSubtitles: downloadSubtitles, - hasImage: hasImage, - downloadImage: downloadImage, - getImageUrl: getImageUrl, - getSubtitleSaveFileName: getSubtitleSaveFileName, - getServerItems: getServerItems, - getItemFileSize: getItemFileSize, - isDownloadFileInQueue: isDownloadFileInQueue, - getDownloadItemCount: getDownloadItemCount, - getViews: getViews, - getViewItems: getViewItems, - resyncTransfers: resyncTransfers, - getItemsFromIds: getItemsFromIds, - removeObsoleteContainerItems: removeObsoleteContainerItems, - fileExists: fileExists, - enableBackgroundCompletion: enableBackgroundCompletion - } -}); diff --git a/src/libraries/apiclient/package.json b/src/libraries/apiclient/package.json deleted file mode 100644 index 67f9d4975..000000000 --- a/src/libraries/apiclient/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main": "apiclient.js" -} diff --git a/src/libraries/apiclient/sync/filerepository.js b/src/libraries/apiclient/sync/filerepository.js deleted file mode 100644 index 5b7088af3..000000000 --- a/src/libraries/apiclient/sync/filerepository.js +++ /dev/null @@ -1,45 +0,0 @@ -define([], function() { - "use strict"; - - function getValidFileName(path) { - return path - } - - function getFullLocalPath(pathArray) { - return pathArray.join("/") - } - - function getPathFromArray(pathArray) { - return pathArray.join("/") - } - - function deleteFile(path) { - return Promise.resolve() - } - - function deleteDirectory(path) { - return Promise.resolve() - } - - function fileExists(path) { - return Promise.resolve() - } - - function getItemFileSize(path) { - return Promise.resolve(0) - } - - function getImageUrl(pathParts) { - return pathParts.join("/") - } - return { - getValidFileName: getValidFileName, - getFullLocalPath: getFullLocalPath, - getPathFromArray: getPathFromArray, - deleteFile: deleteFile, - deleteDirectory: deleteDirectory, - fileExists: fileExists, - getItemFileSize: getItemFileSize, - getImageUrl: getImageUrl - } -}); diff --git a/src/libraries/apiclient/sync/itemrepository.js b/src/libraries/apiclient/sync/itemrepository.js deleted file mode 100644 index db1f96287..000000000 --- a/src/libraries/apiclient/sync/itemrepository.js +++ /dev/null @@ -1,123 +0,0 @@ -define([], function() { - "use strict"; - - function ServerDatabase(dbName, readyCallback) { - var request = indexedDB.open(dbName, dbVersion); - request.onerror = function(event) {}, request.onupgradeneeded = function(event) { - var db = event.target.result; - db.createObjectStore(dbName).transaction.oncomplete = function(event) { - readyCallback(db) - } - }, request.onsuccess = function(event) { - var db = event.target.result; - readyCallback(db) - } - } - - function getDbName(serverId) { - return "items_" + serverId - } - - function getDb(serverId, callback) { - var dbName = getDbName(serverId), - db = databases[dbName]; - if (db) return void callback(db); - new ServerDatabase(dbName, function(db) { - databases[dbName] = db, callback(db) - }) - } - - function getServerItemTypes(serverId, userId) { - return getAll(serverId, userId).then(function(all) { - return all.map(function(item2) { - return item2.Item.Type || "" - }).filter(filterDistinct) - }) - } - - function getAll(serverId, userId) { - return new Promise(function(resolve, reject) { - getDb(serverId, function(db) { - var request, storeName = getDbName(serverId), - transaction = db.transaction([storeName], "readonly"), - objectStore = transaction.objectStore(storeName); - if ("getAll" in objectStore) request = objectStore.getAll(null, 1e4), request.onsuccess = function(event) { - resolve(event.target.result) - }; - else { - var results = []; - request = objectStore.openCursor(), request.onsuccess = function(event) { - var cursor = event.target.result; - cursor ? (results.push(cursor.value), cursor.continue()) : resolve(results) - } - } - request.onerror = reject - }) - }) - } - - function get(serverId, key) { - return new Promise(function(resolve, reject) { - getDb(serverId, function(db) { - var storeName = getDbName(serverId), - transaction = db.transaction([storeName], "readonly"), - objectStore = transaction.objectStore(storeName), - request = objectStore.get(key); - request.onerror = reject, request.onsuccess = function(event) { - resolve(request.result) - } - }) - }) - } - - function set(serverId, key, val) { - return new Promise(function(resolve, reject) { - getDb(serverId, function(db) { - var storeName = getDbName(serverId), - transaction = db.transaction([storeName], "readwrite"), - objectStore = transaction.objectStore(storeName), - request = objectStore.put(val, key); - request.onerror = reject, request.onsuccess = resolve - }) - }) - } - - function remove(serverId, key) { - return new Promise(function(resolve, reject) { - getDb(serverId, function(db) { - var storeName = getDbName(serverId), - transaction = db.transaction([storeName], "readwrite"), - objectStore = transaction.objectStore(storeName), - request = objectStore.delete(key); - request.onerror = reject, request.onsuccess = resolve - }) - }) - } - - function clear(serverId) { - return new Promise(function(resolve, reject) { - getDb(serverId, function(db) { - var storeName = getDbName(serverId), - transaction = db.transaction([storeName], "readwrite"), - objectStore = transaction.objectStore(storeName), - request = objectStore.clear(); - request.onerror = reject, request.onsuccess = resolve - }) - }) - } - - function filterDistinct(value, index, self) { - return self.indexOf(value) === index - } - var indexedDB = self.indexedDB || self.mozIndexedDB || self.webkitIndexedDB || self.msIndexedDB, - dbVersion = (self.IDBTransaction || self.webkitIDBTransaction || self.msIDBTransaction, self.IDBKeyRange || self.webkitIDBKeyRange || self.msIDBKeyRange, 1), - databases = {}; - return { - get: get, - set: set, - remove: remove, - clear: clear, - getAll: getAll, - getServerItemTypes: getServerItemTypes - } -}); diff --git a/src/libraries/apiclient/sync/localsync.js b/src/libraries/apiclient/sync/localsync.js deleted file mode 100644 index 14e9ff9c0..000000000 --- a/src/libraries/apiclient/sync/localsync.js +++ /dev/null @@ -1,17 +0,0 @@ -define(["connectionManager"], function(connectionManager) { - "use strict"; - var isSyncing; - return { - sync: function(options) { - return console.debug("localSync.sync starting..."), isSyncing ? Promise.resolve() : (isSyncing = !0, new Promise(function(resolve, reject) { - require(["multiserversync", "appSettings"], function(MultiServerSync, appSettings) { - options = options || {}, options.cameraUploadServers = appSettings.cameraUploadServers(), (new MultiServerSync).sync(connectionManager, options).then(function() { - isSyncing = null, resolve() - }, function(err) { - isSyncing = null, reject(err) - }) - }) - })) - } - } -}); diff --git a/src/libraries/apiclient/sync/mediasync.js b/src/libraries/apiclient/sync/mediasync.js deleted file mode 100644 index e6d9e781f..000000000 --- a/src/libraries/apiclient/sync/mediasync.js +++ /dev/null @@ -1,370 +0,0 @@ -define(["localassetmanager"], function(localassetmanager) { - "use strict"; - - function processDownloadStatus(apiClient, serverInfo, options) { - return console.debug("mediasync: begin processDownloadStatus"), localassetmanager.resyncTransfers().then(function() { - return localassetmanager.getServerItems(serverInfo.Id).then(function(items) { - console.debug("mediasync: begin processDownloadStatus getServerItems completed"); - var p = Promise.resolve(), - cnt = 0; - return items.filter(function(item) { - return "transferring" === item.SyncStatus || "queued" === item.SyncStatus - }).forEach(function(item) { - p = p.then(function() { - return reportTransfer(apiClient, item) - }), cnt++ - }), p.then(function() { - console.debug("mediasync: exit processDownloadStatus"); - console.debug("items reported: " + cnt.toString()); - return Promise.resolve(); - }) - }) - }) - } - - function reportTransfer(apiClient, item) { - return localassetmanager.getItemFileSize(item.LocalPath).then(function(size) { - return size > 0 ? apiClient.reportSyncJobItemTransferred(item.SyncJobItemId).then(function() { - return item.SyncStatus = "synced", console.debug("mediasync: reportSyncJobItemTransferred called for " + item.LocalPath), localassetmanager.addOrUpdateLocalItem(item) - }, function(error) { - return console.error("mediasync: mediasync error on reportSyncJobItemTransferred", error), item.SyncStatus = "error", localassetmanager.addOrUpdateLocalItem(item) - }) : localassetmanager.isDownloadFileInQueue(item.LocalPath).then(function(result) { - return result ? Promise.resolve() : (console.debug("mediasync: reportTransfer: Size is 0 and download no longer in queue. Deleting item."), localassetmanager.removeLocalItem(item).then(function() { - return console.debug("mediasync: reportTransfer: Item deleted."), Promise.resolve() - }, function(err2) { - return console.debug("mediasync: reportTransfer: Failed to delete item.", err2), Promise.resolve() - })) - }) - }, function(error) { - return console.error("mediasync: reportTransfer: error on getItemFileSize. Deleting item.", error), localassetmanager.removeLocalItem(item).then(function() { - return console.debug("mediasync: reportTransfer: Item deleted."), Promise.resolve() - }, function(err2) { - return console.error("mediasync: reportTransfer: Failed to delete item.", err2), Promise.resolve() - }) - }) - } - - function reportOfflineActions(apiClient, serverInfo) { - return console.debug("mediasync: begin reportOfflineActions"), localassetmanager.getUserActions(serverInfo.Id).then(function(actions) { - return actions.length ? apiClient.reportOfflineActions(actions).then(function() { - return localassetmanager.deleteUserActions(actions).then(function() { - return console.debug("mediasync: exit reportOfflineActions (actions reported and deleted.)"), Promise.resolve() - }) - }, function(err) { - return console.error("mediasync: error on apiClient.reportOfflineActions: " + err.toString()), localassetmanager.deleteUserActions(actions) - }) : (console.debug("mediasync: exit reportOfflineActions (no actions)"), Promise.resolve()) - }) - } - - function syncData(apiClient, serverInfo) { - return console.debug("mediasync: begin syncData"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { - var completedItems = items.filter(function(item) { - return item && ("synced" === item.SyncStatus || "error" === item.SyncStatus) - }), - request = { - TargetId: apiClient.deviceId(), - LocalItemIds: completedItems.map(function(xitem) { - return xitem.ItemId - }) - }; - return apiClient.syncData(request).then(function(result) { - return afterSyncData(apiClient, serverInfo, result).then(function() { - return console.debug("mediasync: exit syncData"), Promise.resolve() - }, function(err) { - return console.error("mediasync: error in syncData: " + err.toString()), Promise.resolve() - }) - }) - }) - } - - function afterSyncData(apiClient, serverInfo, syncDataResult) { - console.debug("mediasync: begin afterSyncData"); - var p = Promise.resolve(); - return syncDataResult.ItemIdsToRemove && syncDataResult.ItemIdsToRemove.length > 0 && syncDataResult.ItemIdsToRemove.forEach(function(itemId) { - p = p.then(function() { - return removeLocalItem(itemId, serverInfo.Id) - }) - }), p = p.then(function() { - return removeObsoleteContainerItems(serverInfo.Id) - }), p.then(function() { - return console.debug("mediasync: exit afterSyncData"), Promise.resolve() - }) - } - - function removeObsoleteContainerItems(serverId) { - return console.debug("mediasync: begin removeObsoleteContainerItems"), localassetmanager.removeObsoleteContainerItems(serverId) - } - - function removeLocalItem(itemId, serverId) { - return console.debug("mediasync: begin removeLocalItem"), localassetmanager.getLocalItem(serverId, itemId).then(function(item) { - return item ? localassetmanager.removeLocalItem(item) : Promise.resolve() - }, function(err2) { - return console.error("mediasync: removeLocalItem: Failed: ", err2), Promise.resolve() - }) - } - - function getNewMedia(apiClient, downloadCount) { - return console.debug("mediasync: begin getNewMedia"), apiClient.getReadySyncItems(apiClient.deviceId()).then(function(jobItems) { - console.debug("mediasync: getReadySyncItems returned " + jobItems.length + " items"); - var p = Promise.resolve(), - currentCount = downloadCount; - return jobItems.forEach(function(jobItem) { - currentCount++ <= 10 && (p = p.then(function() { - return getNewItem(jobItem, apiClient) - })) - }), p.then(function() { - return console.debug("mediasync: exit getNewMedia"), Promise.resolve() - }) - }, function(err) { - return console.error("mediasync: getReadySyncItems: Failed: ", err), Promise.resolve() - }) - } - - function afterMediaDownloaded(apiClient, jobItem, localItem) { - return console.debug("mediasync: begin afterMediaDownloaded"), getImages(apiClient, jobItem, localItem).then(function() { - var libraryItem = jobItem.Item; - return downloadParentItems(apiClient, jobItem, libraryItem).then(function() { - return getSubtitles(apiClient, jobItem, localItem) - }) - }) - } - - function createLocalItem(libraryItem, jobItem) { - console.debug("localassetmanager: begin createLocalItem"); - var item = { - Item: libraryItem, - ItemId: libraryItem.Id, - ServerId: libraryItem.ServerId, - Id: libraryItem.Id - }; - return jobItem && (item.SyncJobItemId = jobItem.SyncJobItemId), console.debug("localassetmanager: end createLocalItem"), item - } - - function getNewItem(jobItem, apiClient) { - console.debug("mediasync: begin getNewItem"); - var libraryItem = jobItem.Item; - return localassetmanager.getLocalItem(libraryItem.ServerId, libraryItem.Id).then(function(existingItem) { - if (existingItem && ("queued" === existingItem.SyncStatus || "transferring" === existingItem.SyncStatus || "synced" === existingItem.SyncStatus) && (console.debug("mediasync: getNewItem: getLocalItem found existing item"), localassetmanager.enableBackgroundCompletion())) return Promise.resolve(); - libraryItem.CanDelete = !1, libraryItem.CanDownload = !1, libraryItem.SupportsSync = !1, libraryItem.People = [], libraryItem.Chapters = [], libraryItem.Studios = [], libraryItem.SpecialFeatureCount = null, libraryItem.LocalTrailerCount = null, libraryItem.RemoteTrailers = []; - var localItem = createLocalItem(libraryItem, jobItem); - return localItem.SyncStatus = "queued", downloadMedia(apiClient, jobItem, localItem) - }) - } - - function downloadParentItems(apiClient, jobItem, libraryItem) { - var p = Promise.resolve(); - return libraryItem.SeriesId && (p = p.then(function() { - return downloadItem(apiClient, libraryItem.SeriesId) - })), libraryItem.SeasonId && (p = p.then(function() { - return downloadItem(apiClient, libraryItem.SeasonId).then(function(seasonItem) { - return libraryItem.SeasonPrimaryImageTag = (seasonItem.Item.ImageTags || {}).Primary, Promise.resolve() - }) - })), libraryItem.AlbumId && (p = p.then(function() { - return downloadItem(apiClient, libraryItem.AlbumId) - })), p - } - - function downloadItem(apiClient, itemId) { - return apiClient.getItem(apiClient.getCurrentUserId(), itemId).then(function(downloadedItem) { - downloadedItem.CanDelete = !1, downloadedItem.CanDownload = !1, downloadedItem.SupportsSync = !1, downloadedItem.People = [], downloadedItem.SpecialFeatureCount = null, downloadedItem.BackdropImageTags = null, downloadedItem.ParentBackdropImageTags = null, downloadedItem.ParentArtImageTag = null, downloadedItem.ParentLogoImageTag = null; - var localItem = createLocalItem(downloadedItem, null); - return localassetmanager.addOrUpdateLocalItem(localItem).then(function() { - return Promise.resolve(localItem) - }, function(err) { - return console.error("mediasync: downloadItem failed: " + err.toString()), Promise.resolve(null) - }) - }) - } - - function ensureLocalPathParts(localItem, jobItem) { - if (!localItem.LocalPathParts) { - var libraryItem = localItem.Item, - parts = localassetmanager.getDirectoryPath(libraryItem); - parts.push(localassetmanager.getLocalFileName(libraryItem, jobItem.OriginalFileName)), localItem.LocalPathParts = parts - } - } - - function downloadMedia(apiClient, jobItem, localItem) { - console.debug("mediasync: downloadMedia: start."); - var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/File", { - api_key: apiClient.accessToken() - }); - return ensureLocalPathParts(localItem, jobItem), localassetmanager.downloadFile(url, localItem).then(function(result) { - console.debug("mediasync: downloadMedia-downloadFile returned path: " + result.path); - var localPath = result.path, - libraryItem = localItem.Item; - if (localPath && libraryItem.MediaSources) - for (var i = 0; i < libraryItem.MediaSources.length; i++) { - var mediaSource = libraryItem.MediaSources[i]; - mediaSource.Path = localPath, mediaSource.Protocol = "File" - } - return localItem.LocalPath = localPath, localItem.SyncStatus = "transferring", localassetmanager.addOrUpdateLocalItem(localItem).then(function() { - return afterMediaDownloaded(apiClient, jobItem, localItem).then(function() { - return result.isComplete ? (localItem.SyncStatus = "synced", reportTransfer(apiClient, localItem)) : Promise.resolve() - }, function(err) { - return console.debug("mediasync: downloadMedia: afterMediaDownloaded failed: " + err), Promise.reject(err) - }) - }, function(err) { - return console.debug("mediasync: downloadMedia: addOrUpdateLocalItem failed: " + err), Promise.reject(err) - }) - }, function(err) { - return console.debug("mediasync: downloadMedia: localassetmanager.downloadFile failed: " + err), Promise.reject(err) - }) - } - - function getImages(apiClient, jobItem, localItem) { - console.debug("mediasync: begin getImages"); - var p = Promise.resolve(), - libraryItem = localItem.Item, - serverId = libraryItem.ServerId, - mainImageTag = (libraryItem.ImageTags || {}).Primary; - libraryItem.Id && mainImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.Id, mainImageTag, "Primary") - })); - var logoImageTag = (libraryItem.ImageTags || {}).Logo; - libraryItem.Id && logoImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.Id, logoImageTag, "Logo") - })); - var artImageTag = (libraryItem.ImageTags || {}).Art; - libraryItem.Id && artImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.Id, artImageTag, "Art") - })); - var bannerImageTag = (libraryItem.ImageTags || {}).Banner; - libraryItem.Id && bannerImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.Id, bannerImageTag, "Banner") - })); - var thumbImageTag = (libraryItem.ImageTags || {}).Thumb; - if (libraryItem.Id && thumbImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.Id, thumbImageTag, "Thumb") - })), libraryItem.Id && libraryItem.BackdropImageTags) - for (var i = 0; i < libraryItem.BackdropImageTags.length; i++); - return libraryItem.SeriesId && libraryItem.SeriesPrimaryImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.SeriesId, libraryItem.SeriesPrimaryImageTag, "Primary") - })), libraryItem.SeriesId && libraryItem.SeriesThumbImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.SeriesId, libraryItem.SeriesThumbImageTag, "Thumb") - })), libraryItem.SeasonId && libraryItem.SeasonPrimaryImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.SeasonId, libraryItem.SeasonPrimaryImageTag, "Primary") - })), libraryItem.AlbumId && libraryItem.AlbumPrimaryImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.AlbumId, libraryItem.AlbumPrimaryImageTag, "Primary") - })), libraryItem.ParentThumbItemId && libraryItem.ParentThumbImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.ParentThumbItemId, libraryItem.ParentThumbImageTag, "Thumb") - })), libraryItem.ParentPrimaryImageItemId && libraryItem.ParentPrimaryImageTag && (p = p.then(function() { - return downloadImage(localItem, apiClient, serverId, libraryItem.ParentPrimaryImageItemId, libraryItem.ParentPrimaryImageTag, "Primary") - })), p.then(function() { - return console.debug("mediasync: finished getImages"), localassetmanager.addOrUpdateLocalItem(localItem) - }, function(err) { - return console.error("mediasync: error getImages: " + err.toString()), Promise.resolve() - }) - } - - function downloadImage(localItem, apiClient, serverId, itemId, imageTag, imageType, index) { - return index = index || 0, localassetmanager.hasImage(serverId, itemId, imageType, index).then(function(hasImage) { - if (hasImage) return console.debug("mediasync: downloadImage - skip existing: " + itemId + " " + imageType + "_" + index.toString()), Promise.resolve(); - var maxWidth = 400; - "backdrop" === imageType && (maxWidth = null); - var imageUrl = apiClient.getScaledImageUrl(itemId, { - tag: imageTag, - type: imageType, - maxWidth: maxWidth, - api_key: apiClient.accessToken() - }); - return console.debug("mediasync: downloadImage " + itemId + " " + imageType + "_" + index.toString()), localassetmanager.downloadImage(localItem, imageUrl, serverId, itemId, imageType, index).then(function(result) { - return Promise.resolve(result) - }, function(err) { - return console.error("mediasync: error downloadImage: " + err.toString()), Promise.resolve() - }) - }, function(err) { - return console.error("mediasync: error downloadImage: " + err.toString()), Promise.resolve() - }) - } - - function getSubtitles(apiClient, jobItem, localItem) { - if (console.debug("mediasync: begin getSubtitles"), !jobItem.Item.MediaSources.length) return console.debug("mediasync: cannot download subtitles because video has no media source info."), Promise.resolve(); - var files = jobItem.AdditionalFiles.filter(function(f) { - return "Subtitles" === f.Type - }), - mediaSource = jobItem.Item.MediaSources[0], - p = Promise.resolve(); - return files.forEach(function(file) { - p = p.then(function() { - return getItemSubtitle(file, apiClient, jobItem, localItem, mediaSource) - }) - }), p.then(function() { - return console.debug("mediasync: exit getSubtitles"), Promise.resolve() - }) - } - - function getItemSubtitle(file, apiClient, jobItem, localItem, mediaSource) { - console.debug("mediasync: begin getItemSubtitle"); - var subtitleStream = mediaSource.MediaStreams.filter(function(m) { - return "Subtitle" === m.Type && m.Index === file.Index - })[0]; - if (!subtitleStream) return console.debug("mediasync: cannot download subtitles because matching stream info was not found."), Promise.resolve(); - var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/AdditionalFiles", { - Name: file.Name, - api_key: apiClient.accessToken() - }), - fileName = localassetmanager.getSubtitleSaveFileName(localItem, jobItem.OriginalFileName, subtitleStream.Language, subtitleStream.IsForced, subtitleStream.Codec); - return localassetmanager.downloadSubtitles(url, fileName).then(function(subtitleResult) { - return localItem.AdditionalFiles && localItem.AdditionalFiles.forEach(function(item) { - item.Name === file.Name && (item.Path = subtitleResult.path) - }), subtitleStream.Path = subtitleResult.path, subtitleStream.DeliveryMethod = "External", localassetmanager.addOrUpdateLocalItem(localItem) - }) - } - - function checkLocalFileExistence(apiClient, serverInfo, options) { - return options.checkFileExistence ? (console.debug("mediasync: begin checkLocalFileExistence"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { - var completedItems = items.filter(function(item) { - return item && ("synced" === item.SyncStatus || "error" === item.SyncStatus) - }), - p = Promise.resolve(); - return completedItems.forEach(function(completedItem) { - p = p.then(function() { - return localassetmanager.fileExists(completedItem.LocalPath).then(function(exists) { - return exists ? Promise.resolve() : localassetmanager.removeLocalItem(completedItem).then(function() { - return Promise.resolve() - }, function() { - return Promise.resolve() - }) - }) - }) - }), p - })) : Promise.resolve() - } - return function() { - var self = this; - "string" == typeof webWorkerBaseUrl && -1 !== webWorkerBaseUrl.indexOf("ms-appx://") ? self.sync = function(apiClient, serverInfo, options) { - return console.debug("mediasync: start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { - return processDownloadStatus(apiClient, serverInfo, options).then(function() { - return localassetmanager.getDownloadItemCount().then(function(downloadCount) { - return !0 === options.syncCheckProgressOnly && downloadCount > 2 ? Promise.resolve() : reportOfflineActions(apiClient, serverInfo).then(function() { - return getNewMedia(apiClient, downloadCount).then(function() { - return syncData(apiClient, serverInfo).then(function() { - return console.debug("mediasync: Exit sync"), Promise.resolve() - }) - }) - }) - }) - }) - }, function(err) { - console.error(err.toString()) - }) - } : self.sync = function(apiClient, serverInfo, options) { - return console.debug("mediasync: Start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { - return syncData(apiClient, serverInfo).then(function() { - return processDownloadStatus(apiClient, serverInfo, options).then(function() { - return localassetmanager.getDownloadItemCount().then(function(downloadCount) { - return !0 === options.syncCheckProgressOnly && downloadCount > 2 ? Promise.resolve() : reportOfflineActions(apiClient, serverInfo).then(function() { - return getNewMedia(apiClient, downloadCount).then(function() { - return syncData(apiClient, serverInfo) - }) - }) - }) - }) - }) - }, function(err) { - console.error(err.toString()) - }) - } - } -}); diff --git a/src/libraries/apiclient/sync/multiserversync.js b/src/libraries/apiclient/sync/multiserversync.js deleted file mode 100644 index ff01a5ad1..000000000 --- a/src/libraries/apiclient/sync/multiserversync.js +++ /dev/null @@ -1,22 +0,0 @@ -define(["serversync"], function(ServerSync) { - "use strict"; - - function syncNext(connectionManager, servers, index, options, resolve, reject) { - var length = servers.length; - if (index >= length) return console.debug("MultiServerSync.sync complete"), void resolve(); - var server = servers[index]; - console.debug("Creating ServerSync to server: " + server.Id), (new ServerSync).sync(connectionManager, server, options).then(function() { - console.debug("ServerSync succeeded to server: " + server.Id), syncNext(connectionManager, servers, index + 1, options, resolve, reject) - }, function(err) { - console.error("ServerSync failed to server: " + server.Id + ". " + err), syncNext(connectionManager, servers, index + 1, options, resolve, reject) - }) - } - - function MultiServerSync() {} - return MultiServerSync.prototype.sync = function(connectionManager, options) { - return console.debug("MultiServerSync.sync starting..."), new Promise(function(resolve, reject) { - var servers = connectionManager.getSavedServers(); - syncNext(connectionManager, servers, 0, options, resolve, reject) - }) - }, MultiServerSync -}); diff --git a/src/libraries/apiclient/sync/serversync.js b/src/libraries/apiclient/sync/serversync.js deleted file mode 100644 index 887b829ce..000000000 --- a/src/libraries/apiclient/sync/serversync.js +++ /dev/null @@ -1,42 +0,0 @@ -define([], function() { - "use strict"; - - function performSync(connectionManager, server, options) { - console.debug("ServerSync.performSync to server: " + server.Id), options = options || {}; - var cameraUploadServers = options.cameraUploadServers || []; - console.debug("ServerSync cameraUploadServers: " + JSON.stringify(cameraUploadServers)); - var uploadPhotos = -1 !== cameraUploadServers.indexOf(server.Id); - return console.debug("ServerSync uploadPhotos: " + uploadPhotos), (uploadPhotos ? uploadContent(connectionManager, server, options) : Promise.resolve()).then(function() { - return syncMedia(connectionManager, server, options) - }) - } - - function uploadContent(connectionManager, server, options) { - return new Promise().reject(); - } - - function syncMedia(connectionManager, server, options) { - return new Promise(function(resolve, reject) { - require(["mediasync"], function(MediaSync) { - var apiClient = connectionManager.getApiClient(server.Id); - (new MediaSync).sync(apiClient, server, options).then(resolve, reject) - }) - }) - } - - function ServerSync() {} - return ServerSync.prototype.sync = function(connectionManager, server, options) { - if (!server.AccessToken && !server.ExchangeToken) return console.debug("Skipping sync to server " + server.Id + " because there is no saved authentication information."), Promise.resolve(); - var connectionOptions = { - updateDateLastAccessed: !1, - enableWebSocket: !1, - reportCapabilities: !1, - enableAutomaticBitrateDetection: !1 - }; - return connectionManager.connectToServer(server, connectionOptions).then(function(result) { - return "SignedIn" === result.State ? performSync(connectionManager, server, options) : (console.error("Unable to connect to server id: " + server.Id), Promise.reject()) - }, function(err) { - throw console.error("Unable to connect to server id: " + server.Id), err - }) - }, ServerSync -}); diff --git a/src/libraries/apiclient/sync/transfermanager.js b/src/libraries/apiclient/sync/transfermanager.js deleted file mode 100644 index d9889fffb..000000000 --- a/src/libraries/apiclient/sync/transfermanager.js +++ /dev/null @@ -1,30 +0,0 @@ -define([], function() { - "use strict"; - - function downloadFile(url, folder, localItem, imageUrl) { - return Promise.reject() - } - - function downloadSubtitles(url, folder, fileName) { - return Promise.reject() - } - - function downloadImage(url, folder, fileName) { - return Promise.reject() - } - - function resyncTransfers() { - return Promise.resolve() - } - - function getDownloadItemCount() { - return Promise.resolve(0) - } - return { - downloadFile: downloadFile, - downloadSubtitles: downloadSubtitles, - downloadImage: downloadImage, - resyncTransfers: resyncTransfers, - getDownloadItemCount: getDownloadItemCount - } -}); diff --git a/src/libraries/apiclient/sync/useractionrepository.js b/src/libraries/apiclient/sync/useractionrepository.js deleted file mode 100644 index 7b33ba1c3..000000000 --- a/src/libraries/apiclient/sync/useractionrepository.js +++ /dev/null @@ -1,108 +0,0 @@ -define([], function() { - "use strict"; - - function getDb(callback) { - var db = databaseInstance; - if (db) return void callback(db); - var request = indexedDB.open(dbName, dbVersion); - request.onerror = function(event) {}, request.onupgradeneeded = function(event) { - var db = event.target.result; - db.createObjectStore(dbName).transaction.oncomplete = function(event) { - callback(db) - } - }, request.onsuccess = function(event) { - var db = event.target.result; - callback(db) - } - } - - function getByServerId(serverId) { - return getAll().then(function(items) { - return items.filter(function(item) { - return item.ServerId === serverId - }) - }) - } - - function getAll() { - return new Promise(function(resolve, reject) { - getDb(function(db) { - var request, storeName = dbName, - transaction = db.transaction([storeName], "readonly"), - objectStore = transaction.objectStore(storeName); - if ("getAll" in objectStore) request = objectStore.getAll(null, 1e4), request.onsuccess = function(event) { - resolve(event.target.result) - }; - else { - var results = []; - request = objectStore.openCursor(), request.onsuccess = function(event) { - var cursor = event.target.result; - cursor ? (results.push(cursor.value), cursor.continue()) : resolve(results) - } - } - request.onerror = reject - }) - }) - } - - function get(key) { - return new Promise(function(resolve, reject) { - getDb(function(db) { - var storeName = dbName, - transaction = db.transaction([storeName], "readonly"), - objectStore = transaction.objectStore(storeName), - request = objectStore.get(key); - request.onerror = reject, request.onsuccess = function(event) { - resolve(request.result) - } - }) - }) - } - - function set(key, val) { - return new Promise(function(resolve, reject) { - getDb(function(db) { - var storeName = dbName, - transaction = db.transaction([storeName], "readwrite"), - objectStore = transaction.objectStore(storeName), - request = objectStore.put(val, key); - request.onerror = reject, request.onsuccess = resolve - }) - }) - } - - function remove(key) { - return new Promise(function(resolve, reject) { - getDb(function(db) { - var storeName = dbName, - transaction = db.transaction([storeName], "readwrite"), - objectStore = transaction.objectStore(storeName), - request = objectStore.delete(key); - request.onerror = reject, request.onsuccess = resolve - }) - }) - } - - function clear() { - return new Promise(function(resolve, reject) { - getDb(function(db) { - var storeName = dbName, - transaction = db.transaction([storeName], "readwrite"), - objectStore = transaction.objectStore(storeName), - request = objectStore.clear(); - request.onerror = reject, request.onsuccess = resolve - }) - }) - } - var databaseInstance, indexedDB = self.indexedDB || self.mozIndexedDB || self.webkitIndexedDB || self.msIndexedDB, - dbName = (self.IDBTransaction || self.webkitIDBTransaction || self.msIDBTransaction, self.IDBKeyRange || self.webkitIDBKeyRange || self.msIDBKeyRange, "useractions"), - dbVersion = 1; - return { - get: get, - set: set, - remove: remove, - clear: clear, - getAll: getAll, - getByServerId: getByServerId - } -}); diff --git a/src/libraries/navdrawer/navdrawer.js b/src/libraries/navdrawer/navdrawer.js index 9c15fbc18..d9c246b40 100644 --- a/src/libraries/navdrawer/navdrawer.js +++ b/src/libraries/navdrawer/navdrawer.js @@ -260,7 +260,6 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser, TouchMenuLA.prototype.showMask = function () { mask.classList.remove("hide"); - mask.offsetWidth; mask.classList.add("backdrop"); }; diff --git a/src/libraries/visibleinviewport.js b/src/libraries/visibleinviewport.js deleted file mode 100644 index a48dbd3a1..000000000 --- a/src/libraries/visibleinviewport.js +++ /dev/null @@ -1,41 +0,0 @@ -define(['dom'], function (dom) { - 'use strict'; - - /** - * Copyright 2012, Digital Fusion - * Licensed under the MIT license. - * http://teamdf.com/jquery-plugins/license/ - * - * @author Sam Sehnert - * @desc A small plugin that checks whether elements are within - * the user visible viewport of a web browser. - * only accounts for vertical position, not horizontal. - */ - function visibleInViewport(elem, partial, thresholdX, thresholdY) { - - thresholdX = thresholdX || 0; - thresholdY = thresholdY || 0; - - if (!elem.getBoundingClientRect) { - return true; - } - - var windowSize = dom.getWindowSize(); - - var vpWidth = windowSize.innerWidth; - var vpHeight = windowSize.innerHeight; - - // Use this native browser method, if available. - var rec = elem.getBoundingClientRect(); - var tViz = rec.top >= 0 && rec.top < vpHeight + thresholdY; - var bViz = rec.bottom > 0 && rec.bottom <= vpHeight + thresholdY; - var lViz = rec.left >= 0 && rec.left < vpWidth + thresholdX; - var rViz = rec.right > 0 && rec.right <= vpWidth + thresholdX; - var vVisible = partial ? tViz || bViz : tViz && bViz; - var hVisible = partial ? lViz || rViz : lViz && rViz; - - return vVisible && hVisible; - } - - return visibleInViewport; -}); diff --git a/src/library.html b/src/library.html index 398613f9e..1bca60724 100644 --- a/src/library.html +++ b/src/library.html @@ -6,7 +6,7 @@ ${ButtonScanAllLibraries} - ${Help} + ${Help}
diff --git a/src/list.html b/src/list.html index 48214df35..efac2d891 100644 --- a/src/list.html +++ b/src/list.html @@ -7,45 +7,45 @@ ${HeaderPlayAll}
diff --git a/src/livetv.html b/src/livetv.html index 9986529b7..fdf19bd91 100644 --- a/src/livetv.html +++ b/src/livetv.html @@ -7,7 +7,7 @@
@@ -16,7 +16,7 @@
@@ -25,7 +25,7 @@
@@ -34,7 +34,7 @@
@@ -43,7 +43,7 @@
@@ -52,7 +52,7 @@
@@ -63,7 +63,7 @@
- +
@@ -72,7 +72,7 @@
diff --git a/src/livetvsettings.html b/src/livetvsettings.html index 1b1557889..a3a43c792 100644 --- a/src/livetvsettings.html +++ b/src/livetvsettings.html @@ -4,7 +4,7 @@

DVR

- ${Help} + ${Help}
@@ -34,7 +34,7 @@
- +
${LabelRecordingPathHelp}
@@ -43,7 +43,7 @@
- +
@@ -51,7 +51,7 @@
- +
@@ -84,7 +84,7 @@
- +
diff --git a/src/livetvstatus.html b/src/livetvstatus.html index fc855f32b..3aa27637d 100644 --- a/src/livetvstatus.html +++ b/src/livetvstatus.html @@ -8,9 +8,9 @@ ${HeaderTunerDevices} - ${Help} + ${Help}
@@ -21,7 +21,7 @@

${HeaderGuideProviders}

diff --git a/src/livetvtuner.html b/src/livetvtuner.html index fecbda90a..f45a3a1d0 100644 --- a/src/livetvtuner.html +++ b/src/livetvtuner.html @@ -5,7 +5,7 @@

${HeaderLiveTvTunerSetup}

- ${Help} + ${Help}
@@ -24,7 +24,7 @@
- + diff --git a/src/movies.html b/src/movies.html index e552ca392..a2221c510 100644 --- a/src/movies.html +++ b/src/movies.html @@ -3,9 +3,9 @@
- - - + + +
@@ -46,8 +46,8 @@
- - + +
@@ -62,7 +62,7 @@
- +
@@ -74,9 +74,9 @@
- - - + + +
diff --git a/src/music.html b/src/music.html index 9a284a5f8..1e22ae9f3 100644 --- a/src/music.html +++ b/src/music.html @@ -37,11 +37,11 @@
- - - - - + + + + +
@@ -56,8 +56,8 @@
- - + +
@@ -72,8 +72,8 @@
- - + +
@@ -92,8 +92,8 @@
- - + +
diff --git a/src/mypreferencesmenu.html b/src/mypreferencesmenu.html index 4219059dd..2c3ca0edd 100644 --- a/src/mypreferencesmenu.html +++ b/src/mypreferencesmenu.html @@ -5,7 +5,7 @@

- person +
${ButtonProfile}
@@ -14,7 +14,7 @@
- tv +
${HeaderDisplay}
@@ -23,7 +23,7 @@
- home +
${HeaderHome}
@@ -32,7 +32,7 @@
- +
${TitlePlayback}
@@ -41,7 +41,7 @@
- +
${Subtitles}
@@ -50,7 +50,7 @@
- +
${ClientSettings}
@@ -61,7 +61,7 @@

${HeaderAdmin}

- dashboard +
${TabDashboard}
@@ -69,7 +69,7 @@
- +
${Metadata}
@@ -80,7 +80,7 @@

${HeaderUser}

- wifi +
${HeaderSelectServer}
@@ -88,7 +88,7 @@
- +
${ButtonSignOut}
diff --git a/src/networking.html b/src/networking.html index 1352e0ef5..cc824eaab 100644 --- a/src/networking.html +++ b/src/networking.html @@ -5,7 +5,7 @@
@@ -61,7 +61,7 @@
- +
${LabelCustomCertificatePathHelp}
diff --git a/src/notificationsetting.html b/src/notificationsetting.html index f982aa29c..67b35981f 100644 --- a/src/notificationsetting.html +++ b/src/notificationsetting.html @@ -8,7 +8,7 @@ diff --git a/src/nowplaying.html b/src/nowplaying.html index 6eaf0252f..5f235a562 100644 --- a/src/nowplaying.html +++ b/src/nowplaying.html @@ -31,27 +31,27 @@
@@ -59,21 +59,21 @@
@@ -86,43 +86,43 @@



@@ -164,10 +164,10 @@
diff --git a/src/scheduledtask.html b/src/scheduledtask.html index f5bd6550f..f88f6a04c 100644 --- a/src/scheduledtask.html +++ b/src/scheduledtask.html @@ -4,7 +4,7 @@ @@ -13,7 +13,7 @@

${HeaderTaskTriggers}

diff --git a/src/scripts/apploader.js b/src/scripts/apploader.js index 1ee74178b..0353c9535 100644 --- a/src/scripts/apploader.js +++ b/src/scripts/apploader.js @@ -1,12 +1,12 @@ (function() { - "use strict"; + 'use strict'; function injectScriptElement(src, onload) { if (!src) { return; } - var script = document.createElement("script"); + var script = document.createElement('script'); if (self.dashboardVersion) { src += `?v=${self.dashboardVersion}`; } @@ -21,10 +21,10 @@ function loadSite() { injectScriptElement( - "./libraries/alameda.js", + './libraries/alameda.js', function() { // onload of require library - injectScriptElement("./scripts/site.js"); + injectScriptElement('./scripts/site.js'); } ); } @@ -42,7 +42,7 @@ if (!self.Promise) { // Load Promise polyfill if they are not natively supported injectScriptElement( - "./libraries/npo.js", + './libraries/npo.js', loadSite ); } else { diff --git a/src/scripts/autobackdrops.js b/src/scripts/autobackdrops.js index fcc49d968..abd86c9db 100644 --- a/src/scripts/autobackdrops.js +++ b/src/scripts/autobackdrops.js @@ -1,5 +1,5 @@ -define(["backdrop", "userSettings", "libraryMenu"], function (backdrop, userSettings, libraryMenu) { - "use strict"; +define(['backdrop', 'userSettings', 'libraryMenu'], function (backdrop, userSettings, libraryMenu) { + 'use strict'; var cache = {}; @@ -8,7 +8,7 @@ define(["backdrop", "userSettings", "libraryMenu"], function (backdrop, userSett } function getBackdropItemIds(apiClient, userId, types, parentId) { - var key = `backdrops2_${userId + (types || "") + (parentId || "")}`; + var key = `backdrops2_${userId + (types || '') + (parentId || '')}`; var data = cache[key]; if (data) { @@ -18,11 +18,11 @@ define(["backdrop", "userSettings", "libraryMenu"], function (backdrop, userSett } var options = { - SortBy: "IsFavoriteOrLiked,Random", + SortBy: 'IsFavoriteOrLiked,Random', Limit: 20, Recursive: true, IncludeItemTypes: types, - ImageTypes: "Backdrop", + ImageTypes: 'Backdrop', ParentId: parentId, EnableTotalRecordCount: false }; @@ -56,17 +56,17 @@ define(["backdrop", "userSettings", "libraryMenu"], function (backdrop, userSett } } - pageClassOn("pageshow", "page", function () { + pageClassOn('pageshow', 'page', function () { var page = this; - if (!page.classList.contains("selfBackdropPage")) { - if (page.classList.contains("backdropPage")) { + if (!page.classList.contains('selfBackdropPage')) { + if (page.classList.contains('backdropPage')) { if (enabled()) { - var type = page.getAttribute("data-backdroptype"); - var parentId = page.classList.contains("globalBackdropPage") ? "" : libraryMenu.getTopParentId(); + var type = page.getAttribute('data-backdroptype'); + var parentId = page.classList.contains('globalBackdropPage') ? '' : libraryMenu.getTopParentId(); showBackdrop(type, parentId); } else { - page.classList.remove("backdropPage"); + page.classList.remove('backdropPage'); backdrop.clear(); } } else { diff --git a/src/scripts/browser.js b/src/scripts/browser.js index 8b21c8546..b1912862b 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -22,7 +22,7 @@ define([], function () { return true; } - if (userAgent.indexOf('webos') !== -1) { + if (userAgent.indexOf('web0s') !== -1) { return true; } @@ -53,45 +53,6 @@ define([], function () { return false; } - function isStyleSupported(prop, value) { - - if (typeof window === 'undefined') { - return false; - } - - // If no value is supplied, use "inherit" - value = arguments.length === 2 ? value : 'inherit'; - // Try the native standard method first - if ('CSS' in window && 'supports' in window.CSS) { - return window.CSS.supports(prop, value); - } - // Check Opera's native method - if ('supportsCSS' in window) { - return window.supportsCSS(prop, value); - } - - // need try/catch because it's failing on tizen - - try { - // Convert to camel-case for DOM interactions - var camel = prop.replace(/-([a-z]|[0-9])/ig, function (all, letter) { - return (letter + '').toUpperCase(); - }); - // Create test element - var el = document.createElement('div'); - // Check if the property is supported - var support = (camel in el.style); - // Assign the property and value to invoke - // the CSS interpreter - el.style.cssText = prop + ':' + value; - // Ensure both the property and value are - // supported and return - return support && (el.style[camel] !== ''); - } catch (err) { - return false; - } - } - function hasKeyboard(browser) { if (browser.touch) { @@ -185,7 +146,7 @@ define([], function () { /(safari)[ \/]([\w.]+)/.exec(ua) || /(firefox)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + ua.indexOf('compatible') < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || []; var versionMatch = /(version)[ \/]([\w.]+)/.exec(ua); @@ -196,17 +157,17 @@ define([], function () { /(android)/.exec(ua) || []; - var browser = match[1] || ""; + var browser = match[1] || ''; - if (browser === "edge") { - platform_match = [""]; + 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) { - browser = "msie"; + 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) { + browser = 'msie'; } } @@ -219,7 +180,7 @@ define([], function () { version = versionMatch[2]; } - version = version || match[2] || "0"; + version = version || match[2] || '0'; var versionMajor = parseInt(version.split('.')[0]); @@ -230,7 +191,7 @@ define([], function () { return { browser: browser, version: version, - platform: platform_match[0] || "", + platform: platform_match[0] || '', versionMajor: versionMajor }; }; @@ -250,11 +211,11 @@ define([], function () { 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; } @@ -283,10 +244,6 @@ define([], function () { browser.tv = isTv(); browser.operaTv = browser.tv && userAgent.toLowerCase().indexOf('opr/') !== -1; - if (!isStyleSupported('display', 'flex')) { - browser.noFlex = true; - } - if (browser.mobile || browser.tv) { browser.slow = true; } diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js index 570c0d2fa..2668f2091 100644 --- a/src/scripts/browserdeviceprofile.js +++ b/src/scripts/browserdeviceprofile.js @@ -311,9 +311,9 @@ define(['browser'], function (browser) { try { var isTizenUhd = webapis.productinfo.isUdPanelSupported(); isTizenFhd = !isTizenUhd; - console.debug("isTizenFhd = " + isTizenFhd); + console.debug('isTizenFhd = ' + isTizenFhd); } catch (error) { - console.error("isUdPanelSupported() error code = " + error.code); + console.error('isUdPanelSupported() error code = ' + error.code); } } @@ -334,6 +334,7 @@ define(['browser'], function (browser) { var canPlayVp8 = videoTestElement.canPlayType('video/webm; codecs="vp8"').replace(/no/, ''); var canPlayVp9 = videoTestElement.canPlayType('video/webm; codecs="vp9"').replace(/no/, ''); + var canPlayAv1 = videoTestElement.canPlayType('video/webm; codecs="av1"').replace(/no/, ''); var webmAudioCodecs = ['vorbis']; var canPlayMkv = testCanPlayMkv(videoTestElement); @@ -592,6 +593,15 @@ define(['browser'], function (browser) { }); } + if (canPlayAv1) { + profile.DirectPlayProfiles.push({ + Container: 'webm', + Type: 'Video', + AudioCodec: webmAudioCodecs.join(','), + VideoCodec: 'AV1' + }); + } + profile.TranscodingProfiles = []; var hlsBreakOnNonKeyFrames = browser.iOS || browser.osx || browser.edge || !canPlayNativeHls() ? true : false; @@ -887,6 +897,16 @@ define(['browser'], function (browser) { Method: 'External' }); } + if (options.enableSsaRender) { + profile.SubtitleProfiles.push({ + Format: 'ass', + Method: 'External' + }); + profile.SubtitleProfiles.push({ + Format: 'ssa', + Method: 'External' + }); + } profile.ResponseProfiles = []; profile.ResponseProfiles.push({ diff --git a/src/scripts/datetime.js b/src/scripts/datetime.js index 8a7666844..34ff23fe6 100644 --- a/src/scripts/datetime.js +++ b/src/scripts/datetime.js @@ -41,12 +41,12 @@ define(['globalize'], function (globalize) { } // 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; @@ -159,13 +159,13 @@ define(['globalize'], function (globalize) { var optionList = getOptionList(options); if (optionList.length === 1 && optionList[0].name === 'weekday') { var weekday = []; - weekday[0] = "Sun"; - weekday[1] = "Mon"; - weekday[2] = "Tue"; - weekday[3] = "Wed"; - weekday[4] = "Thu"; - weekday[5] = "Fri"; - weekday[6] = "Sat"; + weekday[0] = 'Sun'; + weekday[1] = 'Mon'; + weekday[2] = 'Tue'; + weekday[3] = 'Wed'; + weekday[4] = 'Thu'; + weekday[5] = 'Fri'; + weekday[6] = 'Sat'; return weekday[date.getDay()]; } diff --git a/src/scripts/dfnshelper.js b/src/scripts/dfnshelper.js index 3f82e6ba7..6ad2ee970 100644 --- a/src/scripts/dfnshelper.js +++ b/src/scripts/dfnshelper.js @@ -1,62 +1,62 @@ -import { ar, be, bg, ca, cs, da, de, el, enGB, enUS, es, faIR, fi, fr, frCA, he, hi, hr, hu, id, it, ja, kk, ko, lt, ms, nb, - nl, pl, ptBR, pt, ro, ru, sk, sl, sv, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale'; -import globalize from 'globalize'; - -const dateLocales = (locale) => ({ - 'ar': ar, - 'be-by': be, - 'bg-bg': bg, - 'ca': ca, - 'cs': cs, - 'da': da, - 'de': de, - 'el': el, - 'en-gb': enGB, - 'en-us': enUS, - 'es': es, - 'es-ar': es, - 'es-mx': es, - 'fa': faIR, - 'fi': fi, - 'fr': fr, - 'fr-ca': frCA, - 'gsw': de, - 'he': he, - 'hi-in': hi, - 'hr': hr, - 'hu': hu, - 'id': id, - 'it': it, - 'ja': ja, - 'kk': kk, - 'ko': ko, - 'lt-lt': lt, - 'ms': ms, - 'nb': nb, - 'nl': nl, - 'pl': pl, - 'pt-br': ptBR, - 'pt-pt': pt, - 'ro': ro, - 'ru': ru, - 'sk': sk, - 'sl-si': sl, - 'sv': sv, - 'tr': tr, - 'uk': uk, - 'vi': vi, - 'zh-cn': zhCN, - 'zh-hk': zhCN, - 'zh-tw': zhTW -})[locale]; - -export function getLocale() { - return dateLocales(globalize.getCurrentLocale()) || enUS; -} - -export const localeWithSuffix = { addSuffix: true, locale: getLocale() }; - -export default { - getLocale: getLocale, - localeWithSuffix: localeWithSuffix -}; +import { ar, be, bg, ca, cs, da, de, el, enGB, enUS, es, faIR, fi, fr, frCA, he, hi, hr, hu, id, it, ja, kk, ko, lt, ms, nb, + nl, pl, ptBR, pt, ro, ru, sk, sl, sv, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale'; +import globalize from 'globalize'; + +const dateLocales = (locale) => ({ + 'ar': ar, + 'be-by': be, + 'bg-bg': bg, + 'ca': ca, + 'cs': cs, + 'da': da, + 'de': de, + 'el': el, + 'en-gb': enGB, + 'en-us': enUS, + 'es': es, + 'es-ar': es, + 'es-mx': es, + 'fa': faIR, + 'fi': fi, + 'fr': fr, + 'fr-ca': frCA, + 'gsw': de, + 'he': he, + 'hi-in': hi, + 'hr': hr, + 'hu': hu, + 'id': id, + 'it': it, + 'ja': ja, + 'kk': kk, + 'ko': ko, + 'lt-lt': lt, + 'ms': ms, + 'nb': nb, + 'nl': nl, + 'pl': pl, + 'pt-br': ptBR, + 'pt-pt': pt, + 'ro': ro, + 'ru': ru, + 'sk': sk, + 'sl-si': sl, + 'sv': sv, + 'tr': tr, + 'uk': uk, + 'vi': vi, + 'zh-cn': zhCN, + 'zh-hk': zhCN, + 'zh-tw': zhTW +})[locale]; + +export function getLocale() { + return dateLocales(globalize.getCurrentLocale()) || enUS; +} + +export const localeWithSuffix = { addSuffix: true, locale: getLocale() }; + +export default { + getLocale: getLocale, + localeWithSuffix: localeWithSuffix +}; diff --git a/src/scripts/dom.js b/src/scripts/dom.js index a9ce5d53a..a3d157f33 100644 --- a/src/scripts/dom.js +++ b/src/scripts/dom.js @@ -93,7 +93,7 @@ supportsCaptureOption = true; } }); - window.addEventListener("test", null, opts); + window.addEventListener('test', null, opts); } catch (e) { console.debug('error checking capture support'); } @@ -158,7 +158,7 @@ if (!windowSizeEventsBound) { windowSizeEventsBound = true; - addEventListener(window, "orientationchange", clearWindowSize, { passive: true }); + addEventListener(window, 'orientationchange', clearWindowSize, { passive: true }); addEventListener(window, 'resize', clearWindowSize, { passive: true }); } } @@ -204,12 +204,12 @@ return _animationEvent; } - const el = document.createElement("div"); + const el = document.createElement('div'); const animations = { - "animation": "animationend", - "OAnimation": "oAnimationEnd", - "MozAnimation": "animationend", - "WebkitAnimation": "webkitAnimationEnd" + 'animation': 'animationend', + 'OAnimation': 'oAnimationEnd', + 'MozAnimation': 'animationend', + 'WebkitAnimation': 'webkitAnimationEnd' }; for (let t in animations) { if (el.style[t] !== undefined) { @@ -244,12 +244,12 @@ return _transitionEvent; } - const el = document.createElement("div"); + const el = document.createElement('div'); const transitions = { - "transition": "transitionend", - "OTransition": "oTransitionEnd", - "MozTransition": "transitionend", - "WebkitTransition": "webkitTransitionEnd" + 'transition': 'transitionend', + 'OTransition': 'oTransitionEnd', + 'MozTransition': 'transitionend', + 'WebkitTransition': 'webkitTransitionEnd' }; for (let t in transitions) { if (el.style[t] !== undefined) { diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index 5f874b328..ee7788407 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -1,5 +1,5 @@ -define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime, $, globalize) { - "use strict"; +define(['datetime', 'jQuery', 'globalize', 'material-icons'], function (datetime, $, globalize) { + 'use strict'; function getNode(item, folderState, selected) { var htmlName = getNodeInnerHtml(item); @@ -7,7 +7,7 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime id: item.Id, text: htmlName, state: { - opened: item.IsFolder && folderState == "open", + opened: item.IsFolder && folderState == 'open', selected: selected }, li_attr: { @@ -17,7 +17,7 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime }; if (item.IsFolder) { node.children = [{ - text: "Loading...", + text: 'Loading...', icon: false }]; node.icon = false; @@ -36,30 +36,30 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime function getNodeInnerHtml(item) { var name = item.Name; if (item.Number) { - name = item.Number + " - " + name; + name = item.Number + ' - ' + name; } - if (item.IndexNumber != null && item.Type != "Season") { - name = item.IndexNumber + " - " + name; + if (item.IndexNumber != null && item.Type != 'Season') { + name = item.IndexNumber + ' - ' + name; } var htmlName = "
"; if (item.IsFolder) { - htmlName += 'folder'; - } else if (item.MediaType === "Video") { - htmlName += 'movie'; - } else if (item.MediaType === "Audio") { - htmlName += 'audiotrack'; - } else if (item.Type === "TvChannel") { - htmlName += ''; - } else if (item.MediaType === "Photo") { - htmlName += 'photo'; - } else if (item.MediaType === "Book") { - htmlName += 'book'; + htmlName += ''; + } else if (item.MediaType === 'Video') { + htmlName += ''; + } else if (item.MediaType === 'Audio') { + htmlName += ''; + } else if (item.Type === 'TvChannel') { + htmlName += ''; + } else if (item.MediaType === 'Photo') { + htmlName += ''; + } else if (item.MediaType === 'Book') { + htmlName += ''; } if (item.LockData) { - htmlName += 'lock'; + htmlName += ''; } htmlName += name; - htmlName += "
"; + htmlName += '
'; return htmlName; } @@ -69,36 +69,36 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime }).then(function (result) { var nodes = []; nodes.push({ - id: "MediaFolders", - text: globalize.translate("HeaderMediaFolders"), + id: 'MediaFolders', + text: globalize.translate('HeaderMediaFolders'), state: { opened: true }, li_attr: { - itemtype: "mediafolders", + itemtype: 'mediafolders', loadedFromServer: true }, icon: false }); if (result.TotalRecordCount) { nodes.push({ - id: "livetv", - text: globalize.translate("HeaderLiveTV"), + id: 'livetv', + text: globalize.translate('HeaderLiveTV'), state: { opened: false }, li_attr: { - itemtype: "livetv" + itemtype: 'livetv' }, children: [{ - text: "Loading...", + text: 'Loading...', icon: false }], icon: false }); } callback.call(scope, nodes); - nodesToLoad.push("MediaFolders"); + nodesToLoad.push('MediaFolders'); }); } @@ -108,7 +108,7 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime AddCurrentProgram: false }).then(function (result) { var nodes = result.Items.map(function (i) { - var state = openItems.indexOf(i.Id) == -1 ? "closed" : "open"; + var state = openItems.indexOf(i.Id) == -1 ? 'closed' : 'open'; return getNode(i, state, false); }); callback(nodes); @@ -116,9 +116,9 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime } function loadMediaFolders(page, scope, openItems, callback) { - ApiClient.getJSON(ApiClient.getUrl("Library/MediaFolders")).then(function (result) { + ApiClient.getJSON(ApiClient.getUrl('Library/MediaFolders')).then(function (result) { var nodes = result.Items.map(function (n) { - var state = openItems.indexOf(n.Id) == -1 ? "closed" : "open"; + var state = openItems.indexOf(n.Id) == -1 ? 'closed' : 'open'; return getNode(n, state, false); }); callback.call(scope, nodes); @@ -132,21 +132,21 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime function loadNode(page, scope, node, openItems, selectedId, currentUser, callback) { var id = node.id; - if (id == "#") { + if (id == '#') { loadChildrenOfRootNode(page, scope, callback); return; } - if (id == "livetv") { + if (id == 'livetv') { loadLiveTvChannels(id, openItems, callback); return; } - if (id == "MediaFolders") { + if (id == 'MediaFolders') { loadMediaFolders(page, scope, openItems, callback); return; } var query = { ParentId: id, - Fields: "Settings", + Fields: 'Settings', IsVirtualUnaired: false, IsMissing: false, EnableTotalRecordCount: false, @@ -154,12 +154,12 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime EnableUserData: false }; var itemtype = node.li_attr.itemtype; - if (itemtype != "Season" && itemtype != "Series") { - query.SortBy = "SortName"; + if (itemtype != 'Season' && itemtype != 'Series') { + query.SortBy = 'SortName'; } ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { var nodes = result.Items.map(function (n) { - var state = openItems.indexOf(n.Id) == -1 ? "closed" : "open"; + var state = openItems.indexOf(n.Id) == -1 ? 'closed' : 'open'; return getNode(n, state, n.Id == selectedId); }); callback.call(scope, nodes); @@ -172,14 +172,14 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime } function scrollToNode(id) { - var elem = $("#" + id)[0]; + var elem = $('#' + id)[0]; if (elem) { elem.scrollIntoView(); } } function initializeTree(page, currentUser, openItems, selectedId) { - require(["jstree"], function () { + require(['jstree'], function () { initializeTreeInternal(page, currentUser, openItems, selectedId); }); } @@ -192,41 +192,41 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime serverItemType: node.li_attr.serveritemtype, collectionType: node.li_attr.collectiontype }; - if (eventData.itemType != "livetv" && eventData.itemType != "mediafolders") { + if (eventData.itemType != 'livetv' && eventData.itemType != 'mediafolders') { { - this.dispatchEvent(new CustomEvent("itemclicked", { + this.dispatchEvent(new CustomEvent('itemclicked', { detail: eventData, bubbles: true, cancelable: false })); } - document.querySelector(".editPageSidebar").classList.add("editPageSidebar-withcontent"); + document.querySelector('.editPageSidebar').classList.add('editPageSidebar-withcontent'); } else { - document.querySelector(".editPageSidebar").classList.remove("editPageSidebar-withcontent"); + document.querySelector('.editPageSidebar').classList.remove('editPageSidebar-withcontent'); } } function onNodeOpen(event, data) { - var page = $(this).parents(".page")[0]; + var page = $(this).parents('.page')[0]; var node = data.node; if (node.children && node.children) { loadNodesToLoad(page, node); } - if (node.li_attr && node.id != "#" && !node.li_attr.loadedFromServer) { + if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) { node.li_attr.loadedFromServer = true; - $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback); + $.jstree.reference('.libraryTree', page).load_node(node.id, loadNodeCallback); } } function onNodeLoad(event, data) { - var page = $(this).parents(".page")[0]; + var page = $(this).parents('.page')[0]; var node = data.node; if (node.children && node.children) { loadNodesToLoad(page, node); } - if (node.li_attr && node.id != "#" && !node.li_attr.loadedFromServer) { + if (node.li_attr && node.id != '#' && !node.li_attr.loadedFromServer) { node.li_attr.loadedFromServer = true; - $.jstree.reference(".libraryTree", page).load_node(node.id, loadNodeCallback); + $.jstree.reference('.libraryTree', page).load_node(node.id, loadNodeCallback); } } @@ -234,18 +234,18 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime nodesToLoad = []; selectedNodeId = null; $.jstree.destroy(); - $(".libraryTree", page).jstree({ - "plugins": ["wholerow"], + $('.libraryTree', page).jstree({ + 'plugins': ['wholerow'], core: { check_callback: true, data: function (node, callback) { loadNode(page, this, node, openItems, selectedId, currentUser, callback); }, themes: { - variant: "large" + variant: 'large' } } - }).off("select_node.jstree", onNodeSelect).on("select_node.jstree", onNodeSelect).off("open_node.jstree", onNodeOpen).on("open_node.jstree", onNodeOpen).off("load_node.jstree", onNodeLoad).on("load_node.jstree", onNodeLoad); + }).off('select_node.jstree', onNodeSelect).on('select_node.jstree', onNodeSelect).off('open_node.jstree', onNodeOpen).on('open_node.jstree', onNodeOpen).off('load_node.jstree', onNodeLoad).on('load_node.jstree', onNodeLoad); } function loadNodesToLoad(page, node) { @@ -256,7 +256,7 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime nodesToLoad = nodesToLoad.filter(function (n) { return n != child; }); - $.jstree.reference(".libraryTree", page).load_node(child, loadNodeCallback); + $.jstree.reference('.libraryTree', page).load_node(child, loadNodeCallback); } } } @@ -270,14 +270,14 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime } function updateEditorNode(page, item) { - var elem = $("#" + item.Id + ">a", page)[0]; + var elem = $('#' + item.Id + '>a', page)[0]; if (elem == null) { return; } - $(".editorNode", elem).remove(); + $('.editorNode', elem).remove(); $(elem).append(getNodeInnerHtml(item)); if (item.IsFolder) { - var tree = jQuery.jstree._reference(".libraryTree"); + var tree = jQuery.jstree._reference('.libraryTree'); var currentNode = tree._get_node(null, false); tree.refresh(currentNode); } @@ -292,15 +292,15 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime return itemId; } var url = window.location.hash || window.location.href; - return getParameterByName("id", url); + return getParameterByName('id', url); } var nodesToLoad = []; var selectedNodeId; - $(document).on("itemsaved", ".metadataEditorPage", function (e, item) { + $(document).on('itemsaved', '.metadataEditorPage', function (e, item) { updateEditorNode(this, item); - }).on("pagebeforeshow", ".metadataEditorPage", function () { - require(["css!assets/css/metadataeditor.css"]); - }).on("pagebeforeshow", ".metadataEditorPage", function () { + }).on('pagebeforeshow', '.metadataEditorPage', function () { + require(['css!assets/css/metadataeditor.css']); + }).on('pagebeforeshow', '.metadataEditorPage', function () { var page = this; Dashboard.getCurrentUser().then(function (user) { var id = getCurrentItemId(); @@ -315,9 +315,9 @@ define(["datetime", "jQuery", "globalize", "material-icons"], function (datetime initializeTree(page, user, []); } }); - }).on("pagebeforehide", ".metadataEditorPage", function () { + }).on('pagebeforehide', '.metadataEditorPage', function () { var page = this; - $(".libraryTree", page).off("select_node.jstree", onNodeSelect).off("open_node.jstree", onNodeOpen).off("load_node.jstree", onNodeLoad); + $('.libraryTree', page).off('select_node.jstree', onNodeSelect).off('open_node.jstree', onNodeOpen).off('load_node.jstree', onNodeLoad); }); var itemId; window.MetadataEditor = { diff --git a/src/scripts/gamepadtokey.js b/src/scripts/gamepadtokey.js index c2cf5005f..089e5c81e 100644 --- a/src/scripts/gamepadtokey.js +++ b/src/scripts/gamepadtokey.js @@ -20,7 +20,7 @@ // # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // # THE SOFTWARE. require(['apphost'], function (appHost) { - "use strict"; + 'use strict'; var _GAMEPAD_A_BUTTON_INDEX = 0; var _GAMEPAD_B_BUTTON_INDEX = 1; @@ -28,16 +28,16 @@ require(['apphost'], function (appHost) { var _GAMEPAD_DPAD_DOWN_BUTTON_INDEX = 13; var _GAMEPAD_DPAD_LEFT_BUTTON_INDEX = 14; var _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX = 15; - var _GAMEPAD_A_KEY = "GamepadA"; - var _GAMEPAD_B_KEY = "GamepadB"; - var _GAMEPAD_DPAD_UP_KEY = "GamepadDPadUp"; - var _GAMEPAD_DPAD_DOWN_KEY = "GamepadDPadDown"; - var _GAMEPAD_DPAD_LEFT_KEY = "GamepadDPadLeft"; - var _GAMEPAD_DPAD_RIGHT_KEY = "GamepadDPadRight"; - var _GAMEPAD_LEFT_THUMBSTICK_UP_KEY = "GamepadLeftThumbStickUp"; - var _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEY = "GamepadLeftThumbStickDown"; - var _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEY = "GamepadLeftThumbStickLeft"; - var _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEY = "GamepadLeftThumbStickRight"; + var _GAMEPAD_A_KEY = 'GamepadA'; + var _GAMEPAD_B_KEY = 'GamepadB'; + var _GAMEPAD_DPAD_UP_KEY = 'GamepadDPadUp'; + var _GAMEPAD_DPAD_DOWN_KEY = 'GamepadDPadDown'; + var _GAMEPAD_DPAD_LEFT_KEY = 'GamepadDPadLeft'; + var _GAMEPAD_DPAD_RIGHT_KEY = 'GamepadDPadRight'; + var _GAMEPAD_LEFT_THUMBSTICK_UP_KEY = 'GamepadLeftThumbStickUp'; + var _GAMEPAD_LEFT_THUMBSTICK_DOWN_KEY = 'GamepadLeftThumbStickDown'; + var _GAMEPAD_LEFT_THUMBSTICK_LEFT_KEY = 'GamepadLeftThumbStickLeft'; + var _GAMEPAD_LEFT_THUMBSTICK_RIGHT_KEY = 'GamepadLeftThumbStickRight'; var _GAMEPAD_A_KEYCODE = 0; var _GAMEPAD_B_KEYCODE = 27; var _GAMEPAD_DPAD_UP_KEYCODE = 38; @@ -234,7 +234,7 @@ require(['apphost'], function (appHost) { } if (fire && keyCode) { - raiseEvent("keydown", key, keyCode); + raiseEvent('keydown', key, keyCode); } } else if (newPressedState === false && oldPressedState === true) { @@ -243,7 +243,7 @@ require(['apphost'], function (appHost) { // button up if (keyCode) { - raiseEvent("keyup", key, keyCode); + raiseEvent('keyup', key, keyCode); } if (clickonKeyUp) { clickElement(document.activeElement || window); @@ -375,7 +375,7 @@ require(['apphost'], function (appHost) { function onFocusOrGamepadAttach(e) { /* eslint-disable-next-line compat/compat */ if (isGamepadConnected() && document.hasFocus()) { - console.log("Gamepad connected! Starting input loop"); + console.log('Gamepad connected! Starting input loop'); startInputLoop(); } } @@ -383,28 +383,28 @@ require(['apphost'], function (appHost) { function onFocusOrGamepadDetach(e) { /* eslint-disable-next-line compat/compat */ if (!isGamepadConnected() || !document.hasFocus()) { - console.log("Gamepad disconnected! No other gamepads are connected, stopping input loop"); + console.log('Gamepad disconnected! No other gamepads are connected, stopping input loop'); stopInputLoop(); } else { - console.log("Gamepad disconnected! There are gamepads still connected."); + console.log('Gamepad disconnected! There are gamepads still connected.'); } } // Event listeners for any change in gamepads' state. - window.addEventListener("gamepaddisconnected", onFocusOrGamepadDetach); - window.addEventListener("gamepadconnected", onFocusOrGamepadAttach); - window.addEventListener("blur", onFocusOrGamepadDetach); - window.addEventListener("focus", onFocusOrGamepadAttach); + window.addEventListener('gamepaddisconnected', onFocusOrGamepadDetach); + window.addEventListener('gamepadconnected', onFocusOrGamepadAttach); + window.addEventListener('blur', onFocusOrGamepadDetach); + window.addEventListener('focus', onFocusOrGamepadAttach); onFocusOrGamepadAttach(); // The gamepadInputEmulation is a string property that exists in JavaScript UWAs and in WebViews in UWAs. // It won't exist in Win8.1 style apps or browsers. - if (window.navigator && typeof window.navigator.gamepadInputEmulation === "string") { + if (window.navigator && typeof window.navigator.gamepadInputEmulation === 'string') { // We want the gamepad to provide gamepad VK keyboard events rather than moving a // mouse like cursor. Set to "keyboard", the gamepad will provide such keyboard events // and provide input to the DOM navigator.getGamepads API. - window.navigator.gamepadInputEmulation = "gamepad"; + window.navigator.gamepadInputEmulation = 'gamepad'; } }); diff --git a/src/scripts/imagehelper.js b/src/scripts/imagehelper.js index f1da17bf2..be3fd2834 100644 --- a/src/scripts/imagehelper.js +++ b/src/scripts/imagehelper.js @@ -3,73 +3,73 @@ import browser from 'browser'; export function getDeviceIcon(device) { - var baseUrl = "assets/img/devices/"; + var baseUrl = 'assets/img/devices/'; switch (device.AppName || device.Client) { - case "Samsung Smart TV": - return baseUrl + "samsung.svg"; - case "Xbox One": - return baseUrl + "xbox.svg"; - case "Sony PS4": - return baseUrl + "playstation.svg"; - case "Kodi": - return baseUrl + "kodi.svg"; - case "Jellyfin Android": - case "Android TV": - return baseUrl + "android.svg"; - case "Jellyfin Web": + case 'Samsung Smart TV': + return baseUrl + 'samsung.svg'; + case 'Xbox One': + return baseUrl + 'xbox.svg'; + case 'Sony PS4': + return baseUrl + 'playstation.svg'; + case 'Kodi': + return baseUrl + 'kodi.svg'; + case 'Jellyfin Android': + case 'Android TV': + return baseUrl + 'android.svg'; + case 'Jellyfin Web': switch (device.Name || device.DeviceName) { - case "Opera": - case "Opera TV": - case "Opera Android": - return baseUrl + "opera.svg"; - case "Chrome": - case "Chrome Android": - return baseUrl + "chrome.svg"; - case "Firefox": - case "Firefox Android": - return baseUrl + "firefox.svg"; - case "Safari": - case "Safari iPad": - case "Safari iPhone": - return baseUrl + "safari.svg"; - case "Edge": - return baseUrl + "edge.svg"; - case "Internet Explorer": - return baseUrl + "msie.svg"; + case 'Opera': + case 'Opera TV': + case 'Opera Android': + return baseUrl + 'opera.svg'; + case 'Chrome': + case 'Chrome Android': + return baseUrl + 'chrome.svg'; + case 'Firefox': + case 'Firefox Android': + return baseUrl + 'firefox.svg'; + case 'Safari': + case 'Safari iPad': + case 'Safari iPhone': + return baseUrl + 'safari.svg'; + case 'Edge': + return baseUrl + 'edge.svg'; + case 'Internet Explorer': + return baseUrl + 'msie.svg'; default: - return baseUrl + "html5.svg"; + return baseUrl + 'html5.svg'; } default: - return baseUrl + "other.svg"; + return baseUrl + 'other.svg'; } } export function getLibraryIcon(library) { switch (library) { - case "movies": - return "video_library"; - case "music": - return "library_music"; - case "photos": - return "photo_library"; - case "livetv": - return "live_tv"; - case "tvshows": - return "tv"; - case "trailers": - return "local_movies"; - case "homevideos": - return "photo_library"; - case "musicvideos": - return "music_video"; - case "books": - return "library_books"; - case "channels": - return "videocam"; - case "playlists": - return "view_list"; + case 'movies': + return 'video_library'; + case 'music': + return 'library_music'; + case 'photos': + return 'photo_library'; + case 'livetv': + return 'live_tv'; + case 'tvshows': + return 'tv'; + case 'trailers': + return 'local_movies'; + case 'homevideos': + return 'photo_library'; + case 'musicvideos': + return 'music_video'; + case 'books': + return 'library_books'; + case 'channels': + return 'videocam'; + case 'playlists': + return 'view_list'; default: - return "folder"; + return 'folder'; } } diff --git a/src/scripts/inputManager.js b/src/scripts/inputManager.js index d9dcf52d8..8af52c77e 100644 --- a/src/scripts/inputManager.js +++ b/src/scripts/inputManager.js @@ -74,7 +74,7 @@ import appHost from 'apphost'; } if (eventListenerCount) { - const customEvent = new CustomEvent("command", { + const customEvent = new CustomEvent('command', { detail: { command: commandName }, diff --git a/src/scripts/itembynamedetailpage.js b/src/scripts/itembynamedetailpage.js index 5ffacb220..44eca5558 100644 --- a/src/scripts/itembynamedetailpage.js +++ b/src/scripts/itembynamedetailpage.js @@ -1,105 +1,105 @@ -define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryBrowser", "globalize", "emby-itemscontainer", "emby-button"], function (connectionManager, listView, cardBuilder, imageLoader, libraryBrowser, globalize) { - "use strict"; +define(['connectionManager', 'listView', 'cardBuilder', 'imageLoader', 'libraryBrowser', 'globalize', 'emby-itemscontainer', 'emby-button'], function (connectionManager, listView, cardBuilder, imageLoader, libraryBrowser, globalize) { + 'use strict'; function renderItems(page, item) { var sections = []; if (item.ArtistCount) { sections.push({ - name: globalize.translate("TabArtists"), - type: "MusicArtist" + name: globalize.translate('TabArtists'), + type: 'MusicArtist' }); } - if (item.ProgramCount && "Person" == item.Type) { + if (item.ProgramCount && 'Person' == item.Type) { sections.push({ - name: globalize.translate("HeaderUpcomingOnTV"), - type: "Program" + name: globalize.translate('HeaderUpcomingOnTV'), + type: 'Program' }); } if (item.MovieCount) { sections.push({ - name: globalize.translate("TabMovies"), - type: "Movie" + name: globalize.translate('TabMovies'), + type: 'Movie' }); } if (item.SeriesCount) { sections.push({ - name: globalize.translate("TabShows"), - type: "Series" + name: globalize.translate('TabShows'), + type: 'Series' }); } if (item.EpisodeCount) { sections.push({ - name: globalize.translate("TabEpisodes"), - type: "Episode" + name: globalize.translate('TabEpisodes'), + type: 'Episode' }); } if (item.TrailerCount) { sections.push({ - name: globalize.translate("TabTrailers"), - type: "Trailer" + name: globalize.translate('TabTrailers'), + type: 'Trailer' }); } if (item.AlbumCount) { sections.push({ - name: globalize.translate("TabAlbums"), - type: "MusicAlbum" + name: globalize.translate('TabAlbums'), + type: 'MusicAlbum' }); } if (item.MusicVideoCount) { sections.push({ - name: globalize.translate("TabMusicVideos"), - type: "MusicVideo" + name: globalize.translate('TabMusicVideos'), + type: 'MusicVideo' }); } - var elem = page.querySelector("#childrenContent"); + var elem = page.querySelector('#childrenContent'); elem.innerHTML = sections.map(function (section) { - var html = ""; - var sectionClass = "verticalSection"; + var html = ''; + var sectionClass = 'verticalSection'; - if ("Audio" === section.type) { - sectionClass += " verticalSection-extrabottompadding"; + if ('Audio' === section.type) { + sectionClass += ' verticalSection-extrabottompadding'; } html += '
'; html += '
'; html += '

'; html += section.name; - html += "

"; - html += '"; - html += "
"; + html += ''; + html += ''; + html += '
'; html += '
'; - html += "
"; - return html += "
"; - }).join(""); - var sectionElems = elem.querySelectorAll(".verticalSection"); + html += '
'; + return html += '
'; + }).join(''); + var sectionElems = elem.querySelectorAll('.verticalSection'); for (var i = 0, length = sectionElems.length; i < length; i++) { - renderSection(page, item, sectionElems[i], sectionElems[i].getAttribute("data-type")); + renderSection(page, item, sectionElems[i], sectionElems[i].getAttribute('data-type')); } } function renderSection(page, item, element, type) { switch (type) { - case "Program": + case 'Program': loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Program", - PersonTypes: "", - ArtistIds: "", - AlbumArtistIds: "", + MediaTypes: '', + IncludeItemTypes: 'Program', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', Limit: 10, - SortBy: "StartDate" + SortBy: 'StartDate' }, { - shape: "overflowBackdrop", + shape: 'overflowBackdrop', showTitle: true, centerText: true, overlayMoreButton: true, @@ -111,17 +111,17 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB }); break; - case "Movie": + case 'Movie': loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Movie", - PersonTypes: "", - ArtistIds: "", - AlbumArtistIds: "", + MediaTypes: '', + IncludeItemTypes: 'Movie', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', Limit: 10, - SortBy: "SortName" + SortBy: 'SortName' }, { - shape: "overflowPortrait", + shape: 'overflowPortrait', showTitle: true, centerText: true, overlayMoreButton: true, @@ -130,68 +130,68 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB }); break; - case "MusicVideo": + case 'MusicVideo': loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "MusicVideo", - PersonTypes: "", - ArtistIds: "", - AlbumArtistIds: "", + MediaTypes: '', + IncludeItemTypes: 'MusicVideo', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', Limit: 10, - SortBy: "SortName" + SortBy: 'SortName' }, { - shape: "overflowPortrait", + shape: 'overflowPortrait', showTitle: true, centerText: true, overlayPlayButton: true }); break; - case "Trailer": + case 'Trailer': loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Trailer", - PersonTypes: "", - ArtistIds: "", - AlbumArtistIds: "", + MediaTypes: '', + IncludeItemTypes: 'Trailer', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', Limit: 10, - SortBy: "SortName" + SortBy: 'SortName' }, { - shape: "overflowPortrait", + shape: 'overflowPortrait', showTitle: true, centerText: true, overlayPlayButton: true }); break; - case "Series": + case 'Series': loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Series", - PersonTypes: "", - ArtistIds: "", - AlbumArtistIds: "", + MediaTypes: '', + IncludeItemTypes: 'Series', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', Limit: 10, - SortBy: "SortName" + SortBy: 'SortName' }, { - shape: "overflowPortrait", + shape: 'overflowPortrait', showTitle: true, centerText: true, overlayMoreButton: true }); break; - case "MusicAlbum": + case 'MusicAlbum': loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "MusicAlbum", - PersonTypes: "", - ArtistIds: "", - AlbumArtistIds: "", - SortOrder: "Descending", - SortBy: "ProductionYear,Sortname" + MediaTypes: '', + IncludeItemTypes: 'MusicAlbum', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + SortOrder: 'Descending', + SortBy: 'ProductionYear,Sortname' }, { - shape: "overflowSquare", + shape: 'overflowSquare', playFromHere: true, showTitle: true, showYear: true, @@ -201,17 +201,17 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB }); break; - case "MusicArtist": + case 'MusicArtist': loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "MusicArtist", - PersonTypes: "", - ArtistIds: "", - AlbumArtistIds: "", + MediaTypes: '', + IncludeItemTypes: 'MusicArtist', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', Limit: 8, - SortBy: "SortName" + SortBy: 'SortName' }, { - shape: "overflowSquare", + shape: 'overflowSquare', playFromHere: true, showTitle: true, showParentTitle: true, @@ -221,17 +221,17 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB }); break; - case "Episode": + case 'Episode': loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Episode", - PersonTypes: "", - ArtistIds: "", - AlbumArtistIds: "", + MediaTypes: '', + IncludeItemTypes: 'Episode', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', Limit: 6, - SortBy: "SortName" + SortBy: 'SortName' }, { - shape: "overflowBackdrop", + shape: 'overflowBackdrop', showTitle: true, showParentTitle: true, centerText: true, @@ -239,17 +239,17 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB }); break; - case "Audio": + case 'Audio': loadItems(element, item, type, { - MediaTypes: "", - IncludeItemTypes: "Audio", - PersonTypes: "", - ArtistIds: "", - AlbumArtistIds: "", - SortBy: "AlbumArtist,Album,SortName" + MediaTypes: '', + IncludeItemTypes: 'Audio', + PersonTypes: '', + ArtistIds: '', + AlbumArtistIds: '', + SortBy: 'AlbumArtist,Album,SortName' }, { playFromHere: true, - action: "playallfromhere", + action: 'playallfromhere', smallIcon: true, artist: true }); @@ -259,27 +259,27 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB function loadItems(element, item, type, query, listOptions) { query = getQuery(query, item); getItemsFunction(query, item)(query.StartIndex, query.Limit, query.Fields).then(function (result) { - var html = ""; + var html = ''; if (query.Limit && result.TotalRecordCount > query.Limit) { - var link = element.querySelector("a"); - link.classList.remove("hide"); - link.setAttribute("href", getMoreItemsHref(item, type)); + var link = element.querySelector('a'); + link.classList.remove('hide'); + link.setAttribute('href', getMoreItemsHref(item, type)); } else { - element.querySelector("a").classList.add("hide"); + element.querySelector('a').classList.add('hide'); } listOptions.items = result.Items; - var itemsContainer = element.querySelector(".itemsContainer"); + var itemsContainer = element.querySelector('.itemsContainer'); - if ("Audio" == type) { + if ('Audio' == type) { html = listView.getListViewHtml(listOptions); - itemsContainer.classList.remove("vertical-wrap"); - itemsContainer.classList.add("vertical-list"); + itemsContainer.classList.remove('vertical-wrap'); + itemsContainer.classList.add('vertical-list'); } else { html = cardBuilder.getCardsHtml(listOptions); - itemsContainer.classList.add("vertical-wrap"); - itemsContainer.classList.remove("vertical-list"); + itemsContainer.classList.add('vertical-wrap'); + itemsContainer.classList.remove('vertical-list'); } itemsContainer.innerHTML = html; @@ -288,51 +288,51 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB } function getMoreItemsHref(item, type) { - if ("Genre" == item.Type) { - return "list.html?type=" + type + "&genreId=" + item.Id + "&serverId=" + item.ServerId; + if ('Genre' == item.Type) { + return 'list.html?type=' + type + '&genreId=' + item.Id + '&serverId=' + item.ServerId; } - if ("MusicGenre" == item.Type) { - return "list.html?type=" + type + "&musicGenreId=" + item.Id + "&serverId=" + item.ServerId; + if ('MusicGenre' == item.Type) { + return 'list.html?type=' + type + '&musicGenreId=' + item.Id + '&serverId=' + item.ServerId; } - if ("Studio" == item.Type) { - return "list.html?type=" + type + "&studioId=" + item.Id + "&serverId=" + item.ServerId; + if ('Studio' == item.Type) { + return 'list.html?type=' + type + '&studioId=' + item.Id + '&serverId=' + item.ServerId; } - if ("MusicArtist" == item.Type) { - return "list.html?type=" + type + "&artistId=" + item.Id + "&serverId=" + item.ServerId; + if ('MusicArtist' == item.Type) { + return 'list.html?type=' + type + '&artistId=' + item.Id + '&serverId=' + item.ServerId; } - if ("Person" == item.Type) { - return "list.html?type=" + type + "&personId=" + item.Id + "&serverId=" + item.ServerId; + if ('Person' == item.Type) { + return 'list.html?type=' + type + '&personId=' + item.Id + '&serverId=' + item.ServerId; } - return "list.html?type=" + type + "&parentId=" + item.Id + "&serverId=" + item.ServerId; + return 'list.html?type=' + type + '&parentId=' + item.Id + '&serverId=' + item.ServerId; } function addCurrentItemToQuery(query, item) { - if (item.Type == "Person") { + if (item.Type == 'Person') { query.PersonIds = item.Id; - } else if (item.Type == "Genre") { + } else if (item.Type == 'Genre') { query.Genres = item.Name; - } else if (item.Type == "MusicGenre") { + } else if (item.Type == 'MusicGenre') { query.Genres = item.Name; - } else if (item.Type == "GameGenre") { + } else if (item.Type == 'GameGenre') { query.Genres = item.Name; - } else if (item.Type == "Studio") { + } else if (item.Type == 'Studio') { query.StudioIds = item.Id; - } else if (item.Type == "MusicArtist") { + } else if (item.Type == 'MusicArtist') { query.AlbumArtistIds = item.Id; } } function getQuery(options, item) { var query = { - SortOrder: "Ascending", - IncludeItemTypes: "", + SortOrder: 'Ascending', + IncludeItemTypes: '', Recursive: true, - Fields: "AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo", + Fields: 'AudioInfo,SeriesInfo,ParentId,PrimaryImageAspectRatio,BasicSyncInfo', Limit: 100, StartIndex: 0, CollapseBoxSetItems: false @@ -349,12 +349,12 @@ define(["connectionManager", "listView", "cardBuilder", "imageLoader", "libraryB query.Limit = limit; if (fields) { - query.Fields += "," + fields; + query.Fields += ',' + fields; } var apiClient = connectionManager.getApiClient(item.ServerId); - if ("MusicArtist" === query.IncludeItemTypes) { + if ('MusicArtist' === query.IncludeItemTypes) { query.IncludeItemTypes = null; return apiClient.getAlbumArtists(apiClient.getCurrentUserId(), query); } diff --git a/src/scripts/keyboardnavigation.js b/src/scripts/keyboardnavigation.js index a95b750b1..6664afed5 100644 --- a/src/scripts/keyboardnavigation.js +++ b/src/scripts/keyboardnavigation.js @@ -3,49 +3,49 @@ * @module components/input/keyboardnavigation */ -import inputManager from "inputManager"; -import layoutManager from "layoutManager"; +import inputManager from 'inputManager'; +import layoutManager from 'layoutManager'; /** * Key name mapping. */ const KeyNames = { - 13: "Enter", - 19: "Pause", - 27: "Escape", - 32: "Space", - 37: "ArrowLeft", - 38: "ArrowUp", - 39: "ArrowRight", - 40: "ArrowDown", + 13: 'Enter', + 19: 'Pause', + 27: 'Escape', + 32: 'Space', + 37: 'ArrowLeft', + 38: 'ArrowUp', + 39: 'ArrowRight', + 40: 'ArrowDown', // MediaRewind (Tizen/WebOS) - 412: "MediaRewind", + 412: 'MediaRewind', // MediaStop (Tizen/WebOS) - 413: "MediaStop", + 413: 'MediaStop', // MediaPlay (Tizen/WebOS) - 415: "MediaPlay", + 415: 'MediaPlay', // MediaFastForward (Tizen/WebOS) - 417: "MediaFastForward", + 417: 'MediaFastForward', // Back (WebOS) - 461: "Back", + 461: 'Back', // Back (Tizen) - 10009: "Back", + 10009: 'Back', // MediaTrackPrevious (Tizen) - 10232: "MediaTrackPrevious", + 10232: 'MediaTrackPrevious', // MediaTrackNext (Tizen) - 10233: "MediaTrackNext", + 10233: 'MediaTrackNext', // MediaPlayPause (Tizen) - 10252: "MediaPlayPause" + 10252: 'MediaPlayPause' }; /** * Keys used for keyboard navigation. */ -const NavigationKeys = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"]; +const NavigationKeys = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']; let hasFieldKey = false; try { - hasFieldKey = "key" in new KeyboardEvent("keydown"); + hasFieldKey = 'key' in new KeyboardEvent('keydown'); } catch (e) { console.error("error checking 'key' field"); } @@ -78,7 +78,7 @@ export function isNavigationKey(key) { } export function enable() { - document.addEventListener("keydown", function (e) { + document.addEventListener('keydown', function (e) { const key = getKeyName(e); // Ignore navigation keys for non-TV @@ -89,54 +89,54 @@ export function enable() { let capture = true; switch (key) { - case "ArrowLeft": - inputManager.handle("left"); + case 'ArrowLeft': + inputManager.handle('left'); break; - case "ArrowUp": - inputManager.handle("up"); + case 'ArrowUp': + inputManager.handle('up'); break; - case "ArrowRight": - inputManager.handle("right"); + case 'ArrowRight': + inputManager.handle('right'); break; - case "ArrowDown": - inputManager.handle("down"); + case 'ArrowDown': + inputManager.handle('down'); break; - case "Back": - inputManager.handle("back"); + case 'Back': + inputManager.handle('back'); break; - case "Escape": + case 'Escape': if (layoutManager.tv) { - inputManager.handle("back"); + inputManager.handle('back'); } else { capture = false; } break; - case "MediaPlay": - inputManager.handle("play"); + case 'MediaPlay': + inputManager.handle('play'); break; - case "Pause": - inputManager.handle("pause"); + case 'Pause': + inputManager.handle('pause'); break; - case "MediaPlayPause": - inputManager.handle("playpause"); + case 'MediaPlayPause': + inputManager.handle('playpause'); break; - case "MediaRewind": - inputManager.handle("rewind"); + case 'MediaRewind': + inputManager.handle('rewind'); break; - case "MediaFastForward": - inputManager.handle("fastforward"); + case 'MediaFastForward': + inputManager.handle('fastforward'); break; - case "MediaStop": - inputManager.handle("stop"); + case 'MediaStop': + inputManager.handle('stop'); break; - case "MediaTrackPrevious": - inputManager.handle("previoustrack"); + case 'MediaTrackPrevious': + inputManager.handle('previoustrack'); break; - case "MediaTrackNext": - inputManager.handle("nexttrack"); + case 'MediaTrackNext': + inputManager.handle('nexttrack'); break; default: @@ -144,7 +144,7 @@ export function enable() { } if (capture) { - console.debug("disabling default event handling"); + console.debug('disabling default event handling'); e.preventDefault(); } }); @@ -153,14 +153,14 @@ export function enable() { // Gamepad initialisation. No script is required if no gamepads are present at init time, saving a bit of resources. // Whenever the gamepad is connected, we hand all the control of the gamepad to gamepadtokey.js by removing the event handler function attachGamepadScript(e) { - console.log("Gamepad connected! Attaching gamepadtokey.js script"); - window.removeEventListener("gamepadconnected", attachGamepadScript); - require(["scripts/gamepadtokey"]); + console.log('Gamepad connected! Attaching gamepadtokey.js script'); + window.removeEventListener('gamepadconnected', attachGamepadScript); + require(['scripts/gamepadtokey']); } // No need to check for gamepads manually at load time, the eventhandler will be fired for that if (navigator.getGamepads) { /* eslint-disable-line compat/compat */ - window.addEventListener("gamepadconnected", attachGamepadScript); + window.addEventListener('gamepadconnected', attachGamepadScript); } export default { diff --git a/src/scripts/librarybrowser.js b/src/scripts/librarybrowser.js index 9f8ec00ad..f9e5e2359 100644 --- a/src/scripts/librarybrowser.js +++ b/src/scripts/librarybrowser.js @@ -1,9 +1,9 @@ -define(["userSettings", "globalize"], function (userSettings, globalize) { - "use strict"; +define(['userSettings', 'globalize'], function (userSettings, globalize) { + 'use strict'; var libraryBrowser = { getSavedQueryKey: function (modifier) { - return window.location.href.split("#")[0] + (modifier || ""); + return window.location.href.split('#')[0] + (modifier || ''); }, loadSavedQueryValues: function (key, query) { var values = userSettings.get(key); @@ -29,34 +29,34 @@ define(["userSettings", "globalize"], function (userSettings, globalize) { userSettings.set(key, JSON.stringify(values)); }, saveViewSetting: function (key, value) { - userSettings.set(key + "-_view", value); + userSettings.set(key + '-_view', value); }, getSavedView: function (key) { - return userSettings.get(key + "-_view"); + return userSettings.get(key + '-_view'); }, showLayoutMenu: function (button, currentLayout, views) { var dispatchEvent = true; if (!views) { dispatchEvent = false; - views = button.getAttribute("data-layouts"); - views = views ? views.split(",") : ["List", "Poster", "PosterCard", "Thumb", "ThumbCard"]; + views = button.getAttribute('data-layouts'); + views = views ? views.split(',') : ['List', 'Poster', 'PosterCard', 'Thumb', 'ThumbCard']; } var menuItems = views.map(function (v) { return { - name: globalize.translate("Option" + v), + name: globalize.translate('Option' + v), id: v, selected: currentLayout == v }; }); - require(["actionsheet"], function (actionsheet) { + require(['actionsheet'], function (actionsheet) { actionsheet.show({ items: menuItems, positionTo: button, callback: function (id) { - button.dispatchEvent(new CustomEvent("layoutchange", { + button.dispatchEvent(new CustomEvent('layoutchange', { detail: { viewStyle: id }, @@ -66,7 +66,7 @@ define(["userSettings", "globalize"], function (userSettings, globalize) { if (!dispatchEvent) { if (window.$) { - $(button).trigger("layoutchange", [id]); + $(button).trigger('layoutchange', [id]); } } } @@ -77,49 +77,49 @@ define(["userSettings", "globalize"], function (userSettings, globalize) { var startIndex = options.startIndex; var limit = options.limit; var totalRecordCount = options.totalRecordCount; - var html = ""; + var html = ''; var recordsEnd = Math.min(startIndex + limit, totalRecordCount); var showControls = limit < totalRecordCount; if (html += '
', showControls) { html += ''; - html += globalize.translate("ListPaging", (totalRecordCount ? startIndex + 1 : 0), recordsEnd, totalRecordCount); - html += ""; + html += globalize.translate('ListPaging', (totalRecordCount ? startIndex + 1 : 0), recordsEnd, totalRecordCount); + html += ''; } if (showControls || options.viewButton || options.filterButton || options.sortButton || options.addLayoutButton) { html += '
'; if (showControls) { - html += ''; - html += ''; + html += ''; + html += ''; } if (options.addLayoutButton) { - html += ''; + html += ''; } if (options.sortButton) { - html += ''; + html += ''; } if (options.filterButton) { - html += ''; + html += ''; } - html += "
"; + html += '
'; } - return html += "
"; + return html += '
'; }, showSortMenu: function (options) { - require(["dialogHelper", "emby-radio"], function (dialogHelper) { + require(['dialogHelper', 'emby-radio'], function (dialogHelper) { function onSortByChange() { var newValue = this.value; if (this.checked) { var changed = options.query.SortBy != newValue; - options.query.SortBy = newValue.replace("_", ","); + options.query.SortBy = newValue.replace('_', ','); options.query.StartIndex = 0; if (options.callback && changed) { @@ -148,48 +148,48 @@ define(["userSettings", "globalize"], function (userSettings, globalize) { entryAnimationDuration: 160, exitAnimationDuration: 200 }); - dlg.classList.add("ui-body-a"); - dlg.classList.add("background-theme-a"); - dlg.classList.add("formDialog"); - var html = ""; + dlg.classList.add('ui-body-a'); + dlg.classList.add('background-theme-a'); + dlg.classList.add('formDialog'); + var html = ''; html += '
'; html += '

'; - html += globalize.translate("HeaderSortBy"); - html += "

"; + html += globalize.translate('HeaderSortBy'); + html += ''; var i; var length; var isChecked; html += '
'; for (i = 0, length = options.items.length; i < length; i++) { var option = options.items[i]; - var radioValue = option.id.replace(",", "_"); - isChecked = (options.query.SortBy || "").replace(",", "_") == radioValue ? " checked" : ""; - html += '"; + var radioValue = option.id.replace(',', '_'); + isChecked = (options.query.SortBy || '').replace(',', '_') == radioValue ? ' checked' : ''; + html += ''; } - html += "
"; + html += '
'; html += '

'; - html += globalize.translate("HeaderSortOrder"); - html += "

"; - html += "
"; - isChecked = "Ascending" == options.query.SortOrder ? " checked" : ""; - html += '"; - isChecked = "Descending" == options.query.SortOrder ? " checked" : ""; - html += '"; - html += "
"; - html += "
"; + html += globalize.translate('HeaderSortOrder'); + html += ''; + html += '
'; + isChecked = 'Ascending' == options.query.SortOrder ? ' checked' : ''; + html += ''; + isChecked = 'Descending' == options.query.SortOrder ? ' checked' : ''; + html += ''; + html += '
'; + html += '
'; dlg.innerHTML = html; dialogHelper.open(dlg); - var sortBys = dlg.querySelectorAll(".menuSortBy"); + var sortBys = dlg.querySelectorAll('.menuSortBy'); for (i = 0, length = sortBys.length; i < length; i++) { - sortBys[i].addEventListener("change", onSortByChange); + sortBys[i].addEventListener('change', onSortByChange); } - var sortOrders = dlg.querySelectorAll(".menuSortOrder"); + var sortOrders = dlg.querySelectorAll('.menuSortOrder'); for (i = 0, length = sortOrders.length; i < length; i++) { - sortOrders[i].addEventListener("change", onSortOrderChange); + sortOrders[i].addEventListener('change', onSortOrderChange); } }); } diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 79c4c09e7..81a381bff 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -1,35 +1,35 @@ -define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "viewManager", "libraryBrowser", "appRouter", "apphost", "playbackManager", "browser", "globalize", "scripts/imagehelper", "paper-icon-button-light", "material-icons", "scrollStyles", "flexStyles"], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, browser, globalize, imageHelper) { - "use strict"; +define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', 'viewManager', 'libraryBrowser', 'appRouter', 'apphost', 'playbackManager', 'browser', 'globalize', 'scripts/imagehelper', 'paper-icon-button-light', 'material-icons', 'scrollStyles', 'flexStyles'], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, browser, globalize, imageHelper) { + 'use strict'; function renderHeader() { - var html = ""; + var html = ''; html += '
'; html += '
'; - html += ''; - html += ''; - html += ''; + html += ''; + html += ''; + html += ''; html += '

'; - html += "
"; + html += '
'; html += '
'; html += ''; - html += ''; - html += ''; - html += ''; - html += ''; - html += "
"; - html += "
"; + html += ''; + html += ''; + html += ''; + html += ''; + html += '
'; + html += '
'; html += '
'; - html += "
"; + html += '
'; - skinHeader.classList.add("skinHeader-withBackground"); - skinHeader.classList.add("skinHeader-blurred"); + skinHeader.classList.add('skinHeader-withBackground'); + skinHeader.classList.add('skinHeader-blurred'); skinHeader.innerHTML = html; - headerHomeButton = skinHeader.querySelector(".headerHomeButton"); - headerUserButton = skinHeader.querySelector(".headerUserButton"); - headerCastButton = skinHeader.querySelector(".headerCastButton"); - headerAudioPlayerButton = skinHeader.querySelector(".headerAudioPlayerButton"); - headerSearchButton = skinHeader.querySelector(".headerSearchButton"); + headerHomeButton = skinHeader.querySelector('.headerHomeButton'); + headerUserButton = skinHeader.querySelector('.headerUserButton'); + headerCastButton = skinHeader.querySelector('.headerCastButton'); + headerAudioPlayerButton = skinHeader.querySelector('.headerAudioPlayerButton'); + headerSearchButton = skinHeader.querySelector('.headerSearchButton'); lazyLoadViewMenuBarImages(); bindMenuEvents(); @@ -44,7 +44,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function lazyLoadViewMenuBarImages() { - require(["imageLoader"], function (imageLoader) { + require(['imageLoader'], function (imageLoader) { imageLoader.lazyChildren(skinHeader); }); } @@ -63,9 +63,9 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " hasImage = true; } - headerUserButton.classList.remove("hide"); + headerUserButton.classList.remove('hide'); } else { - headerUserButton.classList.add("hide"); + headerUserButton.classList.add('hide'); } if (!hasImage) { @@ -74,22 +74,22 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " if (user && user.localUser) { if (headerHomeButton) { - headerHomeButton.classList.remove("hide"); + headerHomeButton.classList.remove('hide'); } if (headerSearchButton) { - headerSearchButton.classList.remove("hide"); + headerSearchButton.classList.remove('hide'); } if (!layoutManager.tv) { - headerCastButton.classList.remove("hide"); + headerCastButton.classList.remove('hide'); } } else { - headerHomeButton.classList.add("hide"); - headerCastButton.classList.add("hide"); + headerHomeButton.classList.add('hide'); + headerCastButton.classList.add('hide'); if (headerSearchButton) { - headerSearchButton.classList.add("hide"); + headerSearchButton.classList.add('hide'); } } @@ -98,24 +98,24 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " function updateHeaderUserButton(src) { if (src) { - headerUserButton.classList.add("headerUserButtonRound"); + headerUserButton.classList.add('headerUserButtonRound'); headerUserButton.innerHTML = '
"; } else { - headerUserButton.classList.remove("headerUserButtonRound"); - headerUserButton.innerHTML = 'person'; + headerUserButton.classList.remove('headerUserButtonRound'); + headerUserButton.innerHTML = ''; } } function showSearch() { - inputManager.trigger("search"); + inputManager.trigger('search'); } function onHeaderUserButtonClick(e) { - Dashboard.navigate("mypreferencesmenu.html"); + Dashboard.navigate('mypreferencesmenu.html'); } function onHeaderHomeButtonClick() { - Dashboard.navigate("home.html"); + Dashboard.navigate('home.html'); } function showAudioPlayer() { @@ -123,30 +123,30 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function bindMenuEvents() { - mainDrawerButton = document.querySelector(".mainDrawerButton"); + mainDrawerButton = document.querySelector('.mainDrawerButton'); if (mainDrawerButton) { - mainDrawerButton.addEventListener("click", toggleMainDrawer); + mainDrawerButton.addEventListener('click', toggleMainDrawer); } - var headerBackButton = skinHeader.querySelector(".headerBackButton"); + var headerBackButton = skinHeader.querySelector('.headerBackButton'); if (headerBackButton) { - headerBackButton.addEventListener("click", onBackClick); + headerBackButton.addEventListener('click', onBackClick); } if (headerSearchButton) { - headerSearchButton.addEventListener("click", showSearch); + headerSearchButton.addEventListener('click', showSearch); } - headerUserButton.addEventListener("click", onHeaderUserButtonClick); - headerHomeButton.addEventListener("click", onHeaderHomeButtonClick); + headerUserButton.addEventListener('click', onHeaderUserButtonClick); + headerHomeButton.addEventListener('click', onHeaderHomeButtonClick); if (!layoutManager.tv) { - headerCastButton.addEventListener("click", onCastButtonClicked); + headerCastButton.addEventListener('click', onCastButtonClicked); } - headerAudioPlayerButton.addEventListener("click", showAudioPlayer); + headerAudioPlayerButton.addEventListener('click', showAudioPlayer); if (layoutManager.mobile) { initHeadRoom(skinHeader); @@ -157,22 +157,22 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " function onPlaybackStart(e) { if (playbackManager.isPlayingAudio() && layoutManager.tv) { - headerAudioPlayerButton.classList.remove("hide"); + headerAudioPlayerButton.classList.remove('hide'); } else { - headerAudioPlayerButton.classList.add("hide"); + headerAudioPlayerButton.classList.add('hide'); } } function onPlaybackStop(e, stopInfo) { if (stopInfo.nextMediaType != 'Audio') { - headerAudioPlayerButton.classList.add("hide"); + headerAudioPlayerButton.classList.add('hide'); } } function onCastButtonClicked() { var btn = this; - require(["playerSelectionMenu"], function (playerSelectionMenu) { + require(['playerSelectionMenu'], function (playerSelectionMenu) { playerSelectionMenu.show(btn); }); } @@ -198,7 +198,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " function onMainDrawerOpened() { if (layoutManager.mobile) { - document.body.classList.add("bodyWithPopupOpen"); + document.body.classList.add('bodyWithPopupOpen'); } } @@ -210,63 +210,63 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " if (navDrawerInstance.isVisible) { onMainDrawerOpened(); } else { - document.body.classList.remove("bodyWithPopupOpen"); + document.body.classList.remove('bodyWithPopupOpen'); } } function refreshLibraryInfoInDrawer(user, drawer) { - var html = ""; + var html = ''; html += '
'; - html += 'home' + globalize.translate("ButtonHome") + ""; + html += '' + globalize.translate('ButtonHome') + ''; // libraries are added here html += '
'; - html += "
"; + html += '
'; if (user.localUser && user.localUser.Policy.IsAdministrator) { html += '
'; html += '

'; - html += globalize.translate("HeaderAdmin"); - html += "

"; - html += 'dashboard' + globalize.translate("TabDashboard") + ""; - html += '' + globalize.translate("Metadata") + ""; - html += "
"; + html += globalize.translate('HeaderAdmin'); + html += ''; + html += '' + globalize.translate('TabDashboard') + ''; + html += '' + globalize.translate('Metadata') + ''; + html += '
'; } if (user.localUser) { html += '
'; html += '

'; - html += globalize.translate("HeaderUser"); - html += "

"; + html += globalize.translate('HeaderUser'); + html += ''; - if (appHost.supports("multiserver")) { - html += 'wifi' + globalize.translate("ButtonSelectServer") + ""; + if (appHost.supports('multiserver')) { + html += '' + globalize.translate('ButtonSelectServer') + ''; } - html += '' + globalize.translate("ButtonSettings") + ""; - html += '' + globalize.translate("ButtonSignOut") + ""; - html += "
"; + html += '' + globalize.translate('ButtonSettings') + ''; + html += '' + globalize.translate('ButtonSignOut') + ''; + html += '
'; } // add buttons to navigation drawer navDrawerScrollContainer.innerHTML = html; - var btnSettings = navDrawerScrollContainer.querySelector(".btnSettings"); + var btnSettings = navDrawerScrollContainer.querySelector('.btnSettings'); if (btnSettings) { - btnSettings.addEventListener("click", onSettingsClick); + btnSettings.addEventListener('click', onSettingsClick); } - var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout"); + var btnLogout = navDrawerScrollContainer.querySelector('.btnLogout'); if (btnLogout) { - btnLogout.addEventListener("click", onLogoutClick); + btnLogout.addEventListener('click', onLogoutClick); } } function refreshDashboardInfoInDrawer(apiClient) { - currentDrawerType = "admin"; + currentDrawerType = 'admin'; loadNavDrawer(); - if (navDrawerScrollContainer.querySelector(".adminDrawerLogo")) { + if (navDrawerScrollContainer.querySelector('.adminDrawerLogo')) { updateDashboardMenuSelectedItem(); } else { createDashboardMenu(apiClient); @@ -278,145 +278,145 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function updateDashboardMenuSelectedItem() { - var links = navDrawerScrollContainer.querySelectorAll(".navMenuOption"); + var links = navDrawerScrollContainer.querySelectorAll('.navMenuOption'); var currentViewId = viewManager.currentView().id; for (var i = 0, length = links.length; i < length; i++) { var link = links[i]; var selected = false; - var pageIds = link.getAttribute("data-pageids"); + var pageIds = link.getAttribute('data-pageids'); if (pageIds) { - pageIds = pageIds.split("|"); + pageIds = pageIds.split('|'); selected = -1 != pageIds.indexOf(currentViewId); } - var pageUrls = link.getAttribute("data-pageurls"); + var pageUrls = link.getAttribute('data-pageurls'); if (pageUrls) { - pageUrls = pageUrls.split("|"); + pageUrls = pageUrls.split('|'); selected = pageUrls.filter(isUrlInCurrentView).length > 0; } if (selected) { - link.classList.add("navMenuOption-selected"); - var title = ""; - link = link.querySelector("span") || link; + link.classList.add('navMenuOption-selected'); + var title = ''; + link = link.querySelector('.navMenuOptionText') || link; title += (link.innerText || link.textContent).trim(); LibraryMenu.setTitle(title); } else { - link.classList.remove("navMenuOption-selected"); + link.classList.remove('navMenuOption-selected'); } } } function createToolsMenuList(pluginItems) { var links = [{ - name: globalize.translate("TabServer") + name: globalize.translate('TabServer') }, { - name: globalize.translate("TabDashboard"), - href: "dashboard.html", - pageIds: ["dashboardPage"], - icon: "dashboard" + name: globalize.translate('TabDashboard'), + href: 'dashboard.html', + pageIds: ['dashboardPage'], + icon: 'dashboard' }, { - name: globalize.translate("General"), - href: "dashboardgeneral.html", - pageIds: ["dashboardGeneralPage"], - icon: "settings" + name: globalize.translate('General'), + href: 'dashboardgeneral.html', + pageIds: ['dashboardGeneralPage'], + icon: 'settings' }, { - name: globalize.translate("TabUsers"), - href: "userprofiles.html", - pageIds: ["userProfilesPage", "newUserPage", "editUserPage", "userLibraryAccessPage", "userParentalControlPage", "userPasswordPage"], - icon: "people" + name: globalize.translate('TabUsers'), + href: 'userprofiles.html', + pageIds: ['userProfilesPage', 'newUserPage', 'editUserPage', 'userLibraryAccessPage', 'userParentalControlPage', 'userPasswordPage'], + icon: 'people' }, { - name: globalize.translate("HeaderLibraries"), - href: "library.html", - pageIds: ["mediaLibraryPage", "librarySettingsPage", "libraryDisplayPage", "metadataImagesConfigurationPage", "metadataNfoPage"], - icon: "folder" + name: globalize.translate('HeaderLibraries'), + href: 'library.html', + pageIds: ['mediaLibraryPage', 'librarySettingsPage', 'libraryDisplayPage', 'metadataImagesConfigurationPage', 'metadataNfoPage'], + icon: 'folder' }, { - name: globalize.translate("TabPlayback"), - icon: "", - href: "encodingsettings.html", - pageIds: ["encodingSettingsPage", "playbackConfigurationPage", "streamingSettingsPage"] + name: globalize.translate('TabPlayback'), + icon: 'play_arrow', + href: 'encodingsettings.html', + pageIds: ['encodingSettingsPage', 'playbackConfigurationPage', 'streamingSettingsPage'] }]; - addPluginPagesToMainMenu(links, pluginItems, "server"); + addPluginPagesToMainMenu(links, pluginItems, 'server'); links.push({ divider: true, - name: globalize.translate("TabDevices") + name: globalize.translate('TabDevices') }); links.push({ - name: globalize.translate("TabDevices"), - href: "devices.html", - pageIds: ["devicesPage", "devicePage"], - icon: "devices" + name: globalize.translate('TabDevices'), + href: 'devices.html', + pageIds: ['devicesPage', 'devicePage'], + icon: 'devices' }); links.push({ - name: globalize.translate("HeaderActivity"), - href: "serveractivity.html", - pageIds: ["serverActivityPage"], - icon: "assessment" + name: globalize.translate('HeaderActivity'), + href: 'serveractivity.html', + pageIds: ['serverActivityPage'], + icon: 'assessment' }); links.push({ - name: globalize.translate("DLNA"), - href: "dlnasettings.html", - pageIds: ["dlnaSettingsPage", "dlnaProfilesPage", "dlnaProfilePage"], - icon: "input" + name: globalize.translate('DLNA'), + href: 'dlnasettings.html', + pageIds: ['dlnaSettingsPage', 'dlnaProfilesPage', 'dlnaProfilePage'], + icon: 'input' }); links.push({ divider: true, - name: globalize.translate("TabLiveTV") + name: globalize.translate('TabLiveTV') }); links.push({ - name: globalize.translate("TabLiveTV"), - href: "livetvstatus.html", - pageIds: ["liveTvStatusPage", "liveTvTunerPage"], - icon: "live_tv" + name: globalize.translate('TabLiveTV'), + href: 'livetvstatus.html', + pageIds: ['liveTvStatusPage', 'liveTvTunerPage'], + icon: 'live_tv' }); links.push({ - name: globalize.translate("DVR"), - href: "livetvsettings.html", - pageIds: ["liveTvSettingsPage"], - icon: "dvr" + name: globalize.translate('DVR'), + href: 'livetvsettings.html', + pageIds: ['liveTvSettingsPage'], + icon: 'dvr' }); links.push({ divider: true, - name: globalize.translate("TabAdvanced") + name: globalize.translate('TabAdvanced') }); links.push({ - name: globalize.translate("TabNetworking"), - icon: "cloud", - href: "networking.html", - pageIds: ["networkingPage"] + name: globalize.translate('TabNetworking'), + icon: 'cloud', + href: 'networking.html', + pageIds: ['networkingPage'] }); links.push({ - name: globalize.translate("HeaderApiKeys"), - icon: "vpn_key", - href: "apikeys.html", - pageIds: ["apiKeysPage"] + name: globalize.translate('HeaderApiKeys'), + icon: 'vpn_key', + href: 'apikeys.html', + pageIds: ['apiKeysPage'] }); links.push({ - name: globalize.translate("TabLogs"), - href: "log.html", - pageIds: ["logPage"], - icon: "bug_report" + name: globalize.translate('TabLogs'), + href: 'log.html', + pageIds: ['logPage'], + icon: 'bug_report' }); links.push({ - name: globalize.translate("TabNotifications"), - icon: "notifications", - href: "notificationsettings.html", - pageIds: ["notificationSettingsPage", "notificationSettingPage"] + name: globalize.translate('TabNotifications'), + icon: 'notifications', + href: 'notificationsettings.html', + pageIds: ['notificationSettingsPage', 'notificationSettingPage'] }); links.push({ - name: globalize.translate("TabPlugins"), - icon: "shopping_cart", - href: "installedplugins.html", - pageIds: ["pluginsPage", "pluginCatalogPage"] + name: globalize.translate('TabPlugins'), + icon: 'shopping_cart', + href: 'installedplugins.html', + pageIds: ['pluginsPage', 'pluginCatalogPage'] }); links.push({ - name: globalize.translate("TabScheduledTasks"), - href: "scheduledtasks.html", - pageIds: ["scheduledTasksPage", "scheduledTaskPage"], - icon: "schedule" + name: globalize.translate('TabScheduledTasks'), + href: 'scheduledtasks.html', + pageIds: ['scheduledTasksPage', 'scheduledTaskPage'], + icon: 'schedule' }); addPluginPagesToMainMenu(links, pluginItems); return links; @@ -429,7 +429,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " if (pluginItem.EnableInMainMenu && pluginItem.MenuSection === section) { links.push({ name: pluginItem.DisplayName, - icon: pluginItem.MenuIcon || "folder", + icon: pluginItem.MenuIcon || 'folder', href: Dashboard.getConfigurationPageUrl(pluginItem.Name), pageUrls: [Dashboard.getConfigurationPageUrl(pluginItem.Name)] }); @@ -438,33 +438,33 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function getToolsMenuLinks(apiClient) { - return apiClient.getJSON(apiClient.getUrl("web/configurationpages") + "?pageType=PluginConfiguration&EnableInMainMenu=true").then(createToolsMenuList, function (err) { + return apiClient.getJSON(apiClient.getUrl('web/configurationpages') + '?pageType=PluginConfiguration&EnableInMainMenu=true').then(createToolsMenuList, function (err) { return createToolsMenuList([]); }); } function getToolsLinkHtml(item) { - var menuHtml = ""; - var pageIds = item.pageIds ? item.pageIds.join("|") : ""; - pageIds = pageIds ? ' data-pageids="' + pageIds + '"' : ""; - var pageUrls = item.pageUrls ? item.pageUrls.join("|") : ""; - pageUrls = pageUrls ? ' data-pageurls="' + pageUrls + '"' : ""; - menuHtml += '"; + var menuHtml = ''; + var pageIds = item.pageIds ? item.pageIds.join('|') : ''; + pageIds = pageIds ? ' data-pageids="' + pageIds + '"' : ''; + var pageUrls = item.pageUrls ? item.pageUrls.join('|') : ''; + pageUrls = pageUrls ? ' data-pageurls="' + pageUrls + '"' : ''; + menuHtml += ''; if (item.icon) { - menuHtml += '' + item.icon + ""; + menuHtml += ''; } menuHtml += ''; menuHtml += item.name; - menuHtml += ""; - return menuHtml + ""; + menuHtml += ''; + return menuHtml + ''; } function getToolsMenuHtml(apiClient) { return getToolsMenuLinks(apiClient).then(function (items) { var item; - var menuHtml = ""; + var menuHtml = ''; menuHtml += '
'; for (var i = 0; i < items.length; i++) { @@ -475,20 +475,20 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } else if (item.name) { menuHtml += '

'; menuHtml += item.name; - menuHtml += "

"; + menuHtml += ''; } } - return menuHtml + "
"; + return menuHtml + '
'; }); } function createDashboardMenu(apiClient) { return getToolsMenuHtml(apiClient).then(function (toolsMenuHtml) { - var html = ""; + var html = ''; html += '"; + html += ''; html += toolsMenuHtml; navDrawerScrollContainer.innerHTML = html; updateDashboardMenuSelectedItem(); @@ -496,7 +496,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function onSidebarLinkClick() { - var section = this.getElementsByClassName("sectionName")[0]; + var section = this.getElementsByClassName('sectionName')[0]; var text = section ? section.innerHTML : this.innerHTML; LibraryMenu.setTitle(text); } @@ -510,14 +510,14 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var view = items[i]; list.push(view); - if ("livetv" == view.CollectionType) { + if ('livetv' == view.CollectionType) { view.ImageTags = {}; - view.icon = "live_tv"; + view.icon = 'live_tv'; var guideView = Object.assign({}, view); - guideView.Name = globalize.translate("ButtonGuide"); + guideView.Name = globalize.translate('ButtonGuide'); guideView.ImageTags = {}; - guideView.icon = "dvr"; - guideView.url = "livetv.html?tab=1"; + guideView.icon = 'dvr'; + guideView.url = 'livetv.html?tab=1'; list.push(guideView); } } @@ -531,9 +531,9 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " if (elem) { if (show) { - elem.classList.remove("hide"); + elem.classList.remove('hide'); } else { - elem.classList.add("hide"); + elem.classList.add('hide'); } } } @@ -542,35 +542,35 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " // FIXME: Potential equivalent might be // showBySelector(".lnkSyncToOtherDevices", !!user.Policy.EnableContentDownloading); if (!user) { - showBySelector(".libraryMenuDownloads", false); - showBySelector(".lnkSyncToOtherDevices", false); - return void showBySelector(".userMenuOptions", false); + showBySelector('.libraryMenuDownloads', false); + showBySelector('.lnkSyncToOtherDevices', false); + return void showBySelector('.userMenuOptions', false); } // FIXME: Potentially the same as above if (user.Policy.EnableContentDownloading) { - showBySelector(".lnkSyncToOtherDevices", true); + showBySelector('.lnkSyncToOtherDevices', true); } else { - showBySelector(".lnkSyncToOtherDevices", false); + showBySelector('.lnkSyncToOtherDevices', false); } - if (user.Policy.EnableContentDownloading && appHost.supports("sync")) { - showBySelector(".libraryMenuDownloads", true); + if (user.Policy.EnableContentDownloading && appHost.supports('sync')) { + showBySelector('.libraryMenuDownloads', true); } else { - showBySelector(".libraryMenuDownloads", false); + showBySelector('.libraryMenuDownloads', false); } var userId = Dashboard.getCurrentUserId(); var apiClient = getCurrentApiClient(); - var libraryMenuOptions = document.querySelector(".libraryMenuOptions"); + var libraryMenuOptions = document.querySelector('.libraryMenuOptions'); if (libraryMenuOptions) { getUserViews(apiClient, userId).then(function (result) { var items = result; - var html = ""; + var html = ''; html += '

'; - html += globalize.translate("HeaderMedia"); - html += "

"; + html += globalize.translate('HeaderMedia'); + html += ''; html += items.map(function (i) { var icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType); var itemId = i.Id; @@ -579,32 +579,32 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " i.onclick; } - return '' + icon + '' + i.Name + ""; - }).join(""); + return '' + i.Name + ''; + }).join(''); libraryMenuOptions.innerHTML = html; var elem = libraryMenuOptions; - var sidebarLinks = elem.querySelectorAll(".navMenuOption"); + var sidebarLinks = elem.querySelectorAll('.navMenuOption'); for (var i = 0, length = sidebarLinks.length; i < length; i++) { - sidebarLinks[i].removeEventListener("click", onSidebarLinkClick); - sidebarLinks[i].addEventListener("click", onSidebarLinkClick); + sidebarLinks[i].removeEventListener('click', onSidebarLinkClick); + sidebarLinks[i].addEventListener('click', onSidebarLinkClick); } }); } } function getTopParentId() { - return getParameterByName("topParentId") || null; + return getParameterByName('topParentId') || null; } function onMainDrawerClick(e) { - if (dom.parentWithTag(e.target, "A")) { + if (dom.parentWithTag(e.target, 'A')) { setTimeout(closeMainDrawer, 30); } } function onSettingsClick() { - Dashboard.navigate("mypreferencesmenu.html"); + Dashboard.navigate('mypreferencesmenu.html'); } function onLogoutClick() { @@ -614,47 +614,49 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " function updateCastIcon() { var context = document; var info = playbackManager.getPlayerInfo(); - var icon = headerCastButton.querySelector("i"); + var icon = headerCastButton.querySelector('.material-icons'); + + icon.classList.remove('cast_connected', 'cast'); if (info && !info.isLocalPlayer) { - icon.innerHTML = ""; - headerCastButton.classList.add("castButton-active"); - context.querySelector(".headerSelectedPlayer").innerHTML = info.deviceName || info.name; + icon.classList.add('cast_connected'); + headerCastButton.classList.add('castButton-active'); + context.querySelector('.headerSelectedPlayer').innerHTML = info.deviceName || info.name; } else { - icon.innerHTML = "cast"; - headerCastButton.classList.remove("castButton-active"); - context.querySelector(".headerSelectedPlayer").innerHTML = ""; + icon.classList.add('cast'); + headerCastButton.classList.remove('castButton-active'); + context.querySelector('.headerSelectedPlayer').innerHTML = ''; } } function updateLibraryNavLinks(page) { var i; var length; - var isLiveTvPage = page.classList.contains("liveTvPage"); - var isChannelsPage = page.classList.contains("channelsPage"); - var isEditorPage = page.classList.contains("metadataEditorPage"); - var isMySyncPage = page.classList.contains("mySyncPage"); - var id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains("allLibraryPage") ? "" : getTopParentId() || ""; - var elems = document.getElementsByClassName("lnkMediaFolder"); + var isLiveTvPage = page.classList.contains('liveTvPage'); + var isChannelsPage = page.classList.contains('channelsPage'); + var isEditorPage = page.classList.contains('metadataEditorPage'); + var isMySyncPage = page.classList.contains('mySyncPage'); + var id = isLiveTvPage || isChannelsPage || isEditorPage || isMySyncPage || page.classList.contains('allLibraryPage') ? '' : getTopParentId() || ''; + var elems = document.getElementsByClassName('lnkMediaFolder'); for (var i = 0, length = elems.length; i < length; i++) { var lnkMediaFolder = elems[i]; - var itemId = lnkMediaFolder.getAttribute("data-itemid"); + var itemId = lnkMediaFolder.getAttribute('data-itemid'); - if (isChannelsPage && "channels" === itemId) { - lnkMediaFolder.classList.add("navMenuOption-selected"); - } else if (isLiveTvPage && "livetv" === itemId) { - lnkMediaFolder.classList.add("navMenuOption-selected"); - } else if (isEditorPage && "editor" === itemId) { - lnkMediaFolder.classList.add("navMenuOption-selected"); - } else if (isMySyncPage && "manageoffline" === itemId && -1 != window.location.href.toString().indexOf("mode=download")) { - lnkMediaFolder.classList.add("navMenuOption-selected"); - } else if (isMySyncPage && "syncotherdevices" === itemId && -1 == window.location.href.toString().indexOf("mode=download")) { - lnkMediaFolder.classList.add("navMenuOption-selected"); + if (isChannelsPage && 'channels' === itemId) { + lnkMediaFolder.classList.add('navMenuOption-selected'); + } else if (isLiveTvPage && 'livetv' === itemId) { + lnkMediaFolder.classList.add('navMenuOption-selected'); + } else if (isEditorPage && 'editor' === itemId) { + lnkMediaFolder.classList.add('navMenuOption-selected'); + } else if (isMySyncPage && 'manageoffline' === itemId && -1 != window.location.href.toString().indexOf('mode=download')) { + lnkMediaFolder.classList.add('navMenuOption-selected'); + } else if (isMySyncPage && 'syncotherdevices' === itemId && -1 == window.location.href.toString().indexOf('mode=download')) { + lnkMediaFolder.classList.add('navMenuOption-selected'); } else if (id && itemId == id) { - lnkMediaFolder.classList.add("navMenuOption-selected"); + lnkMediaFolder.classList.add('navMenuOption-selected'); } else { - lnkMediaFolder.classList.remove("navMenuOption-selected"); + lnkMediaFolder.classList.remove('navMenuOption-selected'); } } } @@ -666,34 +668,34 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " currentPageType = newPageType; if (isDashboardPage && !layoutManager.mobile) { - skinHeader.classList.add("headroomDisabled"); + skinHeader.classList.add('headroomDisabled'); } else { - skinHeader.classList.remove("headroomDisabled"); + skinHeader.classList.remove('headroomDisabled'); } var bodyClassList = document.body.classList; if (isLibraryPage) { - bodyClassList.add("libraryDocument"); - bodyClassList.remove("dashboardDocument"); - bodyClassList.remove("hideMainDrawer"); + bodyClassList.add('libraryDocument'); + bodyClassList.remove('dashboardDocument'); + bodyClassList.remove('hideMainDrawer'); if (navDrawerInstance) { navDrawerInstance.setEdgeSwipeEnabled(true); } } else { if (isDashboardPage) { - bodyClassList.remove("libraryDocument"); - bodyClassList.add("dashboardDocument"); - bodyClassList.remove("hideMainDrawer"); + bodyClassList.remove('libraryDocument'); + bodyClassList.add('dashboardDocument'); + bodyClassList.remove('hideMainDrawer'); if (navDrawerInstance) { navDrawerInstance.setEdgeSwipeEnabled(true); } } else { - bodyClassList.remove("libraryDocument"); - bodyClassList.remove("dashboardDocument"); - bodyClassList.add("hideMainDrawer"); + bodyClassList.remove('libraryDocument'); + bodyClassList.remove('dashboardDocument'); + bodyClassList.add('hideMainDrawer'); if (navDrawerInstance) { navDrawerInstance.setEdgeSwipeEnabled(false); @@ -708,31 +710,31 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " } function updateTitle(page) { - var title = page.getAttribute("data-title"); + var title = page.getAttribute('data-title'); if (title) { LibraryMenu.setTitle(title); - } else if (page.classList.contains("standalonePage")) { + } else if (page.classList.contains('standalonePage')) { LibraryMenu.setDefaultTitle(); } } function updateBackButton(page) { if (!headerBackButton) { - headerBackButton = document.querySelector(".headerBackButton"); + headerBackButton = document.querySelector('.headerBackButton'); } if (headerBackButton) { - if ("false" !== page.getAttribute("data-backbutton") && appRouter.canGoBack()) { - headerBackButton.classList.remove("hide"); + if ('false' !== page.getAttribute('data-backbutton') && appRouter.canGoBack()) { + headerBackButton.classList.remove('hide'); } else { - headerBackButton.classList.add("hide"); + headerBackButton.classList.add('hide'); } } } function initHeadRoom(elem) { - require(["headroom"], function (Headroom) { + require(['headroom'], function (Headroom) { var headroom = new Headroom(elem); headroom.init(); }); @@ -740,7 +742,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " function refreshLibraryDrawer(user) { loadNavDrawer(); - currentDrawerType = "library"; + currentDrawerType = 'library'; if (user) { Promise.resolve(user); @@ -768,15 +770,15 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " return Promise.resolve(navDrawerInstance); } - navDrawerElement = document.querySelector(".mainDrawer"); - navDrawerScrollContainer = navDrawerElement.querySelector(".scrollContainer"); - navDrawerScrollContainer.addEventListener("click", onMainDrawerClick); + navDrawerElement = document.querySelector('.mainDrawer'); + navDrawerScrollContainer = navDrawerElement.querySelector('.scrollContainer'); + navDrawerScrollContainer.addEventListener('click', onMainDrawerClick); return new Promise(function (resolve, reject) { - require(["navdrawer"], function (navdrawer) { + require(['navdrawer'], function (navdrawer) { navDrawerInstance = new navdrawer(getNavDrawerOptions()); if (!layoutManager.tv) { - navDrawerElement.classList.remove("hide"); + navDrawerElement.classList.remove('hide'); } resolve(navDrawerInstance); @@ -798,7 +800,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var headerSearchButton; var headerAudioPlayerButton; var enableLibraryNavDrawer = layoutManager.desktop; - var skinHeader = document.querySelector(".skinHeader"); + var skinHeader = document.querySelector('.skinHeader'); var requiresUserRefresh = true; var lastOpenTime = new Date().getTime(); window.LibraryMenu = { @@ -807,7 +809,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " toggleMainDrawer(); }, setTabs: function (type, selectedIndex, builder) { - require(["mainTabsManager"], function (mainTabsManager) { + require(['mainTabsManager'], function (mainTabsManager) { if (type) { mainTabsManager.setTabs(viewManager.currentView(), selectedIndex, builder, function () { return []; @@ -819,79 +821,79 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " }, setDefaultTitle: function () { if (!pageTitleElement) { - pageTitleElement = document.querySelector(".pageTitle"); + pageTitleElement = document.querySelector('.pageTitle'); } if (pageTitleElement) { - pageTitleElement.classList.add("pageTitleWithLogo"); - pageTitleElement.classList.add("pageTitleWithDefaultLogo"); + pageTitleElement.classList.add('pageTitleWithLogo'); + pageTitleElement.classList.add('pageTitleWithDefaultLogo'); pageTitleElement.style.backgroundImage = null; - pageTitleElement.innerHTML = ""; + pageTitleElement.innerHTML = ''; } - document.title = "Jellyfin"; + document.title = 'Jellyfin'; }, setTitle: function (title) { if (null == title) { return void LibraryMenu.setDefaultTitle(); } - if ("-" === title) { - title = ""; + if ('-' === title) { + title = ''; } var html = title; if (!pageTitleElement) { - pageTitleElement = document.querySelector(".pageTitle"); + pageTitleElement = document.querySelector('.pageTitle'); } if (pageTitleElement) { - pageTitleElement.classList.remove("pageTitleWithLogo"); - pageTitleElement.classList.remove("pageTitleWithDefaultLogo"); + pageTitleElement.classList.remove('pageTitleWithLogo'); + pageTitleElement.classList.remove('pageTitleWithDefaultLogo'); pageTitleElement.style.backgroundImage = null; - pageTitleElement.innerHTML = html || ""; + pageTitleElement.innerHTML = html || ''; } - document.title = title || "Jellyfin"; + document.title = title || 'Jellyfin'; }, setTransparentMenu: function (transparent) { if (transparent) { - skinHeader.classList.add("semiTransparent"); + skinHeader.classList.add('semiTransparent'); } else { - skinHeader.classList.remove("semiTransparent"); + skinHeader.classList.remove('semiTransparent'); } } }; var currentPageType; - pageClassOn("pagebeforeshow", "page", function (e) { - if (!this.classList.contains("withTabs")) { + pageClassOn('pagebeforeshow', 'page', function (e) { + if (!this.classList.contains('withTabs')) { LibraryMenu.setTabs(null); } }); - pageClassOn("pageshow", "page", function (e) { + pageClassOn('pageshow', 'page', function (e) { var page = this; - var isDashboardPage = page.classList.contains("type-interior"); - var isHomePage = page.classList.contains("homePage"); - var isLibraryPage = !isDashboardPage && page.classList.contains("libraryPage"); + var isDashboardPage = page.classList.contains('type-interior'); + var isHomePage = page.classList.contains('homePage'); + var isLibraryPage = !isDashboardPage && page.classList.contains('libraryPage'); var apiClient = getCurrentApiClient(); if (isDashboardPage) { if (mainDrawerButton) { - mainDrawerButton.classList.remove("hide"); + mainDrawerButton.classList.remove('hide'); } refreshDashboardInfoInDrawer(apiClient); } else { if (mainDrawerButton) { if (enableLibraryNavDrawer || isHomePage) { - mainDrawerButton.classList.remove("hide"); + mainDrawerButton.classList.remove('hide'); } else { - mainDrawerButton.classList.add("hide"); + mainDrawerButton.classList.add('hide'); } } - if ("library" !== currentDrawerType) { + if ('library' !== currentDrawerType) { refreshLibraryDrawer(); } } @@ -909,22 +911,26 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " renderHeader(); - events.on(connectionManager, "localusersignedin", function (e, user) { + events.on(connectionManager, 'localusersignedin', function (e, user) { + var currentApiClient = connectionManager.getApiClient(user.ServerId); + currentDrawerType = null; currentUser = { localUser: user }; + loadNavDrawer(); - connectionManager.user(connectionManager.getApiClient(user.ServerId)).then(function (user) { + + connectionManager.user(currentApiClient).then(function (user) { currentUser = user; updateUserInHeader(user); }); }); - events.on(connectionManager, "localusersignedout", function () { + events.on(connectionManager, 'localusersignedout', function () { currentUser = {}; updateUserInHeader(); }); - events.on(playbackManager, "playerchange", updateCastIcon); + events.on(playbackManager, 'playerchange', updateCastIcon); loadNavDrawer(); return LibraryMenu; }); diff --git a/src/scripts/livetvcomponents.js b/src/scripts/livetvcomponents.js index 61ffc66fb..fd4a46c0f 100644 --- a/src/scripts/livetvcomponents.js +++ b/src/scripts/livetvcomponents.js @@ -1,12 +1,12 @@ -define(["layoutManager", "datetime", "cardBuilder", "apphost"], function (layoutManager, datetime, cardBuilder, appHost) { - "use strict"; +define(['layoutManager', 'datetime', 'cardBuilder', 'apphost'], function (layoutManager, datetime, cardBuilder, appHost) { + 'use strict'; function enableScrollX() { return !layoutManager.desktop; } function getBackdropShape() { - return enableScrollX() ? "overflowBackdrop" : "backdrop"; + return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; } function getTimersHtml(timers, options) { @@ -14,27 +14,27 @@ define(["layoutManager", "datetime", "cardBuilder", "apphost"], function (layout var i; var length; var items = timers.map(function (t) { - t.Type = "Timer"; + t.Type = 'Timer'; return t; }); var groups = []; - var currentGroupName = ""; + var currentGroupName = ''; var currentGroup = []; for (i = 0, length = items.length; i < length; i++) { var item = items[i]; - var dateText = ""; + var dateText = ''; if (options.indexByDate !== false && item.StartDate) { try { var premiereDate = datetime.parseISO8601Date(item.StartDate, true); dateText = datetime.toLocaleDateString(premiereDate, { - weekday: "long", - month: "short", - day: "numeric" + weekday: 'long', + month: 'short', + day: 'numeric' }); } catch (err) { - console.error("error parsing premiereDate:" + item.StartDate + "; error: " + err); + console.error('error parsing premiereDate:' + item.StartDate + '; error: ' + err); } } @@ -60,23 +60,23 @@ define(["layoutManager", "datetime", "cardBuilder", "apphost"], function (layout }); } - var html = ""; + var html = ''; for (i = 0, length = groups.length; i < length; i++) { var group = groups[i]; - var supportsImageAnalysis = appHost.supports("imageanalysis"); + var supportsImageAnalysis = appHost.supports('imageanalysis'); var cardLayout = appHost.preferVisualCards || supportsImageAnalysis; cardLayout = true; if (group.name) { html += '
'; - html += '

' + group.name + "

"; + html += '

' + group.name + '

'; } if (enableScrollX()) { - var scrollXClass = "scrollX hiddenScrollX"; + var scrollXClass = 'scrollX hiddenScrollX'; if (layoutManager.tv) { - scrollXClass += " smoothScrollX"; + scrollXClass += ' smoothScrollX'; } html += '
'; @@ -86,26 +86,26 @@ define(["layoutManager", "datetime", "cardBuilder", "apphost"], function (layout html += cardBuilder.getCardsHtml({ items: group.items, - shape: cardLayout ? getBackdropShape() : enableScrollX() ? "autoOverflow" : "autoVertical", + shape: cardLayout ? getBackdropShape() : enableScrollX() ? 'autoOverflow' : 'autoVertical', showParentTitleOrTitle: true, showAirTime: true, showAirEndTime: true, showChannelName: !cardLayout, cardLayout: cardLayout, centerText: !cardLayout, - action: "edit", - cardFooterAside: "none", - preferThumb: !!cardLayout || "auto", - defaultShape: cardLayout ? null : "portrait", + action: 'edit', + cardFooterAside: 'none', + preferThumb: !!cardLayout || 'auto', + defaultShape: cardLayout ? null : 'portrait', coverImage: true, allowBottomPadding: false, overlayText: false, showChannelLogo: cardLayout }); - html += "
"; + html += '
'; if (group.name) { - html += "
"; + html += '
'; } } diff --git a/src/scripts/mouseManager.js b/src/scripts/mouseManager.js index 78057c0bf..e6117fa85 100644 --- a/src/scripts/mouseManager.js +++ b/src/scripts/mouseManager.js @@ -41,7 +41,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd var eventY = e.screenY; // if coord don't exist how could it move - if (typeof eventX === "undefined" && typeof eventY === "undefined") { + if (typeof eventX === 'undefined' && typeof eventY === 'undefined') { return; } diff --git a/src/scripts/playlistedit.js b/src/scripts/playlistedit.js index bca9f0273..636a7ef05 100644 --- a/src/scripts/playlistedit.js +++ b/src/scripts/playlistedit.js @@ -1,11 +1,11 @@ -define(["listView"], function (listView) { - "use strict"; +define(['listView'], function (listView) { + 'use strict'; function getFetchPlaylistItemsFn(itemId) { return function () { var query = { - Fields: "PrimaryImageAspectRatio,UserData", - EnableImageTypes: "Primary,Backdrop,Banner,Thumb", + Fields: 'PrimaryImageAspectRatio,UserData', + EnableImageTypes: 'Primary,Backdrop,Banner,Thumb', UserId: ApiClient.getCurrentUserId() }; return ApiClient.getJSON(ApiClient.getUrl(`Playlists/${itemId}/Items`, query)); @@ -19,7 +19,7 @@ define(["listView"], function (listView) { showIndex: false, showRemoveFromPlaylist: true, playFromHere: true, - action: "playallfromhere", + action: 'playallfromhere', smallIcon: true, dragHandle: true, playlistId: itemId @@ -28,9 +28,9 @@ define(["listView"], function (listView) { } function init(page, item) { - var elem = page.querySelector("#childrenContent .itemsContainer"); - elem.classList.add("vertical-list"); - elem.classList.remove("vertical-wrap"); + var elem = page.querySelector('#childrenContent .itemsContainer'); + elem.classList.add('vertical-list'); + elem.classList.remove('vertical-wrap'); elem.enableDragReordering(true); elem.fetchData = getFetchPlaylistItemsFn(item.Id); elem.getItemsHtml = getItemsHtmlFn(item.Id); @@ -43,8 +43,8 @@ define(["listView"], function (listView) { init(page, item); } - page.querySelector("#childrenContent").classList.add("verticalSection-extrabottompadding"); - page.querySelector("#childrenContent .itemsContainer").refreshItems(); + page.querySelector('#childrenContent').classList.add('verticalSection-extrabottompadding'); + page.querySelector('#childrenContent .itemsContainer').refreshItems(); } }; }); diff --git a/src/scripts/playlists.js b/src/scripts/playlists.js index 4a76f6656..52e7ccb3b 100644 --- a/src/scripts/playlists.js +++ b/src/scripts/playlists.js @@ -1,5 +1,5 @@ -define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", "apphost", "imageLoader", "userSettings", "emby-itemscontainer"], function (loading, listView, cardBuilder, libraryMenu, libraryBrowser, appHost, imageLoader, userSettings) { - "use strict"; +define(['loading', 'listView', 'cardBuilder', 'libraryMenu', 'libraryBrowser', 'apphost', 'imageLoader', 'userSettings', 'emby-itemscontainer'], function (loading, listView, cardBuilder, libraryMenu, libraryBrowser, appHost, imageLoader, userSettings) { + 'use strict'; return function (view, params) { function getPageData(context) { @@ -9,14 +9,14 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " if (!pageData) { pageData = data[key] = { query: { - SortBy: "SortName", - SortOrder: "Ascending", - IncludeItemTypes: "Playlist", + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Playlist', Recursive: true, - Fields: "PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete", + Fields: 'PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete', StartIndex: 0 }, - view: libraryBrowser.getSavedView(key) || "Poster" + view: libraryBrowser.getSavedView(key) || 'Poster' }; if (userSettings.libraryPageSize() > 0) { @@ -52,17 +52,17 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " function onViewStyleChange() { var viewStyle = getPageData(view).view; - var itemsContainer = view.querySelector(".itemsContainer"); + var itemsContainer = view.querySelector('.itemsContainer'); - if ("List" == viewStyle) { - itemsContainer.classList.add("vertical-list"); - itemsContainer.classList.remove("vertical-wrap"); + if ('List' == viewStyle) { + itemsContainer.classList.add('vertical-list'); + itemsContainer.classList.remove('vertical-wrap'); } else { - itemsContainer.classList.remove("vertical-list"); - itemsContainer.classList.add("vertical-wrap"); + itemsContainer.classList.remove('vertical-list'); + itemsContainer.classList.add('vertical-wrap'); } - itemsContainer.innerHTML = ""; + itemsContainer.innerHTML = ''; } function reloadItems() { @@ -74,9 +74,9 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " var result = responses[0]; responses[1]; window.scrollTo(0, 0); - var html = ""; + var html = ''; var viewStyle = getPageData(view).view; - view.querySelector(".listTopPaging").innerHTML = libraryBrowser.getQueryPagingHtml({ + view.querySelector('.listTopPaging').innerHTML = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -84,37 +84,37 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " showLimit: false, updatePageSizeSetting: false, addLayoutButton: true, - layouts: "List,Poster,PosterCard,Thumb,ThumbCard", + layouts: 'List,Poster,PosterCard,Thumb,ThumbCard', currentLayout: viewStyle }); if (result.TotalRecordCount) { - if (viewStyle == "List") { + if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, sortBy: query.SortBy }); - } else if (viewStyle == "PosterCard") { + } else if (viewStyle == 'PosterCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", + shape: 'square', coverImage: true, showTitle: true, cardLayout: true }); - } else if (viewStyle == "Thumb") { + } else if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', showTitle: true, centerText: true, preferThumb: true, overlayPlayButton: true }); - } else if (viewStyle == "ThumbCard") { + } else if (viewStyle == 'ThumbCard') { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "backdrop", + shape: 'backdrop', showTitle: true, preferThumb: true, cardLayout: true @@ -122,25 +122,25 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " } else { html = cardBuilder.getCardsHtml({ items: result.Items, - shape: "square", + shape: 'square', showTitle: true, coverImage: true, centerText: true, overlayPlayButton: true }); } - view.querySelector(".noItemsMessage").classList.add("hide"); + view.querySelector('.noItemsMessage').classList.add('hide'); } else { - view.querySelector(".noItemsMessage").classList.remove("hide"); + view.querySelector('.noItemsMessage').classList.remove('hide'); } - var elem = view.querySelector(".itemsContainer"); + var elem = view.querySelector('.itemsContainer'); elem.innerHTML = html; imageLoader.lazyChildren(elem); - var btnNextPage = view.querySelector(".btnNextPage"); + var btnNextPage = view.querySelector('.btnNextPage'); if (btnNextPage) { - btnNextPage.addEventListener("click", function () { + btnNextPage.addEventListener('click', function () { if (userSettings.libraryPageSize() > 0) { query.StartIndex += query.Limit; } @@ -148,10 +148,10 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " }); } - var btnPreviousPage = view.querySelector(".btnPreviousPage"); + var btnPreviousPage = view.querySelector('.btnPreviousPage'); if (btnPreviousPage) { - btnPreviousPage.addEventListener("click", function () { + btnPreviousPage.addEventListener('click', function () { if (userSettings.libraryPageSize() > 0) { query.StartIndex = Math.max(0, query.StartIndex - query.Limit); } @@ -159,10 +159,10 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " }); } - var btnChangeLayout = view.querySelector(".btnChangeLayout"); + var btnChangeLayout = view.querySelector('.btnChangeLayout'); if (btnChangeLayout) { - btnChangeLayout.addEventListener("layoutchange", function (e) { + btnChangeLayout.addEventListener('layoutchange', function (e) { var layout = e.detail.viewStyle; getPageData(view).view = layout; libraryBrowser.saveViewSetting(getSavedQueryKey(view), layout); @@ -177,11 +177,11 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", " } var data = {}; - view.addEventListener("viewbeforeshow", function () { + view.addEventListener('viewbeforeshow', function () { reloadItems(); }); - view.querySelector(".btnNewPlaylist").addEventListener("click", function () { - require(["playlistEditor"], function (playlistEditor) { + view.querySelector('.btnNewPlaylist').addEventListener('click', function () { + require(['playlistEditor'], function (playlistEditor) { var serverId = ApiClient.serverInfo().Id; new playlistEditor().show({ items: [], diff --git a/src/scripts/routes.js b/src/scripts/routes.js index 72c67e5b7..a5ed0a00a 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -1,433 +1,435 @@ define([ - "jQuery", - "emby-button", - "emby-input", - "scripts/livetvcomponents", - "paper-icon-button-light", - "emby-itemscontainer", - "emby-collapse", - "emby-select", - "livetvcss", - "emby-checkbox", - "emby-slider", - "listViewStyle", - "dashboardcss", - "detailtablecss"], function () { + 'jQuery', + 'emby-button', + 'emby-input', + 'scripts/livetvcomponents', + 'paper-icon-button-light', + 'emby-itemscontainer', + 'emby-collapse', + 'emby-select', + 'livetvcss', + 'emby-checkbox', + 'emby-slider', + 'listViewStyle', + 'dashboardcss', + 'detailtablecss'], function () { function defineRoute(newRoute) { var path = newRoute.path; - console.debug("defining route: " + path); - newRoute.dictionary = "core"; + console.debug('defining route: ' + path); + newRoute.dictionary = 'core'; Emby.Page.addRoute(path, newRoute); } - console.debug("defining core routes"); + console.debug('defining core routes'); defineRoute({ - path: "/addserver.html", + path: '/addserver.html', autoFocus: false, anonymous: true, startup: true, - controller: "auth/addserver" + controller: 'auth/addserver' }); defineRoute({ - path: "/selectserver.html", + path: '/selectserver.html', autoFocus: false, anonymous: true, startup: true, - controller: "auth/selectserver", - type: "selectserver" + controller: 'auth/selectserver', + type: 'selectserver' }); defineRoute({ - path: "/forgotpassword.html", - anonymous: true, - startup: true, - controller: "auth/forgotpassword" - }); - defineRoute({ - path: "/forgotpasswordpin.html", + path: '/login.html', autoFocus: false, anonymous: true, startup: true, - controller: "auth/forgotpasswordpin" + controller: 'auth/login', + type: 'login' + }); + defineRoute({ + path: '/forgotpassword.html', + anonymous: true, + startup: true, + controller: 'auth/forgotpassword' + }); + defineRoute({ + path: '/forgotpasswordpin.html', + autoFocus: false, + anonymous: true, + startup: true, + controller: 'auth/forgotpasswordpin' }); defineRoute({ - path: "/addplugin.html", + path: '/mypreferencesmenu.html', autoFocus: false, - roles: "admin", - controller: "dashboard/plugins/add" + transition: 'fade', + controller: 'user/menu' }); defineRoute({ - path: "/mypreferencesmenu.html", + path: '/myprofile.html', autoFocus: false, - transition: "fade", - controller: "user/menu" + transition: 'fade', + controller: 'user/profile' }); defineRoute({ - path: "/myprofile.html", + path: '/mypreferencesdisplay.html', autoFocus: false, - transition: "fade", - controller: "user/profile" + transition: 'fade', + controller: 'user/display' }); defineRoute({ - path: "/mypreferencesdisplay.html", + path: '/mypreferenceshome.html', autoFocus: false, - transition: "fade", - controller: "user/display" + transition: 'fade', + controller: 'user/home' }); defineRoute({ - path: "/mypreferenceshome.html", + path: '/mypreferencesplayback.html', autoFocus: false, - transition: "fade", - controller: "user/home" + transition: 'fade', + controller: 'user/playback' }); defineRoute({ - path: "/mypreferencesplayback.html", + path: '/mypreferencessubtitles.html', autoFocus: false, - transition: "fade", - controller: "user/playback" - }); - defineRoute({ - path: "/mypreferencessubtitles.html", - autoFocus: false, - transition: "fade", - controller: "user/subtitles" + transition: 'fade', + controller: 'user/subtitles' }); defineRoute({ - path: "/dashboard.html", + path: '/dashboard.html', autoFocus: false, - roles: "admin", - controller: "dashboard/dashboard" + roles: 'admin', + controller: 'dashboard/dashboard' }); defineRoute({ - path: "/dashboardgeneral.html", - controller: "dashboard/general", + path: '/dashboardgeneral.html', + controller: 'dashboard/general', autoFocus: false, - roles: "admin" + roles: 'admin' }); defineRoute({ - path: "/networking.html", + path: '/networking.html', autoFocus: false, - roles: "admin", - controller: "dashboard/networking" + roles: 'admin', + controller: 'dashboard/networking' }); defineRoute({ - path: "/devices.html", + path: '/devices.html', autoFocus: false, - roles: "admin", - controller: "dashboard/devices/devices" + roles: 'admin', + controller: 'dashboard/devices/devices' }); defineRoute({ - path: "/device.html", + path: '/device.html', autoFocus: false, - roles: "admin", - controller: "dashboard/devices/device" + roles: 'admin', + controller: 'dashboard/devices/device' }); defineRoute({ - path: "/dlnaprofile.html", + path: '/dlnaprofile.html', autoFocus: false, - roles: "admin", - controller: "dashboard/dlna/dlnaprofile" + roles: 'admin', + controller: 'dashboard/dlna/dlnaprofile' }); defineRoute({ - path: "/dlnaprofiles.html", + path: '/dlnaprofiles.html', autoFocus: false, - roles: "admin", - controller: "dashboard/dlna/dlnaprofiles" + roles: 'admin', + controller: 'dashboard/dlna/dlnaprofiles' }); defineRoute({ - path: "/dlnasettings.html", + path: '/addplugin.html', autoFocus: false, - roles: "admin", - controller: "dashboard/dlna/dlnasettings" + roles: 'admin', + controller: 'dashboard/plugins/add' }); defineRoute({ - path: "/edititemmetadata.html", - controller: "edititemmetadata", + path: '/library.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/medialibrarypage' + }); + defineRoute({ + path: '/librarydisplay.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/librarydisplay' + }); + defineRoute({ + path: '/dlnasettings.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/dlna/dlnasettings' + }); + defineRoute({ + path: '/edititemmetadata.html', + controller: 'edititemmetadata', autoFocus: false }); defineRoute({ - path: "/encodingsettings.html", + path: '/encodingsettings.html', autoFocus: false, - roles: "admin", - controller: "dashboard/encodingsettings" - }); - defineRoute({ - path: "/home.html", - autoFocus: false, - controller: "home", - transition: "fade", - type: "home" - }); - defineRoute({ - path: "/list.html", - autoFocus: false, - controller: "list", - transition: "fade" - }); - defineRoute({ - path: "/itemdetails.html", - controller: "itemdetailpage", - autoFocus: false, - transition: "fade" - }); - defineRoute({ - path: "/library.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/medialibrarypage" - }); - defineRoute({ - path: "/librarydisplay.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/librarydisplay" - }); - defineRoute({ - path: "/livetv.html", - controller: "livetv/livetvsuggested", - autoFocus: false, - transition: "fade" - }); - defineRoute({ - path: "/livetvguideprovider.html", - autoFocus: false, - roles: "admin", - controller: "livetvguideprovider" - }); - defineRoute({ - path: "/livetvsettings.html", - autoFocus: false, - controller: "livetvsettings" - }); - defineRoute({ - path: "/livetvstatus.html", - autoFocus: false, - roles: "admin", - controller: "livetvstatus" - }); - defineRoute({ - path: "/livetvtuner.html", - autoFocus: false, - roles: "admin", - controller: "livetvtuner" - }); - defineRoute({ - path: "/log.html", - roles: "admin", - controller: "dashboard/logs" - }); - defineRoute({ - path: "/login.html", - autoFocus: false, - anonymous: true, - startup: true, - controller: "auth/login", - type: "login" - }); - defineRoute({ - path: "/metadataimages.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/metadataimagespage" - }); - defineRoute({ - path: "/metadatanfo.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/metadatanfo" - }); - defineRoute({ - path: "/movies.html", - autoFocus: false, - controller: "movies/moviesrecommended", - transition: "fade" - }); - defineRoute({ - path: "/music.html", - controller: "music/musicrecommended", - autoFocus: false, - transition: "fade" - }); - defineRoute({ - path: "/notificationsetting.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/notifications/notification" - }); - defineRoute({ - path: "/notificationsettings.html", - controller: "dashboard/notifications/notifications", - autoFocus: false, - roles: "admin" - }); - defineRoute({ - path: "/playbackconfiguration.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/playbackconfiguration" - }); - defineRoute({ - path: "/availableplugins.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/plugins/available" - }); - defineRoute({ - path: "/installedplugins.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/plugins/installed" - }); - defineRoute({ - path: "/scheduledtask.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/scheduledtasks/scheduledtask" - }); - defineRoute({ - path: "/scheduledtasks.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/scheduledtasks/scheduledtasks" - }); - defineRoute({ - path: "/search.html", - controller: "searchpage" - }); - defineRoute({ - path: "/serveractivity.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/serveractivity" - }); - defineRoute({ - path: "/apikeys.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/apikeys" - }); - defineRoute({ - path: "/streamingsettings.html", - autoFocus: false, - roles: "admin", - controller: "dashboard/streamingsettings" - }); - defineRoute({ - path: "/tv.html", - autoFocus: false, - controller: "shows/tvrecommended", - transition: "fade" - }); - defineRoute({ - path: "/useredit.html", - autoFocus: false, - roles: "admin", - controller: "useredit" - }); - defineRoute({ - path: "/userlibraryaccess.html", - autoFocus: false, - roles: "admin", - controller: "userlibraryaccess" - }); - defineRoute({ - path: "/usernew.html", - autoFocus: false, - roles: "admin", - controller: "usernew" - }); - defineRoute({ - path: "/userparentalcontrol.html", - autoFocus: false, - roles: "admin", - controller: "userparentalcontrol" - }); - defineRoute({ - path: "/userpassword.html", - autoFocus: false, - controller: "userpasswordpage" - }); - defineRoute({ - path: "/userprofiles.html", - autoFocus: false, - roles: "admin", - controller: "userprofilespage" + roles: 'admin', + controller: 'dashboard/encodingsettings' }); defineRoute({ - path: "/wizardremoteaccess.html", + path: '/home.html', autoFocus: false, - anonymous: true, - controller: "wizard/remoteaccess" + controller: 'home', + transition: 'fade', + type: 'home' }); defineRoute({ - path: "/wizardfinish.html", - autoFocus: false, - anonymous: true, - controller: "wizard/finish" + path: '/search.html', + controller: 'searchpage' }); defineRoute({ - path: "/wizardlibrary.html", + path: '/list.html', autoFocus: false, - anonymous: true, - controller: "medialibrarypage" + controller: 'list', + transition: 'fade' }); defineRoute({ - path: "/wizardsettings.html", + path: '/itemdetails.html', + controller: 'itemdetailpage', autoFocus: false, - anonymous: true, - controller: "wizard/settings" + transition: 'fade' }); defineRoute({ - path: "/wizardstart.html", + path: '/livetv.html', + controller: 'livetv/livetvsuggested', autoFocus: false, - anonymous: true, - controller: "wizard/start" + transition: 'fade' }); defineRoute({ - path: "/wizarduser.html", - controller: "wizard/user", + path: '/livetvguideprovider.html', + autoFocus: false, + roles: 'admin', + controller: 'livetvguideprovider' + }); + defineRoute({ + path: '/livetvsettings.html', + autoFocus: false, + controller: 'livetvsettings' + }); + defineRoute({ + path: '/livetvstatus.html', + autoFocus: false, + roles: 'admin', + controller: 'livetvstatus' + }); + defineRoute({ + path: '/livetvtuner.html', + autoFocus: false, + roles: 'admin', + controller: 'livetvtuner' + }); + defineRoute({ + path: '/log.html', + roles: 'admin', + controller: 'dashboard/logs' + }); + defineRoute({ + path: '/metadataimages.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/metadataimagespage' + }); + defineRoute({ + path: '/metadatanfo.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/metadatanfo' + }); + defineRoute({ + path: '/movies.html', + autoFocus: false, + controller: 'movies/moviesrecommended', + transition: 'fade' + }); + defineRoute({ + path: '/music.html', + controller: 'music/musicrecommended', + autoFocus: false, + transition: 'fade' + }); + defineRoute({ + path: '/notificationsetting.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/notifications/notification' + }); + defineRoute({ + path: '/notificationsettings.html', + controller: 'dashboard/notifications/notifications', + autoFocus: false, + roles: 'admin' + }); + defineRoute({ + path: '/playbackconfiguration.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/playbackconfiguration' + }); + defineRoute({ + path: '/availableplugins.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/plugins/available' + }); + defineRoute({ + path: '/installedplugins.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/plugins/installed' + }); + defineRoute({ + path: '/scheduledtask.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/scheduledtasks/scheduledtask' + }); + defineRoute({ + path: '/scheduledtasks.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/scheduledtasks/scheduledtasks' + }); + defineRoute({ + path: '/serveractivity.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/serveractivity' + }); + defineRoute({ + path: '/apikeys.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/apikeys' + }); + defineRoute({ + path: '/streamingsettings.html', + autoFocus: false, + roles: 'admin', + controller: 'dashboard/streamingsettings' + }); + defineRoute({ + path: '/tv.html', + autoFocus: false, + controller: 'shows/tvrecommended', + transition: 'fade' + }); + + defineRoute({ + path: '/useredit.html', + autoFocus: false, + roles: 'admin', + controller: 'useredit' + }); + defineRoute({ + path: '/userlibraryaccess.html', + autoFocus: false, + roles: 'admin', + controller: 'userlibraryaccess' + }); + defineRoute({ + path: '/usernew.html', + autoFocus: false, + roles: 'admin', + controller: 'usernew' + }); + defineRoute({ + path: '/userparentalcontrol.html', + autoFocus: false, + roles: 'admin', + controller: 'userparentalcontrol' + }); + defineRoute({ + path: '/userpassword.html', + autoFocus: false, + controller: 'userpasswordpage' + }); + defineRoute({ + path: '/userprofiles.html', + autoFocus: false, + roles: 'admin', + controller: 'userprofilespage' + }); + + defineRoute({ + path: '/wizardremoteaccess.html', + autoFocus: false, + anonymous: true, + controller: 'wizard/remoteaccess' + }); + defineRoute({ + path: '/wizardfinish.html', + autoFocus: false, + anonymous: true, + controller: 'wizard/finish' + }); + defineRoute({ + path: '/wizardlibrary.html', + autoFocus: false, + anonymous: true, + controller: 'dashboard/medialibrarypage' + }); + defineRoute({ + path: '/wizardsettings.html', + autoFocus: false, + anonymous: true, + controller: 'wizard/settings' + }); + defineRoute({ + path: '/wizardstart.html', + autoFocus: false, + anonymous: true, + controller: 'wizard/start' + }); + defineRoute({ + path: '/wizarduser.html', + controller: 'wizard/user', autoFocus: false, anonymous: true }); defineRoute({ - path: "/videoosd.html", - transition: "fade", - controller: "playback/videoosd", + path: '/videoosd.html', + transition: 'fade', + controller: 'playback/videoosd', autoFocus: false, - type: "video-osd", + type: 'video-osd', supportsThemeMedia: true, fullscreen: true, enableMediaControl: false }); defineRoute({ - path: "/nowplaying.html", - controller: "playback/nowplaying", + path: '/nowplaying.html', + controller: 'playback/nowplaying', autoFocus: false, - transition: "fade", + transition: 'fade', fullscreen: true, supportsThemeMedia: true, enableMediaControl: false }); defineRoute({ - path: "/configurationpage", + path: '/configurationpage', autoFocus: false, enableCache: false, enableContentQueryString: true, - roles: "admin" + roles: 'admin' }); defineRoute({ - path: "/", + path: '/', isDefaultRoute: true, autoFocus: false }); defineRoute({ - path: "/index.html", + path: '/index.html', autoFocus: false, isDefaultRoute: true }); diff --git a/src/scripts/searchtab.js b/src/scripts/searchtab.js index c0852bfc7..95b1e5a7c 100644 --- a/src/scripts/searchtab.js +++ b/src/scripts/searchtab.js @@ -1,18 +1,18 @@ -define(["searchFields", "searchResults", "events"], function (SearchFields, SearchResults, events) { - "use strict"; +define(['searchFields', 'searchResults', 'events'], function (SearchFields, SearchResults, events) { + 'use strict'; function init(instance, tabContent, options) { tabContent.innerHTML = '
'; instance.searchFields = new SearchFields({ - element: tabContent.querySelector(".searchFields") + element: tabContent.querySelector('.searchFields') }); instance.searchResults = new SearchResults({ - element: tabContent.querySelector(".searchResults"), + element: tabContent.querySelector('.searchResults'), serverId: ApiClient.serverId(), parentId: options.parentId, collectionType: options.collectionType }); - events.on(instance.searchFields, "search", function (e, value) { + events.on(instance.searchFields, 'search', function (e, value) { instance.searchResults.search(value); }); } diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index 12748eac2..072e3f306 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -265,3 +265,33 @@ import events from 'events'; } /* eslint-enable indent */ +export default { + setUserInfo: setUserInfo, + getData: getData, + importFrom: importFrom, + set: set, + get: get, + serverConfig: serverConfig, + enableCinemaMode: enableCinemaMode, + enableNextVideoInfoOverlay: enableNextVideoInfoOverlay, + enableThemeSongs: enableThemeSongs, + enableThemeVideos: enableThemeVideos, + enableFastFadein: enableFastFadein, + enableBackdrops: enableBackdrops, + language: language, + dateTimeLocale: dateTimeLocale, + skipBackLength: skipBackLength, + skipForwardLength: skipForwardLength, + dashboardTheme: dashboardTheme, + skin: skin, + theme: theme, + screensaver: screensaver, + libraryPageSize: libraryPageSize, + soundEffects: soundEffects, + loadQuerySettings: loadQuerySettings, + saveQuerySettings: saveQuerySettings, + getSubtitleAppearanceSettings: getSubtitleAppearanceSettings, + setSubtitleAppearanceSettings: setSubtitleAppearanceSettings, + setFilter: setFilter, + getFilter: getFilter +}; diff --git a/src/scripts/settings/webSettings.js b/src/scripts/settings/webSettings.js index 4b1b658e9..d999724af 100644 --- a/src/scripts/settings/webSettings.js +++ b/src/scripts/settings/webSettings.js @@ -2,7 +2,17 @@ let data; function getConfig() { if (data) return Promise.resolve(data); - return fetch("/config.json?nocache=" + new Date().getUTCMilliseconds()).then(function (response) { + return fetch('/config.json?nocache=' + new Date().getUTCMilliseconds()).then(response => { + data = response.json(); + return data; + }).catch(error => { + console.warn('web config file is missing so the template will be used'); + return getDefaultConfig(); + }); +} + +function getDefaultConfig() { + return fetch('/config.template.json').then(function (response) { data = response.json(); return data; }); @@ -11,5 +21,8 @@ function getConfig() { export function enableMultiServer() { return getConfig().then(config => { return config.multiserver; + }).catch(error => { + console.log('cannot get web config:', error); + return false; }); } diff --git a/src/scripts/site.js b/src/scripts/site.js index df9bd4495..c00169d22 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -1,36 +1,36 @@ function getWindowLocationSearch(win) { - "use strict"; + 'use strict'; var search = (win || window).location.search; if (!search) { - var index = window.location.href.indexOf("?"); + var index = window.location.href.indexOf('?'); if (-1 != index) { search = window.location.href.substring(index); } } - return search || ""; + return search || ''; } function getParameterByName(name, url) { - "use strict"; + 'use strict'; - name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]"); - var regexS = "[\\?&]" + name + "=([^&#]*)"; - var regex = new RegExp(regexS, "i"); + name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); + var regexS = '[\\?&]' + name + '=([^&#]*)'; + var regex = new RegExp(regexS, 'i'); var results = regex.exec(url || getWindowLocationSearch()); if (null == results) { - return ""; + return ''; } - return decodeURIComponent(results[1].replace(/\+/g, " ")); + return decodeURIComponent(results[1].replace(/\+/g, ' ')); } function pageClassOn(eventName, className, fn) { - "use strict"; + 'use strict'; document.addEventListener(eventName, function (event) { var target = event.target; @@ -42,7 +42,7 @@ function pageClassOn(eventName, className, fn) { } function pageIdOn(eventName, id, fn) { - "use strict"; + 'use strict'; document.addEventListener(eventName, function (event) { var target = event.target; @@ -71,17 +71,17 @@ var Dashboard = { } var urlLower = window.location.href.toLowerCase(); - var index = urlLower.lastIndexOf("/web"); + var index = urlLower.lastIndexOf('/web'); if (-1 != index) { return urlLower.substring(0, index); } var loc = window.location; - var address = loc.protocol + "//" + loc.hostname; + var address = loc.protocol + '//' + loc.hostname; if (loc.port) { - address += ":" + loc.port; + address += ':' + loc.port; } return address; @@ -104,21 +104,21 @@ var Dashboard = { var loginPage; if (AppInfo.isNativeApp) { - loginPage = "selectserver.html"; + loginPage = 'selectserver.html'; window.ApiClient = null; } else { - loginPage = "login.html"; + loginPage = 'login.html'; } Dashboard.navigate(loginPage); }); }, getConfigurationPageUrl: function (name) { - return "configurationpage?name=" + encodeURIComponent(name); + return 'configurationpage?name=' + encodeURIComponent(name); }, getConfigurationResourceUrl: function (name) { if (AppInfo.isNativeApp) { - return ApiClient.getUrl("web/ConfigurationPage", { + return ApiClient.getUrl('web/ConfigurationPage', { name: name }); } @@ -127,7 +127,7 @@ var Dashboard = { }, navigate: function (url, preserveQueryString) { if (!url) { - throw new Error("url cannot be null or empty"); + throw new Error('url cannot be null or empty'); } var queryString = getWindowLocationSearch(); @@ -137,36 +137,36 @@ var Dashboard = { } return new Promise(function (resolve, reject) { - require(["appRouter"], function (appRouter) { + require(['appRouter'], function (appRouter) { return appRouter.show(url).then(resolve, reject); }); }); }, navigate_direct: function (path) { return new Promise(function (resolve, reject) { - require(["appRouter"], function (appRouter) { + require(['appRouter'], function (appRouter) { return appRouter.showDirect(path).then(resolve, reject); }); }); }, processPluginConfigurationUpdateResult: function () { - require(["loading", "toast"], function (loading, toast) { + require(['loading', 'toast'], function (loading, toast) { loading.hide(); - toast(Globalize.translate("MessageSettingsSaved")); + toast(Globalize.translate('MessageSettingsSaved')); }); }, processServerConfigurationUpdateResult: function (result) { - require(["loading", "toast"], function (loading, toast) { + require(['loading', 'toast'], function (loading, toast) { loading.hide(); - toast(Globalize.translate("MessageSettingsSaved")); + toast(Globalize.translate('MessageSettingsSaved')); }); }, processErrorResponse: function (response) { - require(["loading"], function (loading) { + require(['loading'], function (loading) { loading.hide(); }); - var status = "" + response.status; + var status = '' + response.status; if (response.statusText) { status = response.statusText; @@ -174,21 +174,21 @@ var Dashboard = { Dashboard.alert({ title: status, - message: response.headers ? response.headers.get("X-Application-Error-Code") : null + message: response.headers ? response.headers.get('X-Application-Error-Code') : null }); }, alert: function (options) { - if ("string" == typeof options) { - return void require(["toast"], function (toast) { + if ('string' == typeof options) { + return void require(['toast'], function (toast) { toast({ text: options }); }); } - require(["alert"], function (alert) { + require(['alert'], function (alert) { alert({ - title: options.title || Globalize.translate("HeaderAlert"), + title: options.title || Globalize.translate('HeaderAlert'), text: options.message }).then(options.callback || function () {}); }); @@ -197,11 +197,11 @@ var Dashboard = { var apiClient = window.ApiClient; if (apiClient) { - require(["serverRestartDialog", "events"], function (ServerRestartDialog, events) { + require(['serverRestartDialog', 'events'], function (ServerRestartDialog, events) { var dialog = new ServerRestartDialog({ apiClient: apiClient }); - events.on(dialog, "restarted", function () { + events.on(dialog, 'restarted', function () { if (AppInfo.isNativeApp) { apiClient.ensureWebSocket(); } else { @@ -214,19 +214,19 @@ var Dashboard = { }, capabilities: function (appHost) { var capabilities = { - PlayableMediaTypes: ["Audio", "Video"], - SupportedCommands: ["MoveUp", "MoveDown", "MoveLeft", "MoveRight", "PageUp", "PageDown", "PreviousLetter", "NextLetter", "ToggleOsd", "ToggleContextMenu", "Select", "Back", "SendKey", "SendString", "GoHome", "GoToSettings", "VolumeUp", "VolumeDown", "Mute", "Unmute", "ToggleMute", "SetVolume", "SetAudioStreamIndex", "SetSubtitleStreamIndex", "DisplayContent", "GoToSearch", "DisplayMessage", "SetRepeatMode", "ChannelUp", "ChannelDown", "PlayMediaSource", "PlayTrailers"], - SupportsPersistentIdentifier: "cordova" === self.appMode || "android" === self.appMode, + PlayableMediaTypes: ['Audio', 'Video'], + SupportedCommands: ['MoveUp', 'MoveDown', 'MoveLeft', 'MoveRight', 'PageUp', 'PageDown', 'PreviousLetter', 'NextLetter', 'ToggleOsd', 'ToggleContextMenu', 'Select', 'Back', 'SendKey', 'SendString', 'GoHome', 'GoToSettings', 'VolumeUp', 'VolumeDown', 'Mute', 'Unmute', 'ToggleMute', 'SetVolume', 'SetAudioStreamIndex', 'SetSubtitleStreamIndex', 'DisplayContent', 'GoToSearch', 'DisplayMessage', 'SetRepeatMode', 'ChannelUp', 'ChannelDown', 'PlayMediaSource', 'PlayTrailers'], + SupportsPersistentIdentifier: 'cordova' === self.appMode || 'android' === self.appMode, SupportsMediaControl: true }; appHost.getPushTokenInfo(); return capabilities = Object.assign(capabilities, appHost.getPushTokenInfo()); }, selectServer: function () { - if (window.NativeShell && typeof window.NativeShell.selectServer === "function") { + if (window.NativeShell && typeof window.NativeShell.selectServer === 'function') { window.NativeShell.selectServer(); } else { - Dashboard.navigate("selectserver.html"); + Dashboard.navigate('selectserver.html'); } } }; @@ -234,11 +234,11 @@ var Dashboard = { var AppInfo = {}; !function () { - "use strict"; + 'use strict'; function defineConnectionManager(connectionManager) { window.ConnectionManager = connectionManager; - define("connectionManager", [], function () { + define('connectionManager', [], function () { return connectionManager; }); } @@ -264,13 +264,13 @@ var AppInfo = {}; return userSettings.setUserInfo(user.Id, localApiClient); }; - events.on(connectionManager, "localusersignedout", function () { + events.on(connectionManager, 'localusersignedout', function () { userSettings.setUserInfo(null, null); }); } function createConnectionManager() { - return require(["connectionManagerFactory", "apphost", "credentialprovider", "events", "userSettings"], function (ConnectionManager, apphost, credentialProvider, events, userSettings) { + return require(['connectionManagerFactory', 'apphost', 'credentialprovider', 'events', 'userSettings'], function (ConnectionManager, apphost, credentialProvider, events, userSettings) { var credentialProviderInstance = new credentialProvider(); var promises = [apphost.getSyncProfile(), apphost.init()]; @@ -286,10 +286,10 @@ var AppInfo = {}; bindConnectionManagerEvents(connectionManager, events, userSettings); if (!AppInfo.isNativeApp) { - console.debug("loading ApiClient singleton"); + console.debug('loading ApiClient singleton'); - return require(["apiclient"], function (apiClientFactory) { - console.debug("creating ApiClient singleton"); + return require(['apiclient'], function (apiClientFactory) { + console.debug('creating ApiClient singleton'); var apiClient = new apiClientFactory(Dashboard.serverAddress(), apphost.appName(), apphost.appVersion(), apphost.deviceName(), apphost.deviceId()); @@ -301,7 +301,7 @@ var AppInfo = {}; window.ApiClient = apiClient; localApiClient = apiClient; - console.debug("loaded ApiClient singleton"); + console.debug('loaded ApiClient singleton'); }); } @@ -315,27 +315,27 @@ var AppInfo = {}; } function getBowerPath() { - return "libraries"; + return 'libraries'; } function getComponentsPath() { - return "components"; + return 'components'; } function getElementsPath() { - return "elements"; + return 'elements'; } function getScriptsPath() { - return "scripts"; + return 'scripts'; } function getPlaybackManager(playbackManager) { - window.addEventListener("beforeunload", function () { + window.addEventListener('beforeunload', function () { try { playbackManager.onAppClose(); } catch (err) { - console.error("error in onAppClose: " + err); + console.error('error in onAppClose: ' + err); } }); return playbackManager; @@ -355,16 +355,16 @@ var AppInfo = {}; } function onRequireJsError(requireType, requireModules) { - console.error("RequireJS error: " + (requireType || "unknown") + ". Failed modules: " + (requireModules || []).join(",")); + console.error('RequireJS error: ' + (requireType || 'unknown') + '. Failed modules: ' + (requireModules || []).join(',')); } function defineResizeObserver() { if (self.ResizeObserver) { - define("ResizeObserver", [], function () { + define('ResizeObserver', [], function () { return self.ResizeObserver; }); } else { - define("ResizeObserver", ["resize-observer-polyfill"], returnFirstDependency); + define('ResizeObserver', ['resize-observer-polyfill'], returnFirstDependency); } } @@ -373,76 +373,61 @@ var AppInfo = {}; var componentsPath = getComponentsPath(); var scriptsPath = getScriptsPath(); - define("filesystem", [scriptsPath + "/filesystem"], returnFirstDependency); + define('filesystem', [scriptsPath + '/filesystem'], returnFirstDependency); - if (window.IntersectionObserver && !browser.edge) { - define("lazyLoader", [componentsPath + "/lazyloader/lazyloader-intersectionobserver"], returnFirstDependency); - } else { - define("lazyLoader", [componentsPath + "/lazyloader/lazyloader-scroll"], returnFirstDependency); - } + define('lazyLoader', [componentsPath + '/lazyloader/lazyloader-intersectionobserver'], returnFirstDependency); + define('shell', [componentsPath + '/shell'], returnFirstDependency); - define("shell", [componentsPath + "/shell"], returnFirstDependency); - - define("apiclient", [bowerPath + "/apiclient/apiclient"], returnFirstDependency); - - if ("registerElement" in document) { - define("registerElement", []); + if ('registerElement' in document) { + define('registerElement', []); } else if (browser.msie) { - define("registerElement", ["webcomponents"], returnFirstDependency); + define('registerElement', ['webcomponents'], returnFirstDependency); } else { - define("registerElement", ["document-register-element"], returnFirstDependency); + define('registerElement', ['document-register-element'], returnFirstDependency); } - define("imageFetcher", [componentsPath + "/images/imageFetcher"], returnFirstDependency); - - var preferNativeAlerts = browser.tv; - - define("alert", [componentsPath + "/alert"], returnFirstDependency); + define('alert', [componentsPath + '/alert'], returnFirstDependency); defineResizeObserver(); - define("dialog", [componentsPath + "/dialog/dialog"], returnFirstDependency); - define("confirm", [componentsPath + "/confirm/confirm"], returnFirstDependency); + define('dialog', [componentsPath + '/dialog/dialog'], returnFirstDependency); - define("prompt", [componentsPath + "/prompt/prompt"], returnFirstDependency); + define('confirm', [componentsPath + '/confirm/confirm'], returnFirstDependency); - define("loading", [componentsPath + "/loading/loading"], returnFirstDependency); - define("multi-download", [componentsPath + "/multidownload"], returnFirstDependency); - define("fileDownloader", [componentsPath + "/filedownloader"], returnFirstDependency); - define("localassetmanager", [bowerPath + "/apiclient/localassetmanager"], returnFirstDependency); + define('prompt', [componentsPath + '/prompt/prompt'], returnFirstDependency); - define("castSenderApiLoader", [componentsPath + "/castSenderApi"], returnFirstDependency); + define('loading', [componentsPath + '/loading/loading'], returnFirstDependency); + define('multi-download', [componentsPath + '/multidownload'], returnFirstDependency); + define('fileDownloader', [componentsPath + '/filedownloader'], returnFirstDependency); - define("transfermanager", [bowerPath + "/apiclient/sync/transfermanager"], returnFirstDependency); - define("filerepository", [bowerPath + "/apiclient/sync/filerepository"], returnFirstDependency); - define("localsync", [bowerPath + "/apiclient/sync/localsync"], returnFirstDependency); + define('castSenderApiLoader', [componentsPath + '/castSenderApi'], returnFirstDependency); } function init() { - define("livetvcss", ["css!assets/css/livetv.css"], returnFirstDependency); - define("detailtablecss", ["css!assets/css/detailtable.css"], returnFirstDependency); + define('livetvcss', ['css!assets/css/livetv.css'], returnFirstDependency); + define('detailtablecss', ['css!assets/css/detailtable.css'], returnFirstDependency); var promises = []; if (!window.fetch) { - promises.push(require(["fetch"])); + promises.push(require(['fetch'])); } Promise.all(promises).then(function () { createConnectionManager().then(function () { - console.debug("initAfterDependencies promises resolved"); + console.debug('initAfterDependencies promises resolved'); - require(["globalize", "browser"], function (globalize, browser) { + require(['globalize', 'browser'], function (globalize, browser) { window.Globalize = globalize; loadCoreDictionary(globalize).then(function () { onGlobalizeInit(browser); }); }); - require(["keyboardnavigation"], function(keyboardnavigation) { + require(['keyboardnavigation'], function(keyboardnavigation) { keyboardnavigation.enable(); }); - require(["mouseManager"]); - require(["focusPreventScroll"]); - require(["autoFocuser"], function(autoFocuser) { + require(['mouseManager']); + require(['focusPreventScroll']); + require(['autoFocuser'], function(autoFocuser) { autoFocuser.enable(); }); require(['globalize', 'connectionManager', 'events'], function (globalize, connectionManager, events) { @@ -453,38 +438,38 @@ var AppInfo = {}; } function loadCoreDictionary(globalize) { - var languages = ["ar", "be-by", "bg-bg", "ca", "cs", "da", "de", "el", "en-gb", "en-us", "es", "es-ar", "es-mx", "fa", "fi", "fr", "fr-ca", "gsw", "he", "hi-in", "hr", "hu", "id", "it", "kk", "ko", "lt-lt", "ms", "nb", "nl", "pl", "pt-br", "pt-pt", "ro", "ru", "sk", "sl-si", "sv", "tr", "uk", "vi", "zh-cn", "zh-hk", "zh-tw"]; + var languages = ['ar', 'be-by', 'bg-bg', 'ca', 'cs', 'da', 'de', 'el', 'en-gb', 'en-us', 'es', 'es-ar', 'es-mx', 'fa', 'fi', 'fr', 'fr-ca', 'gsw', 'he', 'hi-in', 'hr', 'hu', 'id', 'it', 'kk', 'ko', 'lt-lt', 'ms', 'nb', 'nl', 'pl', 'pt-br', 'pt-pt', 'ro', 'ru', 'sk', 'sl-si', 'sv', 'tr', 'uk', 'vi', 'zh-cn', 'zh-hk', 'zh-tw']; var translations = languages.map(function (language) { return { lang: language, - path: "strings/" + language + ".json" + path: 'strings/' + language + '.json' }; }); - globalize.defaultModule("core"); + globalize.defaultModule('core'); return globalize.loadStrings({ - name: "core", + name: 'core', translations: translations }); } function onGlobalizeInit(browser) { - if ("android" === self.appMode) { - if (-1 !== self.location.href.toString().toLowerCase().indexOf("start=backgroundsync")) { + if ('android' === self.appMode) { + if (-1 !== self.location.href.toString().toLowerCase().indexOf('start=backgroundsync')) { return onAppReady(browser); } } - document.title = Globalize.translateDocument(document.title, "core"); + document.title = Globalize.translateDocument(document.title, 'core'); if (browser.tv && !browser.android) { - console.debug("using system fonts with explicit sizes"); - require(["systemFontsSizedCss"]); + console.debug('using system fonts with explicit sizes'); + require(['systemFontsSizedCss']); } else { - console.debug("using default fonts"); - require(["systemFontsCss"]); + console.debug('using default fonts'); + require(['systemFontsCss']); } - require(["apphost", "css!assets/css/librarybrowser"], function (appHost) { + require(['apphost', 'css!assets/css/librarybrowser'], function (appHost) { loadPlugins(appHost, browser).then(function () { onAppReady(browser); }); @@ -492,23 +477,23 @@ var AppInfo = {}; } function loadPlugins(appHost, browser, shell) { - console.debug("loading installed plugins"); + console.debug('loading installed plugins'); var list = [ - "components/playback/playaccessvalidation", - "components/playback/experimentalwarnings", - "components/htmlaudioplayer/plugin", - "components/htmlvideoplayer/plugin", - "components/photoplayer/plugin", - "components/youtubeplayer/plugin", - "components/backdropscreensaver/plugin", - "components/logoscreensaver/plugin" + 'components/playback/playaccessvalidation', + 'components/playback/experimentalwarnings', + 'components/htmlaudioplayer/plugin', + 'components/htmlvideoplayer/plugin', + 'components/photoplayer/plugin', + 'components/youtubeplayer/plugin', + 'components/backdropscreensaver/plugin', + 'components/logoscreensaver/plugin' ]; - if (appHost.supports("remotecontrol")) { - list.push("components/sessionplayer"); + if (appHost.supports('remotecontrol')) { + list.push('components/sessionplayer'); if (browser.chrome || browser.opera) { - list.push("components/chromecast/chromecastplayer"); + list.push('components/chromecast/chromecastplayer'); } } @@ -518,7 +503,7 @@ var AppInfo = {}; return new Promise(function (resolve, reject) { Promise.all(list.map(loadPlugin)).then(function () { - require(["packageManager"], function (packageManager) { + require(['packageManager'], function (packageManager) { packageManager.init().then(resolve, reject); }); }, reject); @@ -527,20 +512,20 @@ var AppInfo = {}; function loadPlugin(url) { return new Promise(function (resolve, reject) { - require(["pluginManager"], function (pluginManager) { + require(['pluginManager'], function (pluginManager) { pluginManager.loadPlugin(url).then(resolve, reject); }); }); } function onAppReady(browser) { - console.debug("begin onAppReady"); + console.debug('begin onAppReady'); // ensure that appHost is loaded in this point require(['apphost', 'appRouter'], function (appHost, appRouter) { window.Emby = {}; - console.debug("onAppReady: loading dependencies"); + console.debug('onAppReady: loading dependencies'); if (browser.iOS) { require(['css!assets/css/ios.css']); } @@ -553,39 +538,42 @@ var AppInfo = {}; hashbang: true }); - require(["components/thememediaplayer", "scripts/autobackdrops"]); + require(['components/thememediaplayer', 'scripts/autobackdrops']); if (!browser.tv && !browser.xboxOne && !browser.ps4) { - require(["components/nowplayingbar/nowplayingbar"]); + require(['components/nowplayingbar/nowplayingbar']); } - if (appHost.supports("remotecontrol")) { - require(["playerSelectionMenu", "components/playback/remotecontrolautoplay"]); + if (appHost.supports('remotecontrol')) { + require(['playerSelectionMenu', 'components/playback/remotecontrolautoplay']); } - require(["libraries/screensavermanager"]); + require(['libraries/screensavermanager']); - if (!appHost.supports("physicalvolumecontrol") || browser.touch) { - require(["components/playback/volumeosd"]); + if (!appHost.supports('physicalvolumecontrol') || browser.touch) { + require(['components/playback/volumeosd']); } - require(["mediaSession", "serverNotifications"]); - require(["date-fns", "date-fns/locale"]); + if (navigator.mediaSession || window.NativeShell) { + require(['mediaSession']); + } + require(['serverNotifications']); + require(['date-fns', 'date-fns/locale']); if (!browser.tv && !browser.xboxOne) { - require(["components/playback/playbackorientation"]); + require(['components/playback/playbackorientation']); registerServiceWorker(); if (window.Notification) { - require(["components/notifications/notifications"]); + require(['components/notifications/notifications']); } } - require(["playerSelectionMenu"]); + require(['playerSelectionMenu']); var apiClient = window.ConnectionManager && window.ConnectionManager.currentApiClient(); if (apiClient) { - fetch(apiClient.getUrl("Branding/Css")) + fetch(apiClient.getUrl('Branding/Css')) .then(function(response) { if (!response.ok) { throw new Error(response.status + ' ' + response.statusText); @@ -609,14 +597,14 @@ var AppInfo = {}; function registerServiceWorker() { /* eslint-disable compat/compat */ - if (navigator.serviceWorker && self.appMode !== "cordova" && self.appMode !== "android") { + if (navigator.serviceWorker && self.appMode !== 'cordova' && self.appMode !== 'android') { try { - navigator.serviceWorker.register("serviceworker.js"); + navigator.serviceWorker.register('serviceworker.js'); } catch (err) { - console.error("error registering serviceWorker: " + err); + console.error('error registering serviceWorker: ' + err); } } else { - console.warn("serviceWorker unsupported"); + console.warn('serviceWorker unsupported'); } /* eslint-enable compat/compat */ } @@ -634,7 +622,7 @@ var AppInfo = {}; var localApiClient; (function () { - var urlArgs = "v=" + (window.dashboardVersion || new Date().getDate()); + var urlArgs = 'v=' + (window.dashboardVersion || new Date().getDate()); var bowerPath = getBowerPath(); var componentsPath = getComponentsPath(); @@ -642,66 +630,71 @@ var AppInfo = {}; var scriptsPath = getScriptsPath(); var paths = { - browserdeviceprofile: "scripts/browserdeviceprofile", - browser: "scripts/browser", - libraryBrowser: "scripts/librarybrowser", - inputManager: "scripts/inputManager", - datetime: "scripts/datetime", - globalize: "scripts/globalize", - dfnshelper: "scripts/dfnshelper", - libraryMenu: "scripts/librarymenu", - playlisteditor: componentsPath + "/playlisteditor/playlisteditor", - medialibrarycreator: componentsPath + "/medialibrarycreator/medialibrarycreator", - medialibraryeditor: componentsPath + "/medialibraryeditor/medialibraryeditor", - imageoptionseditor: componentsPath + "/imageoptionseditor/imageoptionseditor", - apphost: componentsPath + "/apphost", - visibleinviewport: bowerPath + "/visibleinviewport", - qualityoptions: componentsPath + "/qualityoptions", - focusManager: componentsPath + "/focusManager", - itemHelper: componentsPath + "/itemhelper", - itemShortcuts: componentsPath + "/shortcuts", - playQueueManager: componentsPath + "/playback/playqueuemanager", - nowPlayingHelper: componentsPath + "/playback/nowplayinghelper", - pluginManager: componentsPath + "/pluginManager", - packageManager: componentsPath + "/packagemanager", - screensaverManager: componentsPath + "/screensavermanager" + browserdeviceprofile: 'scripts/browserdeviceprofile', + browser: 'scripts/browser', + libraryBrowser: 'scripts/librarybrowser', + inputManager: 'scripts/inputManager', + datetime: 'scripts/datetime', + globalize: 'scripts/globalize', + dfnshelper: 'scripts/dfnshelper', + libraryMenu: 'scripts/librarymenu', + playlisteditor: componentsPath + '/playlisteditor/playlisteditor', + medialibrarycreator: componentsPath + '/medialibrarycreator/medialibrarycreator', + medialibraryeditor: componentsPath + '/medialibraryeditor/medialibraryeditor', + imageoptionseditor: componentsPath + '/imageoptionseditor/imageoptionseditor', + apphost: componentsPath + '/apphost', + visibleinviewport: bowerPath + '/visibleinviewport', + qualityoptions: componentsPath + '/qualityoptions', + focusManager: componentsPath + '/focusManager', + itemHelper: componentsPath + '/itemhelper', + itemShortcuts: componentsPath + '/shortcuts', + playQueueManager: componentsPath + '/playback/playqueuemanager', + nowPlayingHelper: componentsPath + '/playback/nowplayinghelper', + pluginManager: componentsPath + '/pluginManager', + packageManager: componentsPath + '/packagemanager', + screensaverManager: componentsPath + '/screensavermanager' }; requirejs.onError = onRequireJsError; requirejs.config({ waitSeconds: 0, map: { - "*": { - css: "components/require/requirecss", - text: "components/require/requiretext" + '*': { + css: 'components/require/requirecss', + text: 'components/require/requiretext' } }, bundles: { bundle: [ - "document-register-element", - "fetch", - "flvjs", - "jstree", - "jQuery", - "hlsjs", - "howler", - "native-promise-only", - "resize-observer-polyfill", - "shaka", - "swiper", - "queryString", - "sortable", - "webcomponents", - "material-icons", - "jellyfin-noto", - "date-fns", - "page", - "polyfill", - "fast-text-encoding", - "intersection-observer", - "classlist-polyfill", - "screenfull", - "headroom" + 'document-register-element', + 'fetch', + 'flvjs', + 'jstree', + 'jQuery', + 'hlsjs', + 'howler', + 'native-promise-only', + 'resize-observer-polyfill', + 'shaka', + 'swiper', + 'queryString', + 'sortable', + 'webcomponents', + 'material-icons', + 'jellyfin-noto', + 'date-fns', + 'page', + 'polyfill', + 'fast-text-encoding', + 'intersection-observer', + 'classlist-polyfill', + 'screenfull', + 'headroom', + 'apiclient', + 'events', + 'credentialprovider', + 'connectionManagerFactory', + 'appStorage' ] }, urlArgs: urlArgs, @@ -709,184 +702,174 @@ var AppInfo = {}; onError: onRequireJsError }); - require(["polyfill"]); - require(["fast-text-encoding"]); - require(["intersection-observer"]); - require(["classlist-polyfill"]); + require(['fetch']); + require(['polyfill']); + require(['fast-text-encoding']); + require(['intersection-observer']); + require(['classlist-polyfill']); // Expose jQuery globally - require(["jQuery"], function(jQuery) { + require(['jQuery'], function(jQuery) { window.$ = jQuery; window.jQuery = jQuery; }); - require(["css!assets/css/site"]); - require(["jellyfin-noto"]); + require(['css!assets/css/site']); + require(['jellyfin-noto']); // define styles // TODO determine which of these files can be moved to the components themselves - define("systemFontsCss", ["css!assets/css/fonts"], returnFirstDependency); - define("systemFontsSizedCss", ["css!assets/css/fonts.sized"], returnFirstDependency); - define("scrollStyles", ["css!assets/css/scrollstyles"], returnFirstDependency); - define("dashboardcss", ["css!assets/css/dashboard"], returnFirstDependency); - define("programStyles", ["css!" + componentsPath + "/guide/programs"], returnFirstDependency); - define("listViewStyle", ["css!" + componentsPath + "/listview/listview"], returnFirstDependency); - define("formDialogStyle", ["css!" + componentsPath + "/formdialog"], returnFirstDependency); - define("clearButtonStyle", ["css!assets/css/clearbutton"], returnFirstDependency); - define("cardStyle", ["css!" + componentsPath + "/cardbuilder/card"], returnFirstDependency); - define("flexStyles", ["css!assets/css/flexstyles"], returnFirstDependency); + define('systemFontsCss', ['css!assets/css/fonts'], returnFirstDependency); + define('systemFontsSizedCss', ['css!assets/css/fonts.sized'], returnFirstDependency); + define('scrollStyles', ['css!assets/css/scrollstyles'], returnFirstDependency); + define('dashboardcss', ['css!assets/css/dashboard'], returnFirstDependency); + define('programStyles', ['css!' + componentsPath + '/guide/programs'], returnFirstDependency); + define('listViewStyle', ['css!' + componentsPath + '/listview/listview'], returnFirstDependency); + define('formDialogStyle', ['css!' + componentsPath + '/formdialog'], returnFirstDependency); + define('clearButtonStyle', ['css!assets/css/clearbutton'], returnFirstDependency); + define('cardStyle', ['css!' + componentsPath + '/cardbuilder/card'], returnFirstDependency); + define('flexStyles', ['css!assets/css/flexstyles'], returnFirstDependency); // define legacy features // TODO delete the rest of these - define("fnchecked", ["legacy/fnchecked"], returnFirstDependency); - define("legacyDashboard", ["legacy/dashboard"], returnFirstDependency); - define("legacySelectMenu", ["legacy/selectmenu"], returnFirstDependency); + define('fnchecked', ['legacy/fnchecked'], returnFirstDependency); + define('legacyDashboard', ['legacy/dashboard'], returnFirstDependency); + define('legacySelectMenu', ['legacy/selectmenu'], returnFirstDependency); // there are several objects that need to be instantiated // TODO find a better way to do this - define("appFooter", [componentsPath + "/appfooter/appfooter"], returnFirstDependency); - define("appFooter-shared", ["appFooter"], createSharedAppFooter); - - // TODO pull apiclient out of this repository - define('events', [bowerPath + "/apiclient/events"], returnFirstDependency); - define('credentialprovider', [bowerPath + "/apiclient/credentialprovider"], returnFirstDependency); - define('connectionManagerFactory', [bowerPath + "/apiclient/connectionmanager"], returnFirstDependency); - define('appStorage', [bowerPath + "/apiclient/appStorage"], returnFirstDependency); - define("serversync", [bowerPath + "/apiclient/sync/serversync"], returnFirstDependency); - define("multiserversync", [bowerPath + "/apiclient/sync/multiserversync"], returnFirstDependency); - define("mediasync", [bowerPath + "/apiclient/sync/mediasync"], returnFirstDependency); - define("itemrepository", [bowerPath + "/apiclient/sync/itemrepository"], returnFirstDependency); - define("useractionrepository", [bowerPath + "/apiclient/sync/useractionrepository"], returnFirstDependency); + define('appFooter', [componentsPath + '/appfooter/appfooter'], returnFirstDependency); + define('appFooter-shared', ['appFooter'], createSharedAppFooter); // TODO remove these libraries // all of these have been modified so we need to fix that first - define("scroller", [bowerPath + "/scroller"], returnFirstDependency); - define("navdrawer", [bowerPath + "/navdrawer/navdrawer"], returnFirstDependency); + define('scroller', [bowerPath + '/scroller'], returnFirstDependency); + define('navdrawer', [bowerPath + '/navdrawer/navdrawer'], returnFirstDependency); - define("emby-button", [elementsPath + "/emby-button/emby-button"], returnFirstDependency); - define("paper-icon-button-light", [elementsPath + "/emby-button/paper-icon-button-light"], returnFirstDependency); - define("emby-checkbox", [elementsPath + "/emby-checkbox/emby-checkbox"], returnFirstDependency); - define("emby-collapse", [elementsPath + "/emby-collapse/emby-collapse"], returnFirstDependency); - define("emby-input", [elementsPath + "/emby-input/emby-input"], returnFirstDependency); - define("emby-progressring", [elementsPath + "/emby-progressring/emby-progressring"], returnFirstDependency); - define("emby-radio", [elementsPath + "/emby-radio/emby-radio"], returnFirstDependency); - define("emby-select", [elementsPath + "/emby-select/emby-select"], returnFirstDependency); - define("emby-slider", [elementsPath + "/emby-slider/emby-slider"], returnFirstDependency); - define("emby-textarea", [elementsPath + "/emby-textarea/emby-textarea"], returnFirstDependency); - define("emby-toggle", [elementsPath + "/emby-toggle/emby-toggle"], returnFirstDependency); - define("emby-scroller", [elementsPath + "/emby-scroller/emby-scroller"], returnFirstDependency); - define("emby-tabs", [elementsPath + "/emby-tabs/emby-tabs"], returnFirstDependency); - define("emby-scrollbuttons", [elementsPath + "/emby-scrollbuttons/emby-scrollbuttons"], returnFirstDependency); - define("emby-itemrefreshindicator", [elementsPath + "/emby-itemrefreshindicator/emby-itemrefreshindicator"], returnFirstDependency); - define("emby-itemscontainer", [elementsPath + "/emby-itemscontainer/emby-itemscontainer"], returnFirstDependency); - define("emby-playstatebutton", [elementsPath + "/emby-playstatebutton/emby-playstatebutton"], returnFirstDependency); - define("emby-ratingbutton", [elementsPath + "/emby-ratingbutton/emby-ratingbutton"], returnFirstDependency); - define("emby-progressbar", [elementsPath + "/emby-progressbar/emby-progressbar"], returnFirstDependency); - define("emby-programcell", [elementsPath + "/emby-programcell/emby-programcell"], returnFirstDependency); + define('emby-button', [elementsPath + '/emby-button/emby-button'], returnFirstDependency); + define('paper-icon-button-light', [elementsPath + '/emby-button/paper-icon-button-light'], returnFirstDependency); + define('emby-checkbox', [elementsPath + '/emby-checkbox/emby-checkbox'], returnFirstDependency); + define('emby-collapse', [elementsPath + '/emby-collapse/emby-collapse'], returnFirstDependency); + define('emby-input', [elementsPath + '/emby-input/emby-input'], returnFirstDependency); + define('emby-progressring', [elementsPath + '/emby-progressring/emby-progressring'], returnFirstDependency); + define('emby-radio', [elementsPath + '/emby-radio/emby-radio'], returnFirstDependency); + define('emby-select', [elementsPath + '/emby-select/emby-select'], returnFirstDependency); + define('emby-slider', [elementsPath + '/emby-slider/emby-slider'], returnFirstDependency); + define('emby-textarea', [elementsPath + '/emby-textarea/emby-textarea'], returnFirstDependency); + define('emby-toggle', [elementsPath + '/emby-toggle/emby-toggle'], returnFirstDependency); + define('emby-scroller', [elementsPath + '/emby-scroller/emby-scroller'], returnFirstDependency); + define('emby-tabs', [elementsPath + '/emby-tabs/emby-tabs'], returnFirstDependency); + define('emby-scrollbuttons', [elementsPath + '/emby-scrollbuttons/emby-scrollbuttons'], returnFirstDependency); + define('emby-itemrefreshindicator', [elementsPath + '/emby-itemrefreshindicator/emby-itemrefreshindicator'], returnFirstDependency); + define('emby-itemscontainer', [elementsPath + '/emby-itemscontainer/emby-itemscontainer'], returnFirstDependency); + define('emby-playstatebutton', [elementsPath + '/emby-playstatebutton/emby-playstatebutton'], returnFirstDependency); + define('emby-ratingbutton', [elementsPath + '/emby-ratingbutton/emby-ratingbutton'], returnFirstDependency); + define('emby-progressbar', [elementsPath + '/emby-progressbar/emby-progressbar'], returnFirstDependency); + define('emby-programcell', [elementsPath + '/emby-programcell/emby-programcell'], returnFirstDependency); - define("webSettings", [scriptsPath + "/settings/webSettings"], returnFirstDependency); - define("appSettings", [scriptsPath + "/settings/appSettings"], returnFirstDependency); - define("userSettings", [scriptsPath + "/settings/userSettings"], returnFirstDependency); + define('webSettings', [scriptsPath + '/settings/webSettings'], returnFirstDependency); + define('appSettings', [scriptsPath + '/settings/appSettings'], returnFirstDependency); + define('userSettings', [scriptsPath + '/settings/userSettings'], returnFirstDependency); - define("chromecastHelper", [componentsPath + "/chromecast/chromecasthelpers"], returnFirstDependency); - define("mediaSession", [componentsPath + "/playback/mediasession"], returnFirstDependency); - define("actionsheet", [componentsPath + "/actionsheet/actionsheet"], returnFirstDependency); - define("tunerPicker", [componentsPath + "/tunerpicker"], returnFirstDependency); - define("mainTabsManager", [componentsPath + "/maintabsmanager"], returnFirstDependency); - define("imageLoader", [componentsPath + "/images/imageLoader"], returnFirstDependency); - define("directorybrowser", [componentsPath + "/directorybrowser/directorybrowser"], returnFirstDependency); - define("metadataEditor", [componentsPath + "/metadataeditor/metadataeditor"], returnFirstDependency); - define("personEditor", [componentsPath + "/metadataeditor/personeditor"], returnFirstDependency); - define("playerSelectionMenu", [componentsPath + "/playback/playerSelectionMenu"], returnFirstDependency); - define("playerSettingsMenu", [componentsPath + "/playback/playersettingsmenu"], returnFirstDependency); - define("playMethodHelper", [componentsPath + "/playback/playmethodhelper"], returnFirstDependency); - define("brightnessOsd", [componentsPath + "/playback/brightnessosd"], returnFirstDependency); - define("alphaNumericShortcuts", [scriptsPath + "/alphanumericshortcuts"], returnFirstDependency); - define("multiSelect", [componentsPath + "/multiselect/multiselect"], returnFirstDependency); - define("alphaPicker", [componentsPath + "/alphapicker/alphapicker"], returnFirstDependency); - define("tabbedView", [componentsPath + "/tabbedview/tabbedview"], returnFirstDependency); - define("itemsTab", [componentsPath + "/tabbedview/itemstab"], returnFirstDependency); - define("collectionEditor", [componentsPath + "/collectioneditor/collectioneditor"], returnFirstDependency); - define("serverRestartDialog", [componentsPath + "/serverRestartDialog"], returnFirstDependency); - define("playlistEditor", [componentsPath + "/playlisteditor/playlisteditor"], returnFirstDependency); - define("recordingCreator", [componentsPath + "/recordingcreator/recordingcreator"], returnFirstDependency); - define("recordingEditor", [componentsPath + "/recordingcreator/recordingeditor"], returnFirstDependency); - define("seriesRecordingEditor", [componentsPath + "/recordingcreator/seriesrecordingeditor"], returnFirstDependency); - define("recordingFields", [componentsPath + "/recordingcreator/recordingfields"], returnFirstDependency); - define("recordingButton", [componentsPath + "/recordingcreator/recordingbutton"], returnFirstDependency); - define("recordingHelper", [componentsPath + "/recordingcreator/recordinghelper"], returnFirstDependency); - define("subtitleEditor", [componentsPath + "/subtitleeditor/subtitleeditor"], returnFirstDependency); - define("subtitleSync", [componentsPath + "/subtitlesync/subtitlesync"], returnFirstDependency); - define("itemIdentifier", [componentsPath + "/itemidentifier/itemidentifier"], returnFirstDependency); - define("itemMediaInfo", [componentsPath + "/itemMediaInfo/itemMediaInfo"], returnFirstDependency); - define("mediaInfo", [componentsPath + "/mediainfo/mediainfo"], returnFirstDependency); - define("itemContextMenu", [componentsPath + "/itemcontextmenu"], returnFirstDependency); - define("imageEditor", [componentsPath + "/imageeditor/imageeditor"], returnFirstDependency); - define("imageDownloader", [componentsPath + "/imagedownloader/imagedownloader"], returnFirstDependency); - define("dom", [scriptsPath + "/dom"], returnFirstDependency); - define("playerStats", [componentsPath + "/playerstats/playerstats"], returnFirstDependency); - define("searchFields", [componentsPath + "/search/searchfields"], returnFirstDependency); - define("searchResults", [componentsPath + "/search/searchresults"], returnFirstDependency); - define("upNextDialog", [componentsPath + "/upnextdialog/upnextdialog"], returnFirstDependency); - define("subtitleAppearanceHelper", [componentsPath + "/subtitlesettings/subtitleappearancehelper"], returnFirstDependency); - define("subtitleSettings", [componentsPath + "/subtitlesettings/subtitlesettings"], returnFirstDependency); - define("displaySettings", [componentsPath + "/displaysettings/displaysettings"], returnFirstDependency); - define("playbackSettings", [componentsPath + "/playbacksettings/playbacksettings"], returnFirstDependency); - define("homescreenSettings", [componentsPath + "/homescreensettings/homescreensettings"], returnFirstDependency); - define("playbackManager", [componentsPath + "/playback/playbackmanager"], getPlaybackManager); - define("layoutManager", [componentsPath + "/layoutManager", "apphost"], getLayoutManager); - define("homeSections", [componentsPath + "/homesections/homesections"], returnFirstDependency); - define("playMenu", [componentsPath + "/playmenu"], returnFirstDependency); - define("refreshDialog", [componentsPath + "/refreshdialog/refreshdialog"], returnFirstDependency); - define("backdrop", [componentsPath + "/backdrop/backdrop"], returnFirstDependency); - define("fetchHelper", [componentsPath + "/fetchhelper"], returnFirstDependency); - define("cardBuilder", [componentsPath + "/cardbuilder/cardBuilder"], returnFirstDependency); - define("peoplecardbuilder", [componentsPath + "/cardbuilder/peoplecardbuilder"], returnFirstDependency); - define("chaptercardbuilder", [componentsPath + "/cardbuilder/chaptercardbuilder"], returnFirstDependency); - define("deleteHelper", [componentsPath + "/deletehelper"], returnFirstDependency); - define("tvguide", [componentsPath + "/guide/guide"], returnFirstDependency); - define("guide-settings-dialog", [componentsPath + "/guide/guide-settings"], returnFirstDependency); - define("loadingDialog", [componentsPath + "/loadingdialog/loadingdialog"], returnFirstDependency); - define("viewManager", [componentsPath + "/viewManager/viewManager"], function (viewManager) { + define('chromecastHelper', [componentsPath + '/chromecast/chromecasthelpers'], returnFirstDependency); + define('mediaSession', [componentsPath + '/playback/mediasession'], returnFirstDependency); + define('actionsheet', [componentsPath + '/actionsheet/actionsheet'], returnFirstDependency); + define('tunerPicker', [componentsPath + '/tunerpicker'], returnFirstDependency); + define('mainTabsManager', [componentsPath + '/maintabsmanager'], returnFirstDependency); + define('imageLoader', [componentsPath + '/images/imageLoader'], returnFirstDependency); + define('directorybrowser', [componentsPath + '/directorybrowser/directorybrowser'], returnFirstDependency); + define('metadataEditor', [componentsPath + '/metadataeditor/metadataeditor'], returnFirstDependency); + define('personEditor', [componentsPath + '/metadataeditor/personeditor'], returnFirstDependency); + define('playerSelectionMenu', [componentsPath + '/playback/playerSelectionMenu'], returnFirstDependency); + define('playerSettingsMenu', [componentsPath + '/playback/playersettingsmenu'], returnFirstDependency); + define('playMethodHelper', [componentsPath + '/playback/playmethodhelper'], returnFirstDependency); + define('brightnessOsd', [componentsPath + '/playback/brightnessosd'], returnFirstDependency); + define('alphaNumericShortcuts', [scriptsPath + '/alphanumericshortcuts'], returnFirstDependency); + define('multiSelect', [componentsPath + '/multiselect/multiselect'], returnFirstDependency); + define('alphaPicker', [componentsPath + '/alphapicker/alphapicker'], returnFirstDependency); + define('tabbedView', [componentsPath + '/tabbedview/tabbedview'], returnFirstDependency); + define('itemsTab', [componentsPath + '/tabbedview/itemstab'], returnFirstDependency); + define('collectionEditor', [componentsPath + '/collectioneditor/collectioneditor'], returnFirstDependency); + define('serverRestartDialog', [componentsPath + '/serverRestartDialog'], returnFirstDependency); + define('playlistEditor', [componentsPath + '/playlisteditor/playlisteditor'], returnFirstDependency); + define('recordingCreator', [componentsPath + '/recordingcreator/recordingcreator'], returnFirstDependency); + define('recordingEditor', [componentsPath + '/recordingcreator/recordingeditor'], returnFirstDependency); + define('seriesRecordingEditor', [componentsPath + '/recordingcreator/seriesrecordingeditor'], returnFirstDependency); + define('recordingFields', [componentsPath + '/recordingcreator/recordingfields'], returnFirstDependency); + define('recordingButton', [componentsPath + '/recordingcreator/recordingbutton'], returnFirstDependency); + define('recordingHelper', [componentsPath + '/recordingcreator/recordinghelper'], returnFirstDependency); + define('subtitleEditor', [componentsPath + '/subtitleeditor/subtitleeditor'], returnFirstDependency); + define('subtitleSync', [componentsPath + '/subtitlesync/subtitlesync'], returnFirstDependency); + define('itemIdentifier', [componentsPath + '/itemidentifier/itemidentifier'], returnFirstDependency); + define('itemMediaInfo', [componentsPath + '/itemMediaInfo/itemMediaInfo'], returnFirstDependency); + define('mediaInfo', [componentsPath + '/mediainfo/mediainfo'], returnFirstDependency); + define('itemContextMenu', [componentsPath + '/itemcontextmenu'], returnFirstDependency); + define('imageEditor', [componentsPath + '/imageeditor/imageeditor'], returnFirstDependency); + define('imageDownloader', [componentsPath + '/imagedownloader/imagedownloader'], returnFirstDependency); + define('dom', [scriptsPath + '/dom'], returnFirstDependency); + define('playerStats', [componentsPath + '/playerstats/playerstats'], returnFirstDependency); + define('searchFields', [componentsPath + '/search/searchfields'], returnFirstDependency); + define('searchResults', [componentsPath + '/search/searchresults'], returnFirstDependency); + define('upNextDialog', [componentsPath + '/upnextdialog/upnextdialog'], returnFirstDependency); + define('subtitleAppearanceHelper', [componentsPath + '/subtitlesettings/subtitleappearancehelper'], returnFirstDependency); + define('subtitleSettings', [componentsPath + '/subtitlesettings/subtitlesettings'], returnFirstDependency); + define('displaySettings', [componentsPath + '/displaysettings/displaysettings'], returnFirstDependency); + define('playbackSettings', [componentsPath + '/playbacksettings/playbacksettings'], returnFirstDependency); + define('homescreenSettings', [componentsPath + '/homescreensettings/homescreensettings'], returnFirstDependency); + define('playbackManager', [componentsPath + '/playback/playbackmanager'], getPlaybackManager); + define('layoutManager', [componentsPath + '/layoutManager', 'apphost'], getLayoutManager); + define('homeSections', [componentsPath + '/homesections/homesections'], returnFirstDependency); + define('playMenu', [componentsPath + '/playmenu'], returnFirstDependency); + define('refreshDialog', [componentsPath + '/refreshdialog/refreshdialog'], returnFirstDependency); + define('backdrop', [componentsPath + '/backdrop/backdrop'], returnFirstDependency); + define('fetchHelper', [componentsPath + '/fetchhelper'], returnFirstDependency); + define('cardBuilder', [componentsPath + '/cardbuilder/cardBuilder'], returnFirstDependency); + define('peoplecardbuilder', [componentsPath + '/cardbuilder/peoplecardbuilder'], returnFirstDependency); + define('chaptercardbuilder', [componentsPath + '/cardbuilder/chaptercardbuilder'], returnFirstDependency); + define('deleteHelper', [componentsPath + '/deletehelper'], returnFirstDependency); + define('tvguide', [componentsPath + '/guide/guide'], returnFirstDependency); + define('guide-settings-dialog', [componentsPath + '/guide/guide-settings'], returnFirstDependency); + define('loadingDialog', [componentsPath + '/loadingdialog/loadingdialog'], returnFirstDependency); + define('viewManager', [componentsPath + '/viewManager/viewManager'], function (viewManager) { window.ViewManager = viewManager; viewManager.dispatchPageEvents(true); return viewManager; }); - define("slideshow", [componentsPath + "/slideshow/slideshow"], returnFirstDependency); - define("focusPreventScroll", ["legacy/focusPreventScroll"], returnFirstDependency); - define("userdataButtons", [componentsPath + "/userdatabuttons/userdatabuttons"], returnFirstDependency); - define("listView", [componentsPath + "/listview/listview"], returnFirstDependency); - define("indicators", [componentsPath + "/indicators/indicators"], returnFirstDependency); - define("viewSettings", [componentsPath + "/viewsettings/viewsettings"], returnFirstDependency); - define("filterMenu", [componentsPath + "/filtermenu/filtermenu"], returnFirstDependency); - define("sortMenu", [componentsPath + "/sortmenu/sortmenu"], returnFirstDependency); - define("idb", [componentsPath + "/idb"], returnFirstDependency); - define("sanitizefilename", [componentsPath + "/sanitizefilename"], returnFirstDependency); - define("toast", [componentsPath + "/toast/toast"], returnFirstDependency); - define("scrollHelper", [componentsPath + "/scrollhelper"], returnFirstDependency); - define("touchHelper", [componentsPath + "/touchhelper"], returnFirstDependency); - define("imageUploader", [componentsPath + "/imageuploader/imageuploader"], returnFirstDependency); - define("htmlMediaHelper", [componentsPath + "/htmlMediaHelper"], returnFirstDependency); - define("viewContainer", [componentsPath + "/viewContainer"], returnFirstDependency); - define("dialogHelper", [componentsPath + "/dialogHelper/dialogHelper"], returnFirstDependency); - define("serverNotifications", [componentsPath + "/serverNotifications"], returnFirstDependency); - define("skinManager", [componentsPath + "/skinManager"], returnFirstDependency); - define("keyboardnavigation", [scriptsPath + "/keyboardnavigation"], returnFirstDependency); - define("mouseManager", [scriptsPath + "/mouseManager"], returnFirstDependency); - define("scrollManager", [componentsPath + "/scrollManager"], returnFirstDependency); - define("autoFocuser", [componentsPath + "/autoFocuser"], returnFirstDependency); - define("connectionManager", [], function () { + define('slideshow', [componentsPath + '/slideshow/slideshow'], returnFirstDependency); + define('focusPreventScroll', ['legacy/focusPreventScroll'], returnFirstDependency); + define('userdataButtons', [componentsPath + '/userdatabuttons/userdatabuttons'], returnFirstDependency); + define('listView', [componentsPath + '/listview/listview'], returnFirstDependency); + define('indicators', [componentsPath + '/indicators/indicators'], returnFirstDependency); + define('viewSettings', [componentsPath + '/viewsettings/viewsettings'], returnFirstDependency); + define('filterMenu', [componentsPath + '/filtermenu/filtermenu'], returnFirstDependency); + define('sortMenu', [componentsPath + '/sortmenu/sortmenu'], returnFirstDependency); + define('idb', [componentsPath + '/idb'], returnFirstDependency); + define('sanitizefilename', [componentsPath + '/sanitizefilename'], returnFirstDependency); + define('toast', [componentsPath + '/toast/toast'], returnFirstDependency); + define('scrollHelper', [componentsPath + '/scrollhelper'], returnFirstDependency); + define('touchHelper', [componentsPath + '/touchhelper'], returnFirstDependency); + define('imageUploader', [componentsPath + '/imageuploader/imageuploader'], returnFirstDependency); + define('htmlMediaHelper', [componentsPath + '/htmlMediaHelper'], returnFirstDependency); + define('viewContainer', [componentsPath + '/viewContainer'], returnFirstDependency); + define('dialogHelper', [componentsPath + '/dialogHelper/dialogHelper'], returnFirstDependency); + define('serverNotifications', [componentsPath + '/serverNotifications'], returnFirstDependency); + define('skinManager', [componentsPath + '/skinManager'], returnFirstDependency); + define('keyboardnavigation', [scriptsPath + '/keyboardnavigation'], returnFirstDependency); + define('mouseManager', [scriptsPath + '/mouseManager'], returnFirstDependency); + define('scrollManager', [componentsPath + '/scrollManager'], returnFirstDependency); + define('autoFocuser', [componentsPath + '/autoFocuser'], returnFirstDependency); + define('connectionManager', [], function () { return ConnectionManager; }); - define("apiClientResolver", [], function () { + define('apiClientResolver', [], function () { return function () { return window.ApiClient; }; }); - define("appRouter", [componentsPath + "/appRouter", "itemHelper"], function (appRouter, itemHelper) { + define('appRouter', [componentsPath + '/appRouter', 'itemHelper'], function (appRouter, itemHelper) { function showItem(item, serverId, options) { - if ("string" == typeof item) { - require(["connectionManager"], function (connectionManager) { + if ('string' == typeof item) { + require(['connectionManager'], function (connectionManager) { var apiClient = connectionManager.currentApiClient(); apiClient.getItem(apiClient.getCurrentUserId(), item).then(function (item) { appRouter.showItem(item, options); @@ -897,58 +880,58 @@ var AppInfo = {}; options = arguments[1]; } - appRouter.show("/" + appRouter.getRouteUrl(item, options), { + appRouter.show('/' + appRouter.getRouteUrl(item, options), { item: item }); } } appRouter.showLocalLogin = function (serverId, manualLogin) { - Dashboard.navigate("login.html?serverid=" + serverId); + Dashboard.navigate('login.html?serverid=' + serverId); }; appRouter.showVideoOsd = function () { - return Dashboard.navigate("videoosd.html"); + return Dashboard.navigate('videoosd.html'); }; appRouter.showSelectServer = function () { - Dashboard.navigate(AppInfo.isNativeApp ? "selectserver.html" : "login.html"); + Dashboard.navigate(AppInfo.isNativeApp ? 'selectserver.html' : 'login.html'); }; appRouter.showWelcome = function () { - Dashboard.navigate(AppInfo.isNativeApp ? "selectserver.html" : "login.html"); + Dashboard.navigate(AppInfo.isNativeApp ? 'selectserver.html' : 'login.html'); }; appRouter.showSettings = function () { - Dashboard.navigate("mypreferencesmenu.html"); + Dashboard.navigate('mypreferencesmenu.html'); }; appRouter.showGuide = function () { - Dashboard.navigate("livetv.html?tab=1"); + Dashboard.navigate('livetv.html?tab=1'); }; appRouter.goHome = function () { - Dashboard.navigate("home.html"); + Dashboard.navigate('home.html'); }; appRouter.showSearch = function () { - Dashboard.navigate("search.html"); + Dashboard.navigate('search.html'); }; appRouter.showLiveTV = function () { - Dashboard.navigate("livetv.html"); + Dashboard.navigate('livetv.html'); }; appRouter.showRecordedTV = function () { - Dashboard.navigate("livetv.html?tab=3"); + Dashboard.navigate('livetv.html?tab=3'); }; appRouter.showFavorites = function () { - Dashboard.navigate("home.html?tab=1"); + Dashboard.navigate('home.html?tab=1'); }; appRouter.showSettings = function () { - Dashboard.navigate("mypreferencesmenu.html"); + Dashboard.navigate('mypreferencesmenu.html'); }; appRouter.setTitle = function (title) { @@ -957,7 +940,7 @@ var AppInfo = {}; appRouter.getRouteUrl = function (item, options) { if (!item) { - throw new Error("item cannot be null"); + throw new Error('item cannot be null'); } if (item.url) { @@ -975,168 +958,168 @@ var AppInfo = {}; var itemType = item.Type || (options ? options.itemType : null); var serverId = item.ServerId || options.serverId; - if ("settings" === item) { - return "mypreferencesmenu.html"; + if ('settings' === item) { + return 'mypreferencesmenu.html'; } - if ("wizard" === item) { - return "wizardstart.html"; + if ('wizard' === item) { + return 'wizardstart.html'; } - if ("manageserver" === item) { - return "dashboard.html"; + if ('manageserver' === item) { + return 'dashboard.html'; } - if ("recordedtv" === item) { - return "livetv.html?tab=3&serverId=" + options.serverId; + if ('recordedtv' === item) { + return 'livetv.html?tab=3&serverId=' + options.serverId; } - if ("nextup" === item) { - return "list.html?type=nextup&serverId=" + options.serverId; + if ('nextup' === item) { + return 'list.html?type=nextup&serverId=' + options.serverId; } - if ("list" === item) { - var url = "list.html?serverId=" + options.serverId + "&type=" + options.itemTypes; + if ('list' === item) { + var url = 'list.html?serverId=' + options.serverId + '&type=' + options.itemTypes; if (options.isFavorite) { - url += "&IsFavorite=true"; + url += '&IsFavorite=true'; } return url; } - if ("livetv" === item) { - if ("programs" === options.section) { - return "livetv.html?tab=0&serverId=" + options.serverId; + if ('livetv' === item) { + if ('programs' === options.section) { + return 'livetv.html?tab=0&serverId=' + options.serverId; } - if ("guide" === options.section) { - return "livetv.html?tab=1&serverId=" + options.serverId; + if ('guide' === options.section) { + return 'livetv.html?tab=1&serverId=' + options.serverId; } - if ("movies" === options.section) { - return "list.html?type=Programs&IsMovie=true&serverId=" + options.serverId; + if ('movies' === options.section) { + return 'list.html?type=Programs&IsMovie=true&serverId=' + options.serverId; } - if ("shows" === options.section) { - return "list.html?type=Programs&IsSeries=true&IsMovie=false&IsNews=false&serverId=" + options.serverId; + if ('shows' === options.section) { + return 'list.html?type=Programs&IsSeries=true&IsMovie=false&IsNews=false&serverId=' + options.serverId; } - if ("sports" === options.section) { - return "list.html?type=Programs&IsSports=true&serverId=" + options.serverId; + if ('sports' === options.section) { + return 'list.html?type=Programs&IsSports=true&serverId=' + options.serverId; } - if ("kids" === options.section) { - return "list.html?type=Programs&IsKids=true&serverId=" + options.serverId; + if ('kids' === options.section) { + return 'list.html?type=Programs&IsKids=true&serverId=' + options.serverId; } - if ("news" === options.section) { - return "list.html?type=Programs&IsNews=true&serverId=" + options.serverId; + if ('news' === options.section) { + return 'list.html?type=Programs&IsNews=true&serverId=' + options.serverId; } - if ("onnow" === options.section) { - return "list.html?type=Programs&IsAiring=true&serverId=" + options.serverId; + if ('onnow' === options.section) { + return 'list.html?type=Programs&IsAiring=true&serverId=' + options.serverId; } - if ("dvrschedule" === options.section) { - return "livetv.html?tab=4&serverId=" + options.serverId; + if ('dvrschedule' === options.section) { + return 'livetv.html?tab=4&serverId=' + options.serverId; } - if ("seriesrecording" === options.section) { - return "livetv.html?tab=5&serverId=" + options.serverId; + if ('seriesrecording' === options.section) { + return 'livetv.html?tab=5&serverId=' + options.serverId; } - return "livetv.html?serverId=" + options.serverId; + return 'livetv.html?serverId=' + options.serverId; } - if ("SeriesTimer" == itemType) { - return "itemdetails.html?seriesTimerId=" + id + "&serverId=" + serverId; + if ('SeriesTimer' == itemType) { + return 'itemdetails.html?seriesTimerId=' + id + '&serverId=' + serverId; } - if ("livetv" == item.CollectionType) { - return "livetv.html"; + if ('livetv' == item.CollectionType) { + return 'livetv.html'; } - if ("Genre" === item.Type) { - url = "list.html?genreId=" + item.Id + "&serverId=" + serverId; + if ('Genre' === item.Type) { + url = 'list.html?genreId=' + item.Id + '&serverId=' + serverId; - if ("livetv" === context) { - url += "&type=Programs"; + if ('livetv' === context) { + url += '&type=Programs'; } if (options.parentId) { - url += "&parentId=" + options.parentId; + url += '&parentId=' + options.parentId; } return url; } - if ("MusicGenre" === item.Type) { - url = "list.html?musicGenreId=" + item.Id + "&serverId=" + serverId; + if ('MusicGenre' === item.Type) { + url = 'list.html?musicGenreId=' + item.Id + '&serverId=' + serverId; if (options.parentId) { - url += "&parentId=" + options.parentId; + url += '&parentId=' + options.parentId; } return url; } - if ("Studio" === item.Type) { - url = "list.html?studioId=" + item.Id + "&serverId=" + serverId; + if ('Studio' === item.Type) { + url = 'list.html?studioId=' + item.Id + '&serverId=' + serverId; if (options.parentId) { - url += "&parentId=" + options.parentId; + url += '&parentId=' + options.parentId; } return url; } - if ("folders" !== context && !itemHelper.isLocalItem(item)) { - if ("movies" == item.CollectionType) { - url = "movies.html?topParentId=" + item.Id; + if ('folders' !== context && !itemHelper.isLocalItem(item)) { + if ('movies' == item.CollectionType) { + url = 'movies.html?topParentId=' + item.Id; - if (options && "latest" === options.section) { - url += "&tab=1"; + if (options && 'latest' === options.section) { + url += '&tab=1'; } return url; } - if ("tvshows" == item.CollectionType) { - url = "tv.html?topParentId=" + item.Id; + if ('tvshows' == item.CollectionType) { + url = 'tv.html?topParentId=' + item.Id; - if (options && "latest" === options.section) { - url += "&tab=2"; + if (options && 'latest' === options.section) { + url += '&tab=2'; } return url; } - if ("music" == item.CollectionType) { - return "music.html?topParentId=" + item.Id; + if ('music' == item.CollectionType) { + return 'music.html?topParentId=' + item.Id; } } - var itemTypes = ["Playlist", "TvChannel", "Program", "BoxSet", "MusicAlbum", "MusicGenre", "Person", "Recording", "MusicArtist"]; + var itemTypes = ['Playlist', 'TvChannel', 'Program', 'BoxSet', 'MusicAlbum', 'MusicGenre', 'Person', 'Recording', 'MusicArtist']; if (itemTypes.indexOf(itemType) >= 0) { - return "itemdetails.html?id=" + id + "&serverId=" + serverId; + return 'itemdetails.html?id=' + id + '&serverId=' + serverId; } - var contextSuffix = context ? "&context=" + context : ""; + var contextSuffix = context ? '&context=' + context : ''; - if ("Series" == itemType || "Season" == itemType || "Episode" == itemType) { - return "itemdetails.html?id=" + id + contextSuffix + "&serverId=" + serverId; + if ('Series' == itemType || 'Season' == itemType || 'Episode' == itemType) { + return 'itemdetails.html?id=' + id + contextSuffix + '&serverId=' + serverId; } if (item.IsFolder) { if (id) { - return "list.html?parentId=" + id + "&serverId=" + serverId; + return 'list.html?parentId=' + id + '&serverId=' + serverId; } - return "#"; + return '#'; } - return "itemdetails.html?id=" + id + "&serverId=" + serverId; + return 'itemdetails.html?id=' + id + '&serverId=' + serverId; }; appRouter.showItem = showItem; @@ -1144,13 +1127,13 @@ var AppInfo = {}; }); })(); - return require(["browser"], onWebComponentsReady); + return require(['browser'], onWebComponentsReady); }(); -pageClassOn("viewshow", "standalonePage", function () { - document.querySelector(".skinHeader").classList.add("noHeaderRight"); +pageClassOn('viewshow', 'standalonePage', function () { + document.querySelector('.skinHeader').classList.add('noHeaderRight'); }); -pageClassOn("viewhide", "standalonePage", function () { - document.querySelector(".skinHeader").classList.remove("noHeaderRight"); +pageClassOn('viewhide', 'standalonePage', function () { + document.querySelector('.skinHeader').classList.remove('noHeaderRight'); }); diff --git a/src/scripts/taskbutton.js b/src/scripts/taskbutton.js index 6159ad9fe..8facaf890 100644 --- a/src/scripts/taskbutton.js +++ b/src/scripts/taskbutton.js @@ -1,5 +1,5 @@ -define(["events", "userSettings", "serverNotifications", "connectionManager", "globalize", "emby-button"], function (events, userSettings, serverNotifications, connectionManager, globalize) { - "use strict"; +define(['events', 'userSettings', 'serverNotifications', 'connectionManager', 'globalize', 'emby-button'], function (events, userSettings, serverNotifications, connectionManager, globalize) { + 'use strict'; return function (options) { function pollTasks() { @@ -26,12 +26,12 @@ define(["events", "userSettings", "serverNotifications", "connectionManager", "g } if (task.State == 'Idle') { - button.removeAttribute("disabled"); + button.removeAttribute('disabled'); } else { - button.setAttribute("disabled", "disabled"); + button.setAttribute('disabled', 'disabled'); } - button.setAttribute("data-taskid", task.Id); + button.setAttribute('data-taskid', task.Id); var progress = (task.CurrentProgressPercentage || 0).toFixed(1); if (options.progressElem) { @@ -47,11 +47,11 @@ define(["events", "userSettings", "serverNotifications", "connectionManager", "g if (options.lastResultElem) { var lastResult = task.LastExecutionResult ? task.LastExecutionResult.Status : ''; - if (lastResult == "Failed") { + if (lastResult == 'Failed') { options.lastResultElem.html('(' + globalize.translate('LabelFailed') + ')'); - } else if (lastResult == "Cancelled") { + } else if (lastResult == 'Cancelled') { options.lastResultElem.html('(' + globalize.translate('LabelCancelled') + ')'); - } else if (lastResult == "Aborted") { + } else if (lastResult == 'Aborted') { options.lastResultElem.html('' + globalize.translate('LabelAbortedByServerShutdown') + ''); } else { options.lastResultElem.html(lastResult); @@ -64,7 +64,7 @@ define(["events", "userSettings", "serverNotifications", "connectionManager", "g } function onButtonClick() { - onScheduledTaskMessageConfirmed(this.getAttribute("data-taskid")); + onScheduledTaskMessageConfirmed(this.getAttribute('data-taskid')); } function onScheduledTasksUpdate(e, apiClient, info) { @@ -89,12 +89,12 @@ define(["events", "userSettings", "serverNotifications", "connectionManager", "g if (pollInterval) { clearInterval(pollInterval); } - apiClient.sendMessage("ScheduledTasksInfoStart", "1000,1000"); + apiClient.sendMessage('ScheduledTasksInfoStart', '1000,1000'); pollInterval = setInterval(onPollIntervalFired, 5000); } function stopInterval() { - connectionManager.getApiClient(serverId).sendMessage("ScheduledTasksInfoStop"); + connectionManager.getApiClient(serverId).sendMessage('ScheduledTasksInfoStop'); if (pollInterval) { clearInterval(pollInterval); @@ -102,18 +102,18 @@ define(["events", "userSettings", "serverNotifications", "connectionManager", "g } if (options.panel) { - options.panel.classList.add("hide"); + options.panel.classList.add('hide'); } if (options.mode == 'off') { - button.removeEventListener("click", onButtonClick); - events.off(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + button.removeEventListener('click', onButtonClick); + events.off(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate); stopInterval(); } else { - button.addEventListener("click", onButtonClick); + button.addEventListener('click', onButtonClick); pollTasks(); startInterval(); - events.on(serverNotifications, "ScheduledTasksInfo", onScheduledTasksUpdate); + events.on(serverNotifications, 'ScheduledTasksInfo', onScheduledTasksUpdate); } }; }); diff --git a/src/scripts/themeloader.js b/src/scripts/themeloader.js index ea7ff57f9..f75d6d0e2 100644 --- a/src/scripts/themeloader.js +++ b/src/scripts/themeloader.js @@ -1,19 +1,19 @@ -define(["userSettings", "skinManager", "connectionManager", "events"], function (userSettings, skinManager, connectionManager, events) { - "use strict"; +define(['userSettings', 'skinManager', 'connectionManager', 'events'], function (userSettings, skinManager, connectionManager, events) { + 'use strict'; var currentViewType; - pageClassOn("viewbeforeshow", "page", function () { + pageClassOn('viewbeforeshow', 'page', function () { var classList = this.classList; - var viewType = classList.contains("type-interior") || classList.contains("wizardPage") ? "a" : "b"; + var viewType = classList.contains('type-interior') || classList.contains('wizardPage') ? 'a' : 'b'; if (viewType !== currentViewType) { currentViewType = viewType; var theme; var context; - if ("a" === viewType) { + if ('a' === viewType) { theme = userSettings.dashboardTheme(); - context = "serverdashboard"; + context = 'serverdashboard'; } else { theme = userSettings.theme(); } @@ -21,7 +21,7 @@ define(["userSettings", "skinManager", "connectionManager", "events"], function skinManager.setTheme(theme, context); } }); - events.on(connectionManager, "localusersignedin", function (e, user) { + events.on(connectionManager, 'localusersignedin', function (e, user) { currentViewType = null; }); }); diff --git a/src/serviceworker.js b/src/serviceworker.js index c43d1f4b4..221018314 100644 --- a/src/serviceworker.js +++ b/src/serviceworker.js @@ -1,2 +1,2 @@ /* eslint-env serviceworker */ -importScripts("components/serviceworker/notifications.js"); +importScripts('components/serviceworker/notifications.js'); diff --git a/src/standalone.js b/src/standalone.js index 04d40d6b1..237872703 100644 --- a/src/standalone.js +++ b/src/standalone.js @@ -1,4 +1,4 @@ (function() { - "use strict"; + 'use strict'; window.appMode = 'standalone'; })(); diff --git a/src/strings/af.json b/src/strings/af.json index 7cbaab20d..5c4e13dc7 100644 --- a/src/strings/af.json +++ b/src/strings/af.json @@ -41,5 +41,128 @@ "Actor": "Akteur", "AccessRestrictedTryAgainLater": "Toegang is beperk. Probeer weer later .", "Absolute": "Absoluut", - "AlbumArtist": "Album Kunstenaar" + "AlbumArtist": "Album Kunstenaar", + "TabLatest": "Nuutste", + "TabInfo": "Inligting", + "TabGuide": "Gids", + "TabGenres": "Genres", + "TabFavorites": "Gunstellinge", + "TabEpisodes": "Episodes", + "TabDisplay": "Vertoon", + "TabDirectPlay": "Speel Direk", + "TabDevices": "Toestelle", + "TabDashboard": "Paneelbord", + "TabContainers": "Houers", + "Collections": "Versamelings", + "TabCollections": "Versamelings", + "UnsupportedPlayback": "Jellyfin kan nie inhoud wat beskerm word deur DRM ontsuifer nie, maar daar sal 'n poging aangwend word inelkgeval, insluitend beskermde titels. Sommige leêrs mag geheel en al swart verksyn weens enkripsie of ander on-ondersteunde funksies, byvoorbeeld interaktiewe titels.", + "OnApplicationStartup": "Op applikasie begin", + "EveryXHours": "Elke {0} ure", + "EveryHour": "Elke uur", + "EveryXMinutes": "Elke {0} minute", + "OnWakeFromSleep": "Op wakker word van slaap", + "WeeklyAt": "{0}s teen {1}", + "DailyAt": "Daagliks teen {0}", + "LastSeen": "Laas gekyk {0}", + "PersonRole": "soos {0}", + "ListPaging": "{0}-{1} van {2}", + "WriteAccessRequired": "Jellyfin Bediener benodig skryf toegang tot die leêr. Maak asseblief seker dat dit skryf toegang het en probeer weer.", + "PathNotFound": "Die pad kon nie gevind word nie. Maak asseblief seker dat die pad geldig is en probeer weer.", + "Yesterday": "Gister", + "Yes": "Ja", + "XmlTvSportsCategoriesHelp": "Programme met die kategorieë sal vertoon word as sport programme. Verdeel met veelvuldige '|'.", + "XmlTvPathHelp": "'n Pad tot 'n XMLTV lêer. Jellyfin sal die lêer lees en van tyd tot tyd soek vir opdaterings. Jy is verantwoordelik vir die maak en opdatering van die lêer.", + "XmlTvNewsCategoriesHelp": "Programme met die kategorieë sal vertoon word as nuus programme. Verdeel met veelvuldige '|'.", + "XmlTvMovieCategoriesHelp": "Programme met die kategorieë sal vertoon word as replprente. Verdeel met veelvuldige '|'.", + "XmlTvKidsCategoriesHelp": "Programme met die kategorieë sal vertoon word as programme vir kinders. Verdeel met veelvuldige '|'.", + "XmlDocumentAttributeListHelp": "Hierdie kenmerke word toegepas tot die wortel element van elke XML reaksie.", + "Writer": "Skrywer", + "WizardCompleted": "Dit is al wat ons benodig vir nou. Jellyfin het begin om inligting van jou media biblioteek te versamel. Kyk na van ons apps, en dan klik Finaliseer om die Paneelbord.", + "Whitelist": "Witlys", + "WelcomeToProject": "Welkom tot Jellyfin!", + "Wednesday": "Woensdag", + "Watched": "Gekyk", + "ViewPlaybackInfo": "Beskou terugspeel inligting", + "ViewArtist": "Beskou kunstenaar", + "ViewAlbum": "Beskou album", + "VideoRange": "Video reekse", + "Vertical": "Vertikaal", + "ValueVideoCodec": "Video Kodek: {0}", + "ValueTimeLimitSingleHour": "Tyd limiet: 1 uur", + "ValueTimeLimitMultiHour": "Tyd limiet: {0} ure", + "ValueSpecialEpisodeName": "Spesiale - {0}", + "ValueSongCount": "{0} liedjies", + "ValueSeriesCount": "{0} reekse", + "ValueSeconds": "{0} sekondes", + "ValueOneSong": "1 liedjie", + "ValueOneSeries": "1 reeks", + "ValueOneMusicVideo": "1 musiek video", + "ValueOneMovie": "1 rolprent", + "ValueMusicVideoCount": "{0} musiek videos", + "ValueMovieCount": "{0} rolprente", + "ValueMinutes": "{0} minute", + "ValueDiscNumber": "Skyf {0}", + "ValueContainer": "Houers: {0}", + "ValueConditions": "Kondisies: {0}", + "ValueCodec": "Kodek: {0}", + "ValueAudioCodec": "Audio Kodec: {0}", + "ValueAlbumCount": "{0} albums", + "UserProfilesIntro": "Jellyfin verskaf ondersteuning vir gebruiker profiele met pas instellings vir vertoon, speel staat, en ouer-beheer.", + "UserAgentHelp": "Verskaf 'n pas gebruiker-agent HTTP opskrif.", + "Upload": "Oplaai", + "Up": "Op", + "Unplayed": "Ongespeel", + "Unmute": "Ontstom", + "UninstallPluginHeader": "Oninstalleer Plugin", + "UninstallPluginConfirmation": "Is jy seker jy wil voortgaan met die oninstallasie {0}?", + "Uniform": "Uniform", + "TvLibraryHelp": "Hersien die {0}TV benamings gids{1}.", + "Tuesday": "Dinsdag", + "Transcoding": "Trankodering", + "Trailers": "Voorprente", + "TrackCount": "{0} nommers", + "Track": "Nommer", + "TitlePlayback": "Terugspeel", + "TitleHostingSettings": "Hosting Instellings", + "TitleHardwareAcceleration": "Hardeware Versnelling", + "Thursday": "Donderdag", + "Thumb": "Duim", + "ThisWizardWillGuideYou": "Hierdie gids sal jou deur die opstel proses help. Om te begin, kies asseblief jou taal van voorkeur.", + "TheseSettingsAffectSubtitlesOnThisDevice": "Hierdie instellings affekteer die sub-titels vie hierdie toestel", + "ThemeVideos": "Tema Videos", + "ThemeSongs": "Tema Liedjies", + "TellUsAboutYourself": "Vertel ons van jouself", + "TabUsers": "Gebruikers", + "TabUpcoming": "Komende", + "TabTranscoding": "Transkodering", + "TabTrailers": "Voorprente", + "TabSuggestions": "Voorstelle", + "TabStreaming": "Stroom", + "TabSongs": "Liedjies", + "TabShows": "Programme", + "TabSettings": "Instellings", + "TabServer": "Bediener", + "TabSeries": "Reekse", + "TabScheduledTasks": "Geskeduleerde Take", + "TabResumeSettings": "Hervat", + "TabResponses": "Reaksies", + "TabRecordings": "Opnames", + "TabProfiles": "Profiele", + "TabProfile": "Profiel", + "TabPlaylists": "Speel lyste", + "TabPlaylist": "Speel lys", + "TabPlayback": "Terugspeel", + "TabPassword": "Wagwoord", + "TabParentalControl": "Ouer Beheer", + "TabOther": "Ander", + "TabNotifications": "Kennisgewings", + "TabNfoSettings": "NFO Instellings", + "TabNetworking": "Netwerking", + "TabNetworks": "Netwerke", + "TabMusicVideos": "Musiek Videos", + "TabMusic": "Musiek", + "TabMovies": "Rolprente", + "TabMetadata": "Meta Inligting", + "TabLogs": "Logs", + "TabLiveTV": "Lewendige TV" } diff --git a/src/strings/ar.json b/src/strings/ar.json index 50b93a830..f6f64c5d4 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -962,7 +962,7 @@ "AllowMediaConversion": "السماح بتحويل الوسائظ", "AllLanguages": "كل اللغات", "AllEpisodes": "كل الحلقات", - "AllComplexFormats": "جميع التنسيقات المعقدة (ASS ، SSA ، VOBSUB ، PGS ، SUB / IDX ، إلخ.)", + "AllComplexFormats": "جميع التنسيقات المعقدة (ASS ، SSA ، VOBSUB ، PGS ، SUB / IDX ، ...)", "AllChannels": "كل القنوات", "Albums": "ألبومات", "Aired": "عرضت", diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 7cfc56bb2..8357a9c8d 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -96,7 +96,7 @@ "DatePlayed": "Дата на пускане", "DeathDateValue": "Починал/а на: {0}", "Default": "По подразбиране", - "Delete": "Изтриване", + "Delete": "Премахване", "DeleteMedia": "Изтриване на медията", "Desktop": "Работен плот", "DeviceAccessHelp": "Това се отнася само за устройства, които могат да бъдат различени и няма да попречи на достъп от мрежов четец. Филтрирането на потребителски устройства ще предотврати използването им докато не бъдат одобрени тук.", @@ -897,5 +897,11 @@ "ConfigureDateAdded": "Конфигурацията на добавянето на датата се определя в панела на Jellyfin сървъра в секцията за настройка на библиотека", "ConfirmDeleteItems": "Изтриването на елементите ще ги премахне едновременно от файловата система и библиотеката. Сигурни ли сте, че искате да продължите?", "ColorTransfer": "Предаване на цвета", - "ColorPrimaries": "Основни цветове" + "ColorPrimaries": "Основни цветове", + "DeleteUserConfirmation": "Сигурнили сте че искате да премахнете този потребител?", + "DeleteUser": "Премахване на потребител", + "DeleteImageConfirmation": "Сигурнили сте че искате да премахнете това Изображение?", + "DeleteImage": "Премахване на Исображение", + "ButtonTogglePlaylist": "Списък с изпълнения", + "ButtonToggleContextMenu": "Повече" } diff --git a/src/strings/ca.json b/src/strings/ca.json index f3cc97ece..df1cdf28f 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -7,7 +7,7 @@ "All": "Tot", "AllChannels": "Tots els canals", "AllEpisodes": "Tots els episodis", - "AlwaysPlaySubtitles": "Reprodueix sempre amb subtítols", + "AlwaysPlaySubtitles": "Reprodueix sempre", "AroundTime": "Cap a les {0}", "Artists": "Artistes", "AsManyAsPossible": "Tants com sigui possible", @@ -795,5 +795,28 @@ "AddedOnValue": "Afegit {0}", "AddItemToCollectionHelp": "Afegiu els elements a les col·leccions buscant-los i fent clic amb el botó dret o toqueu els menús per afegir-los a una col·lecció.", "Actor": "Actor", - "Absolute": "Absolut" + "Absolute": "Absolut", + "ClientSettings": "Configuració del client", + "CinemaModeConfigurationHelp": "El mode Cinema aporta l'experiència del teatre directament a la sala d'estar amb la possibilitat de jugar a tràilers i presentacions personalitzades abans de la funció principal.", + "ChannelNameOnly": "Número de canal", + "ChangingMetadataImageSettingsNewContent": "Els canvis als paràmetres de descàrrega de metadades o d'obra d'art només s'apliquen al contingut nou afegit a la biblioteca. Per aplicar els canvis als títols existents, haureu de refrescar les metadades manualment.", + "ButtonTogglePlaylist": "Llista de reproducció", + "ButtonToggleContextMenu": "més", + "ButtonOff": "Apagar", + "BurnSubtitlesHelp": "Determina si el servidor hauria de gravar-se en els subtítols en transcodificar vídeos. Evitar això millorarà molt el rendiment. Seleccioneu Automàtica per gravar formats basats en imatges (VOBSUB, PGS, SUB, IDX) i certs subtítols ASS o SSA.", + "Browse": "Navega", + "BoxRear": "Caixa (posterior)", + "BoxSet": "conjunt de caixes", + "Box": "Caixa", + "BookLibraryHelp": "Els àudio i llibres de text són compatibles. Reviseu la {0} guia de denominació de llibres {1}.", + "Backdrops": "Fons", + "Backdrop": "Fons", + "AutoBasedOnLanguageSetting": "Auto (basada en la configuració de l’idioma)", + "Artist": "Artista", + "AllowedRemoteAddressesHelp": "Llista d’adreces IP o d’entrades IP / netmasca separades per comes per a xarxes que podran connectar-se de forma remota. Si es deixa en blanc, es permetran totes les adreces remotes.", + "AllowFfmpegThrottlingHelp": "Quan un transcòdi o un remux estigui prou lluny de la posició de reproducció actual, feu una pausa en el procés perquè consumirà menys recursos. Això és més útil per mirar sense buscar sovint. Desactiveu-la si teniu problemes de reproducció.", + "AllowFfmpegThrottling": "Transcodes de l’acceleració", + "AllowOnTheFlySubtitleExtractionHelp": "Els subtítols incrustats es poden extreure de vídeos i entregar-los a clients en text senzill per tal d'evitar la transcodificació de vídeo. En alguns sistemes, això pot trigar molt i fer que la reproducció de vídeo s’aturi durant el procés d’extracció. Desactiveu-ho per tenir subtítols incrustats incrustats amb la transcodificació de vídeo quan no són compatibles amb el dispositiu client de forma nativa.", + "AlbumArtist": "Album artista", + "Album": "Album" } diff --git a/src/strings/cs.json b/src/strings/cs.json index b7f2f7b9d..5e52da3f5 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1604,5 +1604,9 @@ "LabelDeinterlaceMethod": "Metoda odstranění prokládání:", "DeinterlaceMethodHelp": "Vyberte metodu odstranění prokládání obrazu při překódování obsahu.", "UnsupportedPlayback": "Jellyfin nemůže dešifrovat obsah chráněný technologií DRM, ale pokusí se zobrazit o veškerý obsah, včetně chráněných titulů. Některé soubory se mohou zdát úplně černé kvůli šifrování nebo jiným nepodporovaným funkcím, jako jsou například interaktivní funkce.", - "MessageUnauthorizedUser": "Momentálně nemáte oprávnění k přístupu na server. Další informace získáte od správce serveru." + "MessageUnauthorizedUser": "Momentálně nemáte oprávnění k přístupu na server. Další informace získáte od správce serveru.", + "Filter": "Filtr", + "New": "Nové", + "ButtonTogglePlaylist": "Playlist", + "ButtonToggleContextMenu": "Více" } diff --git a/src/strings/da.json b/src/strings/da.json index a2b4cb6a4..5e7bbd2e1 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -12,11 +12,11 @@ "AllChannels": "Alle kanaler", "AllEpisodes": "Alle episoder", "AllLibraries": "Alle biblioteker", - "AllowHWTranscodingHelp": "Tillader tuneren at omkode streaming on-the-fly. Dette kan hjælpe med at reducere belastning af serveren på grund af yderligere omkodning.", + "AllowHWTranscodingHelp": "Tillader tuneren at transkode streams \"on the fly\". Dette kan hjælpe med at reducere transkodningen, der kræves af serveren.", "AllowMediaConversion": "Tillad media konvertering", "AllowMediaConversionHelp": "Giv eller nægt adgang til Konvertér Media featuren.", "AllowOnTheFlySubtitleExtraction": "Tillad udtræk af undertekster on-the-fly", - "AllowOnTheFlySubtitleExtractionHelp": "Indeholdte undertekster kan trækkes ud af videoer og leveres til klienter i ren tekst for at afhjælpe video kodning. På nogle systemer kan dette tage lang tid og forårsage at afspilning kan hænge mens den udtrækker. Slå dette fra, for at have undertekster brændt ind i video kodningen når det er supporteret på klient enheden.", + "AllowOnTheFlySubtitleExtractionHelp": "Indeholdte undertekster kan trækkes ud af videoer og leveres til klienter i ren tekst for at afhjælpe video omkodning. På nogle systemer kan dette tage lang tid og forårsage at afspilning kan hænge mens den udtrækker. Slå dette fra, for at have undertekster brændt ind i vha. video omkodningen når der ikke er indbygget understøttelse for ren tekst undertekster i klient enheden.", "AllowRemoteAccess": "Tillad fjernadgang til denne Jellyfin Server.", "AllowRemoteAccessHelp": "Hvis ikke markeret, vil alle fjernforbindelser blive blokeret.", "AllowedRemoteAddressesHelp": "Komma seperareret liste over IP adresser og netmasker der har ret til fjernadgang. Hvis blank er alle adresser tilladte.", @@ -29,7 +29,7 @@ "BirthDateValue": "Født: {0}", "BirthLocation": "Fødselslokation", "BirthPlaceValue": "Fødselssted: {0}", - "BookLibraryHelp": "Lyd- og tekstbøger er understøttet. Se {0}bog guide til navngivning af bøger{1}.", + "BookLibraryHelp": "Lyd- og tekstbøger er understøttet. Se {0}guiden til navngivning af bøger{1}.", "Browse": "Gennemse", "BrowsePluginCatalogMessage": "Gennemse vores plugin-katalog for at se tilgængelige plugins.", "ButtonAdd": "Tilføj", @@ -1117,7 +1117,7 @@ "AutomaticallySyncNewContentHelp": "Nyt indhold tilføjet til denne mappe vil automatisk blive downloadet til enheden.", "Backdrop": "Baggrund", "Backdrops": "Baggrunde", - "Banner": "Bannere", + "Banner": "Banner", "Blacklist": "Blackliste", "Box": "Boks", "BoxRear": "Boks (bagside)", @@ -1628,16 +1628,20 @@ "Episode": "Afsnit", "DeinterlaceMethodHelp": "Vælg hvilken konverteringsmulighed der skal bruges til transkodning af indhold.", "CopyStreamURLError": "Der skete en fejl med at kopiere URL'en.", - "CopyStreamURLSuccess": "URL er kopiret succesfuldt.", - "CopyStreamURL": "Kopir Stream URL", + "CopyStreamURLSuccess": "URL blev kopieret.", + "CopyStreamURL": "Kopiér stream URL", "ClientSettings": "Klient Indstillinger", "ButtonSplit": "Opdel", "BoxSet": "Box Set", - "AuthProviderHelp": "Vælg en godkendelses udbyder, der kan bruges til at godkende denne brugers adgangskode.", + "AuthProviderHelp": "Vælg en godkendelsesudbyder til at godkende denne brugers adgangskode.", "AskAdminToCreateLibrary": "Spørg en administrator om at oprette et bibliotek.", "Artist": "Artist", "EveryXHours": "Hver {0} time", "OnApplicationStartup": "Ved programstart", "UnsupportedPlayback": "Jellyfin kan ikke dekryptere indhold, der er beskyttet af DRM, men alt indhold vil blive forsøgt afspillet uanset, inklusive beskyttede titler. Nogle filer kan eventuelt vises med sort skærm på grund af kryptering eller andre funktioner, der ikke understøttes, såsom interaktive titler.", - "MessageUnauthorizedUser": "Du har ikke tilladelse til at tilgå serveren på dette tidspunkt. Kontakt din serveradministrator for mere information." + "MessageUnauthorizedUser": "Du har ikke tilladelse til at tilgå serveren på dette tidspunkt. Kontakt din serveradministrator for mere information.", + "Filter": "Filtrer", + "New": "Nye", + "ButtonTogglePlaylist": "Spilleliste", + "ButtonToggleContextMenu": "Mere" } diff --git a/src/strings/de.json b/src/strings/de.json index cf0329650..1f70b418f 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -17,7 +17,7 @@ "Albums": "Alben", "All": "Alle", "AllChannels": "Alle Kanäle", - "AllComplexFormats": "Alle komplexen Formate (ASS, SSA, VOBSUB, PGS, SUB/IDX)", + "AllComplexFormats": "Alle komplexen Formate (ASS, SSA, VOBSUB, PGS, SUB/IDX, ...)", "AllEpisodes": "Alle Folgen", "AllLanguages": "Alle Sprachen", "AllLibraries": "Alle Bibliotheken", @@ -55,12 +55,12 @@ "BirthLocation": "Geburtsort", "BirthPlaceValue": "Geburtsort: {0}", "BobAndWeaveWithHelp": "Bob & Weave (höhere Qualität, aber langsamer)", - "BookLibraryHelp": "Hörbücher und E-Books werden unterstützt. Schaue in den {0}Book Naming Guide {1}.", + "BookLibraryHelp": "Hörbücher und E-Books werden unterstützt. Schaue in den {0} Book Naming Guide {1}.", "Books": "Bücher", "BoxRear": "Box (Rückseite)", "Browse": "Blättern", "BrowsePluginCatalogMessage": "Durchsuche unsere Bibliothek, um alle verfügbaren Plugins anzuzeigen.", - "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel während der Videotranskodierung einbrennen soll. Deaktivieren verbessert die Serverperformance immens. Wähle Auto, um bildbasierte Formate (z.B. VOBSUB, PGS, SUB, IDX) sowie bestimmte ASS- oder SSA-Untertitel einbrennen zu lassen.", + "BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel während der Videotranskodierung einbrennen soll. Deaktivieren verbessert die Serverperformance immens. Wähle Auto, um bildbasierte Formate (z.B. VOBSUB, PGS, SUB, IDX, ...) sowie bestimmte ASS- oder SSA-Untertitel einbrennen zu lassen.", "ButtonAdd": "Hinzufügen", "ButtonAddMediaLibrary": "Füge Medienbibliothek hinzu", "ButtonAddScheduledTaskTrigger": "Auslöser hinzufügen", @@ -1000,7 +1000,7 @@ "OptionLikes": "Mag ich", "OptionMissingEpisode": "Fehlende Episoden", "OptionMonday": "Montag", - "OptionNew": "Neu...", + "OptionNew": "Neu…", "OptionNone": "Keines", "OptionOnAppStartup": "Bei Anwendungsstart", "OptionOnInterval": "Nach einem Intervall", @@ -1521,5 +1521,13 @@ "LabelLibraryPageSizeHelp": "Setzt die Anzahl der auf einer Seite angezeigten Objekte. Setze auf 0, um alle Elemente auf einer Seite anzuzeigen.", "LabelLibraryPageSize": "Bibliothek Seiten Größe:", "DeinterlaceMethodHelp": "Wähle die Deinterlacing-Methode zum Transkodieren von Inhalten im Zeilensprungverfahren (Interlace).", - "LabelDeinterlaceMethod": "Deinterlacing-Methode:" + "LabelDeinterlaceMethod": "Deinterlacing-Methode:", + "UnsupportedPlayback": "Jellyfin kann keine DRM-geschützten Inhalte entschlüsseln, aber es wird versucht, alle Inhalte unabhängig davon zu entschlüsseln, einschließlich geschützter Titel. Einige Dateien können aufgrund der Verschlüsselung oder anderer nicht unterstützter Funktionen, wie z.B. interaktive Titel, komplett schwarz erscheinen.", + "Filter": "Filter", + "New": "Neu", + "MessageUnauthorizedUser": "Sie sind im Moment nicht berechtigt, auf den Server zuzugreifen. Bitte kontaktieren Sie Ihren Server-Administrator für weitere Informationen.", + "HeaderFavoritePlaylists": "Lieblings-Wiedergabeliste", + "ButtonTogglePlaylist": "Wiedergabeliste", + "ButtonToggleContextMenu": "Mehr", + "ApiKeysCaption": "Liste der aktuell aktivierten API-Schlüssel" } diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index bca865ff6..b111dfa24 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -385,6 +385,7 @@ "HeaderFavoriteArtists": "Favourite Artists", "HeaderFavoriteSongs": "Favourite Songs", "HeaderFavoriteVideos": "Favourite Videos", + "HeaderFavoritePlaylists": "Favourite Playlists", "HeaderFeatureAccess": "Feature Access", "HeaderFeatures": "Features", "HeaderFetchImages": "Fetch Images:", @@ -527,6 +528,8 @@ "Smart": "Smart", "SimultaneousConnectionLimitHelp": "The maximum number of allowed simultaneous streams. Enter 0 for no limit.", "Shuffle": "Shuffle", + "New": "New", + "Filter": "Filter", "ShowYear": "Show year", "ShowIndicatorsFor": "Show indicators for:", "ShowAdvancedSettings": "Show advanced settings", @@ -1506,5 +1509,9 @@ "BoxSet": "Box Set", "Artist": "Artist", "AlbumArtist": "Album Artist", - "Album": "Album" + "Album": "Album", + "UnsupportedPlayback": "Jellyfin cannot decrypt content protected by DRM but all content will be attempted regardless, including protected titles. Some files may appear completely black due to encryption or other unsupported features, such as interactive titles.", + "MessageUnauthorizedUser": "You are not authorized to access the server at this time. Please contact your server administrator for more information.", + "ButtonTogglePlaylist": "Playlist", + "ButtonToggleContextMenu": "More" } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 344753c74..2014f2d61 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -17,7 +17,7 @@ "Alerts": "Alerts", "All": "All", "AllChannels": "All channels", - "AllComplexFormats": "All Complex Formats (ASS, SSA, VOBSUB, PGS, SUB, IDX)", + "AllComplexFormats": "All Complex Formats (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)", "AllEpisodes": "All episodes", "AllLanguages": "All languages", "AllLibraries": "All libraries", @@ -25,7 +25,7 @@ "AllowMediaConversion": "Allow media conversion", "AllowMediaConversionHelp": "Grant or deny access to the convert media feature.", "AllowOnTheFlySubtitleExtraction": "Allow subtitle extraction on the fly", - "AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.", + "AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text, in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.", "AllowFfmpegThrottling": "Throttle Transcodes", "AllowFfmpegThrottlingHelp": "When a transcode or remux gets far enough ahead from the current playback position, pause the process so it will consume less resources. This is most useful when watching without seeking often. Turn this off if you experience playback issues.", "AllowRemoteAccess": "Allow remote connections to this Jellyfin Server.", @@ -55,14 +55,14 @@ "BirthLocation": "Birth location", "BirthPlaceValue": "Birth place: {0}", "Blacklist": "Blacklist", - "BookLibraryHelp": "Audio and text books are supported. Review the {0}book naming guide{1}.", + "BookLibraryHelp": "Audio and text books are supported. Review the {0} book naming guide {1}.", "Books": "Books", "Box": "Box", "BoxSet": "Box Set", "BoxRear": "Box (rear)", "Browse": "Browse", "BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins.", - "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX) and certain ASS or SSA subtitles.", + "BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX, …) and certain ASS or SSA subtitles.", "ButtonAdd": "Add", "ButtonAddImage": "Add Image", "ButtonAddMediaLibrary": "Add Media Library", @@ -311,6 +311,7 @@ "HeaderApiKey": "API Key", "HeaderApiKeys": "API Keys", "HeaderApiKeysHelp": "External applications are required to have an API key in order to communicate with Jellyfin Server. Keys are issued by logging in with a Jellyfin account, or by manually granting the application a key.", + "ApiKeysCaption": "List of the currently enabled API keys", "HeaderApp": "App", "HeaderAppearsOn": "Appears On", "HeaderAudioBooks": "Audio Books", @@ -370,6 +371,7 @@ "HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteSongs": "Favorite Songs", "HeaderFavoriteVideos": "Favorite Videos", + "HeaderFavoritePlaylists": "Favorite Playlists", "HeaderFeatureAccess": "Feature Access", "HeaderFeatures": "Features", "HeaderFetchImages": "Fetch Images:", @@ -1165,7 +1167,7 @@ "OptionMissingEpisode": "Missing Episodes", "OptionMonday": "Monday", "OptionNameSort": "Name", - "OptionNew": "New...", + "OptionNew": "New…", "OptionNone": "None", "OptionOnAppStartup": "On application startup", "OptionOnInterval": "On an interval", @@ -1337,6 +1339,8 @@ "ShowYear": "Show year", "Shows": "Shows", "Shuffle": "Shuffle", + "New": "New", + "Filter": "Filter", "SimultaneousConnectionLimitHelp": "The maximum number of allowed simultaneous streams. Enter 0 for no limit.", "SkipEpisodesAlreadyInMyLibrary": "Don't record episodes that are already in my library", "SkipEpisodesAlreadyInMyLibraryHelp": "Episodes will be compared using season and episode numbers, when available.", diff --git a/src/strings/eo.json b/src/strings/eo.json new file mode 100644 index 000000000..3151c9e43 --- /dev/null +++ b/src/strings/eo.json @@ -0,0 +1,5 @@ +{ + "AddToCollection": "Aldoni al kolekto", + "Actor": "Aktoro", + "Absolute": "Absoluto" +} diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index 69c571a57..2ea87c424 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -61,7 +61,7 @@ "Alerts": "Alertas", "All": "Todo", "AllChannels": "Todos los canales", - "AllComplexFormats": "Todos los formatos complejos (ASS, SSA, VOBSUB, PGS, SUB, IDX)", + "AllComplexFormats": "Todos los formatos complejos (ASS, SSA, VOBSUB, PGS, SUB, IDX, ...)", "AllEpisodes": "Todos los capítulos", "AllLanguages": "Todos los idiomas", "AllLibraries": "Todas las bibliotecas", @@ -500,5 +500,45 @@ "HeaderDeleteItem": "Eliminar ítem", "HeaderDeleteDevice": "Eliminar dispositivo", "HeaderDefaultRecordingSettings": "Ajustes de grabación por defecto", - "UnsupportedPlayback": "Jellyfin no puede descifrar contenido protegido por DRM pero a pesar de esto lo intentará con todo el contenido, incluyendo títulos protegidos. Algunos archivos pueden aparecer completamente en negro por estar cifrados o por otras características no soportadas, como títulos interactivos." + "UnsupportedPlayback": "Jellyfin no puede descifrar contenido protegido por DRM pero a pesar de esto lo intentará con todo el contenido, incluyendo títulos protegidos. Algunos archivos pueden aparecer completamente en negro por estar cifrados o por otras características no soportadas, como títulos interactivos.", + "HeaderMediaFolders": "Carpetas de medios", + "HeaderMedia": "Medios", + "HeaderLoginFailure": "Error al iniciar sesión", + "HeaderLiveTvTunerSetup": "Configuración del sintonizador de TV en vivo", + "HeaderLiveTv": "TV en vivo", + "HeaderLibrarySettings": "Configuraciones de biblioteca", + "HeaderLibraryOrder": "Orden de biblioteca", + "HeaderLibraryFolders": "Carpetas de biblioteca", + "HeaderLibraryAccess": "Acceso a la biblioteca", + "HeaderLibraries": "Bibliotecas", + "HeaderLatestRecordings": "Grabaciones recientes", + "HeaderLatestMusic": "Música reciente", + "HeaderLatestMovies": "Películas recientes", + "HeaderLatestMedia": "Medios recientes", + "HeaderKeepSeries": "Mantener serie", + "HeaderKeepRecording": "Mantener grabación", + "HeaderItems": "Artículos", + "HeaderInstantMix": "Mezcla instantánea", + "HeaderInstall": "Instalar", + "HeaderImageSettings": "Configuraciones de imagen", + "HeaderImageOptions": "Opciones de imagen", + "HeaderIdentifyItemHelp": "Ingrese uno o más criterios de búsqueda. Eliminar criterios para aumentar los resultados de búsqueda.", + "HeaderIdentificationHeader": "Encabezado de identificación", + "HeaderIdentificationCriteriaHelp": "Ingrese al menos un criterio de identificación.", + "HeaderIdentification": "Identificación", + "HeaderHttpHeaders": "Encabezados HTTP", + "HeaderHome": "Inicio", + "HeaderGuideProviders": "Proveedores de datos de guías de TV", + "HeaderGenres": "Géneros", + "HeaderFrequentlyPlayed": "Reproducido con frecuencia", + "HeaderForgotPassword": "Olvidé la contraseña", + "HeaderForKids": "Para niños", + "HeaderFilters": "Filtros", + "HeaderFetcherSettings": "Configuración del recuperador", + "HeaderFetchImages": "Obtener imágenes:", + "HeaderFeatures": "Caracteristicas", + "HeaderFeatureAccess": "Acceso a características", + "HeaderFavoritePlaylists": "Listas de reproducción favoritas", + "ButtonTogglePlaylist": "Lista de reproducción", + "ButtonToggleContextMenu": "Más" } diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index ff2096195..fcf564381 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -195,7 +195,7 @@ "Download": "Descargar", "DownloadsValue": "{0} descargas", "DrmChannelsNotImported": "Los canales con DRM no serán importados.", - "DropShadow": "Sombra Paralela", + "DropShadow": "Sombra paralela", "EasyPasswordHelp": "El código PIN fácil se utiliza para el acceso sin conexión en los clientes soportados y también puede utilizarse para acceder fácilmente cuando se está en la misma red.", "Edit": "Editar", "EditImages": "Editar imágenes", @@ -204,7 +204,7 @@ "EnableBackdrops": "Imágenes de fondo", "EnableBackdropsHelp": "Muestra imágenes de fondo en el fondo de algunas páginas mientras se navega por la biblioteca.", "EnableCinemaMode": "Modo cine", - "EnableColorCodedBackgrounds": "Fondos con código de color", + "EnableColorCodedBackgrounds": "Fondos de color codificado", "EnableDisplayMirroring": "Duplicado de pantalla", "EnableExternalVideoPlayers": "Reproductores de video externos", "EnableExternalVideoPlayersHelp": "Un menú de reproductor externo se mostrara cuando inicie la reproducción de un video.", @@ -1473,8 +1473,8 @@ "Track": "Pista", "Season": "Temporada", "ReleaseGroup": "Grupo de salida", - "PreferEmbeddedEpisodeInfosOverFileNames": "Preferir información embebida en el episodio sobre el nombre de archivo", - "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto utiliza la información de el episodio desde metadatos embebidos si esta disponible.", + "PreferEmbeddedEpisodeInfosOverFileNames": "Preferir información embebida en el episodio sobre los nombres de archivo", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto utiliza la información del episodio desde metadatos embebidos si esta disponible.", "PlaybackErrorNoCompatibleStream": "Este cliente no es compatible con los medios y el servidor no está enviando un formato de medios compatible.", "Person": "Persona", "OtherArtist": "Otro artista", @@ -1499,8 +1499,17 @@ "AllowFfmpegThrottling": "Aceleración de Transcoders", "AlbumArtist": "Álbum de artista", "Album": "Álbum", - "YadifBob": "Yadif Bob", - "Yadif": "Yadif", + "YadifBob": "YADIF Bob", + "Yadif": "YADIF", "LabelDeinterlaceMethod": "Metodo de Desentrelazado:", - "DeinterlaceMethodHelp": "Seleccione el método de desentrelazado que se usará al codificar el contenido entrelazado." + "DeinterlaceMethodHelp": "Seleccione el método de desentrelazado que se usará al codificar el contenido entrelazado.", + "Filter": "Filtro", + "New": "Nuevo", + "MessageUnauthorizedUser": "No estás autorizado para acceder al servidor en este momento. Por favor contacta con el administrador del servidor para mas información.", + "LabelLibraryPageSizeHelp": "Establecer el número de elementos a mostrar en la página biblioteca. Establezca 0 para deshabilitar paginado.", + "LabelLibraryPageSize": "Tamaño de la página Biblioteca:", + "HeaderFavoritePlaylists": "Listas de reproducción favoritas", + "ButtonTogglePlaylist": "Lista de reproducción", + "ButtonToggleContextMenu": "Más", + "UnsupportedPlayback": "Jellyfin no puede desencriptar contenido protegido por DRM aún así será intentado, incluyendo títulos protegidos. Algunos archivos pueden aparecer completamente en negro debido al encriptado o características no soportadas, como títulos alternativos." } diff --git a/src/strings/es.json b/src/strings/es.json index 4b090997d..1ce442579 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -957,7 +957,7 @@ "OptionMissingEpisode": "Episodios que faltan", "OptionMonday": "Lunes", "OptionNameSort": "Nombre", - "OptionNew": "Nuevo...", + "OptionNew": "Nuevo…", "OptionNone": "Nada", "OptionOnAppStartup": "Al iniciar la aplicación", "OptionOnInterval": "En un intervalo", @@ -1093,7 +1093,7 @@ "Share": "Compartir", "ShowAdvancedSettings": "Mostrar opciones avanzadas", "ShowIndicatorsFor": "Mostrar indicaciones para:", - "Shows": "Series", + "Shows": "Mostrar", "Shuffle": "Mezclar", "SimultaneousConnectionLimitHelp": "Número máximo de transmisiones simultáneas permitidas. Pon 0 para no tener límite.", "SkipEpisodesAlreadyInMyLibrary": "No grabar episodios que ya están en mi biblioteca", @@ -1404,8 +1404,8 @@ "RunAtStartup": "Ejecutar al iniciar", "Series": "Series", "SeriesDisplayOrderHelp": "Ordena los episodios por fecha de emisión, orden de DVD o número absoluto.", - "ShowTitle": "Título del show", - "ShowYear": "Año del show", + "ShowTitle": "Mostrar título", + "ShowYear": "Mostrar año", "SmallCaps": "Letras minúsculas", "Smaller": "Más pequeño", "Sort": "Ordenar", @@ -1510,5 +1510,9 @@ "Yadif": "YADIF", "MessageUnauthorizedUser": "No tiene autorización para acceder al servidor en este momento. Póngase en contacto con el administrador del servidor para obtener más información.", "ButtonTogglePlaylist": "Lista de reproducción", - "ButtonToggleContextMenu": "Más" + "ButtonToggleContextMenu": "Más", + "Filter": "Filtro", + "New": "Nuevo", + "HeaderFavoritePlaylists": "Lista reproducción favorita", + "ApiKeysCaption": "Lista de las claves API actuales" } diff --git a/src/strings/fa.json b/src/strings/fa.json index f244a2587..76f8ec4e2 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -670,5 +670,37 @@ "Smaller": "کوچکتر", "Small": "کوچک", "ButtonTogglePlaylist": "لیست پخش", - "ButtonToggleContextMenu": "بیشتر" + "ButtonToggleContextMenu": "بیشتر", + "TheseSettingsAffectSubtitlesOnThisDevice": "این تنظیمات روی زیرنویس‌ها در این دستگاه تأثیر می‌گذارد", + "TabStreaming": "در حال پخش", + "TabSettings": "تنظیمات", + "TabServer": "سرور", + "TabSeries": "سریال‌ها", + "TabScheduledTasks": "وظایف زمان بندی شده", + "TabResumeSettings": "ادامه", + "TabResponses": "پاسخ‌ها", + "TabRecordings": "ضبط‌ها", + "TabPlugins": "افزونه‌ها", + "TabPlaylists": "لیست‌های پخش", + "TabPlayback": "پخش", + "TabParentalControl": "رتبه بندی والدین", + "TabOther": "سایر", + "TabNfoSettings": "تنظیمات NFO", + "TabNetworking": "شبکه سازی", + "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "این تنظیمات همچنین در مورد هر پخش Chromecast که توسط این دستگاه شروع شده است اعمال می شود.", + "SmartSubtitlesHelp": "زیرنویس‌های متناسب با توجه به اولویت زبان بدون در نظر گرفتن زبان صوتی ویدیو پخش می شوند.", + "SkipEpisodesAlreadyInMyLibrary": "قسمت‌هایی که هم اکنون در کتابخانه من موجود است را ضبط نکن", + "SimultaneousConnectionLimitHelp": "حداکثر تعداد پخش‌های مجاز همزمان. ۰ را برای بدون محدودیت وارد کنید.", + "MessagePluginConfigurationRequiresLocalAccess": "برای پیکربندی این افزونه، لطفاً مستقیماً به سرور محلی خود وارد شوید.", + "MessagePleaseWait": "لطفا صبر کنید. این ممکن است چند دقیقه طول بکشد.", + "MessageNoServersAvailable": "هیچ سروری با استفاده از کشف خودکار سرور یافت نشد.", + "MessageNoPluginsInstalled": "هیچ افزونه‌ی نصب نشده است.", + "MessageNoMovieSuggestionsAvailable": "هیچ پیشنهادی برای فیلم در دسترس نیست. شروع به تماشای و رتبه بندی فیلم‌های خود بکنید ، و سپس دوباره به دیدن پیشنهاد‌های خود بیایید.", + "MessageNoAvailablePlugins": "افزونه‌ای موجود نیست.", + "MessageItemsAdded": "آیتم‌ها اضافه شدند.", + "MessageItemSaved": "آیتم ذخیره شد.", + "MessageUnauthorizedUser": "در حال حاضر مجاز به دسترسی به سرور نیستید. لطفا برای اطلاعات بیشتر با مدیر سرور خود تماس بگیرید.", + "MessageInvalidUser": "نام کاربری یا گذرواژه نامعتبر است. لطفا دوباره تلاش کنید.", + "MessageInvalidForgotPasswordPin": "کد پین نامعتبر یا منقضی شده وارد شد. لطفا دوباره تلاش کنید.", + "MessageInstallPluginFromApp": "این افزونه باید از داخل برنامه‌ای که قصد استفاده از آن را دارید نصب شود." } diff --git a/src/strings/fi.json b/src/strings/fi.json index b915aefd3..1c7147a50 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -4,7 +4,7 @@ "ButtonAddUser": "Lisää Käyttäjä", "ButtonCancel": "Peruuta", "ButtonDeleteImage": "Poista Kuva", - "ButtonResetPassword": "Uusi Salasana", + "ButtonResetPassword": "Nollaa salasana", "ButtonSave": "Tallenna", "ButtonSignOut": "Sign out", "Delete": "Poista", @@ -15,41 +15,41 @@ "FileNotFound": "Tiedostoa ei löydy.", "FileReadCancelled": "Tiedoston luku on peruutettu.", "FileReadError": "Virhe tiedoston luvun aikana.", - "FolderTypeTvShows": "TV", + "FolderTypeTvShows": "TV-sarjat", "HeaderCreatePassword": "Luo Salasana:", "HeaderParentalRating": "Parental Rating", - "HeaderSeries": "Jaksot", + "HeaderSeries": "Sarjat", "HeaderYear": "Year:", "LabelAudioLanguagePreference": "Äänen ensisijainen kieli:", "LabelConfigureSettings": "Muuta asetuksia", "LabelCountry": "Maa:", "LabelCurrentPassword": "Tämän hetkinen salsana:", - "LabelDisplayMissingEpisodesWithinSeasons": "Näytä puuttuvat jaksot tuotantokausissa", + "LabelDisplayMissingEpisodesWithinSeasons": "Näytä puuttuvat jaksot kausien sisällä", "LabelDownloadInternetMetadata": "Lataa kuvamateriaali ja metadata internetistä", "LabelFinish": "Valmis", "LabelFolderType": "Kansion tyyppi:", "LabelLanguage": "Kieli:", - "LabelMaxParentalRating": "Suurin sallittu vanhempien arvostelu:", + "LabelMaxParentalRating": "Suurin sallittu ikäraja:", "LabelNewPassword": "Uusi salasana:", "LabelNewPasswordConfirm": "Uuden salasanan varmistus:", "LabelNext": "Seuraava", "LabelPrevious": "Edellinen", - "LabelSaveLocalMetadata": "Tallenna kuvamateriaali ja metadata media kansioihin.", + "LabelSaveLocalMetadata": "Tallenna kuvamateriaali mediakansioihin", "LabelSaveLocalMetadataHelp": "Kuvamateriaalin ja metadatan tallentaminen suoraan kansioihin missä niitä on helppo muuttaa.", "LabelSubtitleLanguagePreference": "Tekstityksien ensisijainen kieli:", "LabelUnairedMissingEpisodesWithinSeasons": "Näytä julkaisemattomat jaksot tuotantokausissa", - "LabelYourFirstName": "Sinun ensimmäinen nimi:", - "LabelYoureDone": "Olet valmis!", - "LibraryAccessHelp": "Valitse media kansiot jotka haluat jakaa tämän käyttäjän kanssa. Järjestelmänvalvoja pystyy muokkaamaan kaikkia kansioita käyttäen metadata hallintaa.", - "MaxParentalRatingHelp": "Suuremman arvosanan takia, sisältö tulla piilottamaan käyttäjältä.", - "MoreUsersCanBeAddedLater": "Käyttäjiä voi lisätä lisää myöhemmin Dashboardista", + "LabelYourFirstName": "Etunimesi:", + "LabelYoureDone": "Valmista!", + "LibraryAccessHelp": "Valitse kirjastot, jotka haluat jakaa tämän käyttäjän kanssa. Järjestelmänvalvoja pystyy muokkaamaan kaikkia kansioita käyttäen metadatan hallintatyökalua.", + "MaxParentalRatingHelp": "Suuremman luokituksen sisältö piilotetaan käyttäjältä.", + "MoreUsersCanBeAddedLater": "Käyttäjiä voidaan lisätä myöhemmin lisää päänäkymästä.", "NoPluginsInstalledMessage": "Sinulla ei ole mitään lisäosia asennettuna.", "OptionRelease": "Virallinen Julkaisu", - "ParentalRating": "Parental Rating", + "ParentalRating": "Ikäraja", "Password": "Salasana", - "PasswordMatchError": "Salasana ja salasanan vahvistuksen pitää olla samat.", - "PasswordResetComplete": "Salasana on palauttettu.", - "PasswordResetConfirmation": "Oletko varma, että haluat palauttaa salasanan?", + "PasswordMatchError": "Salasanan ja salasanan vahvistuksen on oltava samat.", + "PasswordResetComplete": "Salasana on nollattu.", + "PasswordResetConfirmation": "Haluatko varmasti nollata salasanan?", "PasswordSaved": "Salasana tallennettu.", "Save": "Tallenna", "SettingsSaved": "Asetukset tallennettu.", @@ -59,7 +59,7 @@ "TabProfile": "Profiili", "TabProfiles": "Profiilit", "TellUsAboutYourself": "Kerro meille itsestäsi", - "ThisWizardWillGuideYou": "Tämä työkalu auttaa sinua asennus prosessin aikana. loittaaksesi valitse kieli.", + "ThisWizardWillGuideYou": "Tämä työkalu auttaa sinua asennusprosessin aikana. Valitse kieli aloittaaksesi.", "UninstallPluginConfirmation": "Oletko varma, että haluat poistaa {0}?", "UninstallPluginHeader": "Poista Lisäosa", "Users": "Käyttäjät", @@ -88,7 +88,7 @@ "AddGuideProviderHelp": "Lisää lähde ohjelmaoppaalle.", "AddItemToCollectionHelp": "Lisää nimikkeitä etsimällä niitä ja käyttämällä hiiren oikeaa nappia tai valikkoa lisätäksesi ne kokoelmaan.", "Aired": "Esityspäivä", - "AllowHWTranscodingHelp": "Salli virittimen muuntaa bittivirtaa lennossa. Tämä voi vähentää tarvetta muunnokseen palvelimella.", + "AllowHWTranscodingHelp": "Salli virittimen muuntaa bittivirtaa lennossa. Tämä voi vähentää muunnoksen tarvetta Jellyfin-palvelimella.", "AllowMediaConversion": "Salli median muunto", "AllowMediaConversionHelp": "Salli tai kiellä pääsy median muunnostoimintoon.", "AllowOnTheFlySubtitleExtractionHelp": "Sisäiset tekstitykset voidaan lähettää päätelaitteille ilmitekstinä, jotta videota ei tarvitsisi uudelleenkoodata. Joissain järjestelmissä tämä voi viedä paljon aikaa ja aiheuttaa toiston pysähtymisen purun ajaksi. Poista tämä käytöstä polttaaksesi tekstiykset suoraan videoon, mikäli päätelaite ei tue tekstityksiä.", @@ -101,22 +101,22 @@ "AlwaysPlaySubtitlesHelp": "Oletuskieliasetusta vastaava tekstitys otetaan käyttöön ääniraidan kielestä huolimatta.", "AnamorphicVideoNotSupported": "Anamorfinen video ei ole tuettu", "AndroidUnlockRestoreHelp": "Palauttaaksesi aikaisemman ostoksesi, varmista, että olet kirjautuneena samalla Google (tai Amazon) tunnuksella, jolla teit alkuperäisen oston. Varmista, että sovelluskauppa on päällä eikä sitä ole rajoitettu vanhempien lukolla. Varmista myös, että sinulla on toimiva internet -yhteys. Sinun tarvitsee tehdä taämä vain kerran.", - "AnyLanguage": "Mikä tahansa kieli", + "AnyLanguage": "Mikä tahansa", "Anytime": "Milloin tahansa", "AroundTime": "Noin {0}", "Art": "Taide", - "Artists": "Esiintyjät", + "Artists": "Artistit", "AsManyAsPossible": "Niin monta kuin mahdollista", "Ascending": "Nousevassa järjestyksessä", "AspectRatio": "Kuvasuhde", "AttributeNew": "Uusi", "Audio": "Ääni", "AuthProviderHelp": "Valitse todentamispalvelu, jota käytetään tämän käyttäjän salasanan todentamisessa.", - "Auto": "Automaattinen", + "Auto": "Auto", "AutoBasedOnLanguageSetting": "Automaattinen (perustuu kieliasetukseen)", "Backdrop": "Tausta", "Backdrops": "Taustat", - "Banner": "Juliste", + "Banner": "Lippu", "BirthDateValue": "Syntynyt: {0}", "BirthLocation": "Syntymäpaikka", "BirthPlaceValue": "Syntymäpaikka: {0}", @@ -145,9 +145,9 @@ "ButtonEdit": "Muokkaa", "ButtonEditImages": "Muokkaa kuvia", "ButtonEditOtherUserPreferences": "Muokkaa tämän käyttäjän profiilia, kuvaa ja henkilökohtaisia asetuksia.", - "ButtonFilter": "Suodin", - "ButtonForgotPassword": "Unohdin salasanani", - "ButtonFullscreen": "Täysi kuvaruutu", + "ButtonFilter": "Suodata", + "ButtonForgotPassword": "Unohtuiko salasana", + "ButtonFullscreen": "Kokonäyttötila", "ButtonGotIt": "Selvä", "ButtonGuide": "Opas", "ButtonHelp": "Apua", @@ -163,7 +163,7 @@ "ButtonNextTrack": "Seuraava raita", "ButtonOff": "Pois päältä", "ButtonOk": "Ok", - "ButtonOpen": "Avoin", + "ButtonOpen": "Avaa", "BurnSubtitlesHelp": "Määrittää mikäli palvelimen pitäisi polttaa tekstitykset suoraan videoon muunnoksen aikana riippuen tekstitysten formaatista. Tekstitysten polttamisen välttäminen parantaa palvelimen suorituskykyä. Valitse Automaattinen polttaaksesi sekä kuva- (esim. VOBSUB, PGS, SUB/IDX, jne.) että tekstipohjaiset (ASS/SSA) formaatit.", "ButtonParentalControl": "Lapsilukko", "ButtonPause": "Tauko", @@ -249,14 +249,14 @@ "DisplayInOtherHomeScreenSections": "Näytä kotinäytöllä osastoja kuten viimeisin media ja jatka katselua", "DisplayMissingEpisodesWithinSeasons": "Näytä puuttuvat jaksot tuotantokausissa", "DisplayMissingEpisodesWithinSeasonsHelp": "Tämän pitää aktivoida TV-kirjastoille myös palvelimen asetuksissa.", - "DisplayModeHelp": "Valitse näyttölaitteen tyyppi jolla pyörität Jellyfiniä.", + "DisplayModeHelp": "Valitse ulkonäkö, jonka haluat käyttöliittymälle.", "DoNotRecord": "Älä tallenna", "Down": "Alas", "Download": "Lataa", "DownloadsValue": "{0} latausta", "DrmChannelsNotImported": "Kanavia joissa on tekijänoikeusesto-ohjelmia, ei ladata.", - "DropShadow": "Tiputa varjo", - "EasyPasswordHelp": "Sinun helppoa PIN-koodia käytetään offline-käytössä tuetuissa Jellyfin-sovelluksissa, ja voi myös nopeuttaa lan yhteyden kautta kirjautumista.", + "DropShadow": "Varjostus", + "EasyPasswordHelp": "Helppoa PIN-koodiasi käytetään offline-käyttöä tukevissa sovelluksissa, ja sitä voidaan myös käyttää verkossa kirjautumiseen.", "Edit": "Muokkaa", "EditImages": "Muokkaa kuvia", "EditMetadata": "Muokkaa metadataa", @@ -267,7 +267,7 @@ "ButtonAddImage": "Lisää kuva", "Movies": "Elokuvat", "HeaderNextUp": "Seuraavaksi", - "HeaderLiveTV": "Suorat lähetykset", + "HeaderLiveTV": "Live-TV", "HeaderFavoriteSongs": "Lempikappaleet", "HeaderFavoriteShows": "Lempisarjat", "HeaderFavoriteEpisodes": "Lempijaksot", @@ -284,16 +284,16 @@ "ValueSpecialEpisodeName": "Erikois - {0}", "Sync": "Synkronoi", "Songs": "Kappaleet", - "Shows": "Ohjelmat", + "Shows": "Sarjat", "CopyStreamURLSuccess": "Osoite kopioitu onnistuneesti.", - "DeathDateValue": "Kuoli: {0}", - "CustomDlnaProfilesHelp": "Luo mukautettu profiili uutta laitetta varten, tai ohita järjestelmäprofiili.", + "DeathDateValue": "Kuoli: {}", + "CustomDlnaProfilesHelp": "Luo uusi profiili kohdistaaksesi uuteen laitteeseen tai ohittaaksesi järjestelmäprofiilin.", "EnableBackdrops": "Taustat", "ErrorAddingMediaPathToVirtualFolder": "Media-polkua lisätessä ilmeni ongelma. Varmista, että polku on kirjoitettu oikein ja Jellyfin Palvelimella pääsy sijaintiin.", "Episodes": "Jaksot", "EndsAtValue": "Päättyy {0}", "Ended": "Päättynyt", - "EnableThemeSongsHelp": "Soita tunnuslaulut taustalla, selatessasi kirjastoa.", + "EnableThemeSongsHelp": "Soita tunnussäveliä taustalla selatessasi kirjastoa.", "EnableThemeSongs": "Tunnuslaulut", "EnableStreamLoopingHelp": "Laita tämä päälle, jos suoratoistot sisältävät vain muutaman sekuntin verran dataa jota tarvitsee pyytää jatkuvasti. Tämän päälle laittaminen ilman toiminnon tarvetta voi aiheuttaa ongelmia.", "EnablePhotosHelp": "Kuvat tunnistetaan ja näytetään muiden media-tiedostojen ohessa.", @@ -307,11 +307,11 @@ "EnableBackdropsHelp": "Näytä taustat tietyillä sivuilla selatessasi kirjastoa.", "EnableExternalVideoPlayersHelp": "Videota soitettaessa näytetään erillinen valikko.", "Depressed": "Painettu", - "CopyStreamURLError": "Verkko-osoitteen kopioinnissa tapahtui virhe.", + "CopyStreamURLError": "Osoitteen kopioidessa tapahtui virhe.", "ButtonSplit": "jaa", "AskAdminToCreateLibrary": "Pyydä järjestelmän ylläpitäjää luomaan kirjasto.", - "EnableStreamLooping": "Auto-toista suoralähetykset", - "EnableNextVideoInfoOverlayHelp": "Videon lopussa, näytä soittolistassa seuraavaksi toistettavan videon tiedot.", + "EnableStreamLooping": "Looppaa suoralähetykset", + "EnableNextVideoInfoOverlayHelp": "Näytä videon lopussa tietoja seuraavasta videosta soittolistalla.", "ClientSettings": "Pääte-asetukset", "AllowFfmpegThrottlingHelp": "Kun uudelleenkoodaus tai remux ehtii tarpeeksi toiston edelle, keskeytä laskenta jotta laskentaresursseja kuluu vähemmän. Tämä on hyödyllistä jos katselet hyppimättä eri kohtiin. Älä käytä jos toiston kanssa ilmenee ongelmia.", "AllowFfmpegThrottling": "Rajoita uudelleenkoodaus", @@ -319,7 +319,937 @@ "ErrorAddingXmlTvFile": "XMLTV-tiedostoa käyttäessä tapahtui virhe. Varmista, että tiedosto on olemassa ja kokeile uudestaan.", "ErrorAddingTunerDevice": "Viritintä lisätessä ilmeni ongelma. Varmista, että se on kytketty oikein ja kokeile uudestaan.", "EnableThemeVideosHelp": "Soita tunnusvideoita taustalla, selatessasi kirjastoa.", - "EnableThemeVideos": "Teeman videot", + "EnableThemeVideos": "Tunnusvideot", "AlbumArtist": "Albumin Artisti", - "Album": "Albumi" + "Album": "Albumi", + "Played": "Toistetut", + "PlayFromBeginning": "Toista alusta", + "PlayNext": "Toista seuraava", + "Play": "Toista", + "PinCodeResetConfirmation": "Haluatko varmasti nollata PIN-koodin?", + "People": "Ihmiset", + "PasswordResetHeader": "Nollaa salasana", + "OriginalAirDateValue": "Alkuperäinen esityspäivä: {0}", + "OptionWeekly": "Viikottainen", + "OptionWeekends": "Viikonloput", + "OptionWeekdays": "Arkipäivät", + "OptionTvdbRating": "TVDB luokitus", + "OptionTrackName": "Raidan nimi", + "OptionThumbCard": "Pienoiskuvakortti", + "OptionThumb": "Pienoiskuva", + "OptionSubstring": "Substring", + "OptionSpecialEpisode": "Erikoisjaksot", + "OptionSaveMetadataAsHidden": "Tallenna metadata ja kuvat piilotettuina tiedostoina", + "OptionRuntime": "Kesto", + "OptionResumable": "Jatkettavissa oleva", + "OptionResElement": "res element", + "OptionReleaseDate": "Julkaisupäivä", + "OptionRegex": "Regex", + "OptionRandom": "Satunnainen", + "OptionProtocolHttp": "HTTP", + "OptionProtocolHls": "HTTP Suoratoisto", + "OptionProfileVideoAudio": "Video Audio", + "OptionProfileVideo": "Video", + "OptionProfilePhoto": "Kuva", + "OptionProfileAudio": "Audio", + "OptionPremiereDate": "Ensi-iltapäivä", + "OptionPosterCard": "Julistekortti", + "OptionPoster": "Juliste", + "OptionPlayCount": "Toistokerrat", + "OptionPlayed": "Toistettu", + "OptionOnAppStartup": "Käynnistyksen yhteydessä", + "OptionNew": "Uusi...", + "OptionNameSort": "Nimi", + "OptionMonday": "Maanantai", + "OptionMissingEpisode": "Puuttuvat jaksot", + "OptionMax": "Maksimi", + "OptionList": "Lista", + "OptionLikes": "Likes", + "OptionIsSD": "SD", + "OptionIsHD": "HD", + "OptionImdbRating": "IMDb Luokitus", + "OptionHomeVideos": "Kuvat", + "OptionHideUser": "Piilota tämä käyttäjä kirjautumisnäkymästä", + "OptionHasTrailer": "Traileri", + "OptionHasThemeVideo": "Tunnusvideo", + "OptionHasThemeSong": "Tunnuskappale", + "OptionHasSubtitles": "Tekstitykset", + "OptionHasSpecialFeatures": "Erikoisominaisuudet", + "OptionFriday": "Perjantai", + "OptionFavorite": "Suosikit", + "OptionExtractChapterImage": "Ota käyttöön kappalekuvien luonti", + "OptionExternallyDownloaded": "Ulkoinen lataus", + "OptionEveryday": "Joka päivä", + "OptionEnded": "Loppuneet", + "OptionEnableM2tsMode": "Ota käyttöön M2ts tila", + "OptionEnableForAllTuners": "Ota käyttöön kaikille viritinlaitteille", + "OptionEnableAccessToAllLibraries": "Salli pääsy kaikkiin kirjastoihin", + "OptionEnableAccessToAllChannels": "Salli pääsy kaikille kanaville", + "OptionEnableAccessFromAllDevices": "Salli pääsy kaikista laitteista", + "OptionDvd": "DVD", + "OptionDownloadThumbImage": "Pienoiskuva", + "OptionDownloadPrimaryImage": "Ensisijainen", + "OptionDownloadMenuImage": "Valikko", + "OptionDownloadLogoImage": "Logo", + "OptionDownloadImagesInAdvance": "Lataa kuvat etukäteen", + "OptionDislikes": "Disliket", + "OptionCustomUsers": "Mukautettu", + "OptionCriticRating": "Kriitikoiden luokitus", + "OptionContinuing": "Jatkuvat", + "OptionCommunityRating": "Yhteisön luokitus", + "OptionBlockLiveTvChannels": "Live-TV kanavat", + "OptionBanner": "Lippu", + "OnlyForcedSubtitlesHelp": "Vain pakotetuiksi merkityt tekstitykset ladataan.", + "OnlyImageFormats": "Vain kuvaformaatit (VOBSUB, PGS, SUB)", + "OnlyForcedSubtitles": "Vain pakotetut", + "NoSubtitlesHelp": "Tekstityksiä ei ladata oletuksena. Ne voidaan silti kytkeä päälle manuaalisesti toiston aikana.", + "News": "Uutiset", + "Never": "Ei koskaan", + "MessageReenableUser": "Ottaaksesi uudelleen käyttöön, katso alempaa", + "MessagePluginConfigurationRequiresLocalAccess": "Kirjaudu suoraan paikalliselle palvelimellesi muokataksesi tätä liitännäistä.", + "MessagePleaseEnsureInternetMetadata": "Varmista, että metadatan lataus on käytössä.", + "MessageNoServersAvailable": "Automaattisen palvelintunnistuksen avulla ei löydy palvelimia.", + "MessageUnauthorizedUser": "Sinulla ei ole lupaa käyttää palvelinta tällä hetkellä. Ota yhteyttä palvelimen järjestelmänvalvojaan saadaksesi lisätietoja.", + "MessageInvalidForgotPasswordPin": "PIN-koodi on kelpaa tai vanhentunut. Yritä uudelleen.", + "MessageImageTypeNotSelected": "Valitse kuvatyyppi pudotusvalikosta.", + "MessageImageFileTypeAllowed": "Vain JPEG ja PNG tiedostomuotoja tuetaan.", + "MessageContactAdminToResetPassword": "Ota yhteyttä järjestelmänvalvojaan nollataksesi salasanasi.", + "MessageConfirmShutdown": "Haluatko varmasti sammuttaa palvelimen?", + "LabelUserLibrary": "Käyttäjän kirjasto:", + "LabelTranscodingProgress": "Transkoodauksen edistyminen:", + "LabelTranscodingFramerate": "Transkoodauksen ruudunpäivitysnopeus:", + "LabelTranscodes": "Transkoodaukset:", + "LabelTrackNumber": "Raidan numero:", + "LabelTitle": "Nimi:", + "LabelTagline": "Tunnisterivi:", + "LabelSubtitlePlaybackMode": "Tekstitystila:", + "LabelSortOrder": "Lajittelujärjestys:", + "LabelSerialNumber": "Sarjanumero", + "LabelSendNotificationToUsers": "Lähetä ilmoitus:", + "LabelSelectVersionToInstall": "Valitse asennettava versio:", + "LabelPublicHttpsPortHelp": "Paikalliseen HTTPS-porttiin liitettävä julkisen portin numero.", + "LabelPublicHttpPortHelp": "Paikalliseen HTTP-porttiin liitettävä julkisen portin numero.", + "LabelPreferredDisplayLanguage": "Ensisijainen näyttökieli:", + "LabelOriginalTitle": "Alkuperäinen nimi:", + "LabelOriginalAspectRatio": "Alkuperäinen kuvasuhde:", + "LabelEnableAutomaticPortMapHelp": "Yritä automaattisesti yhdistää julkinen ja paikallinen portti UPnP:n kautta. Tämä ei välttämättä toimi kaikkien reitittimien kanssa. Muutokset tulevat voimaan vasta palvelimen uudelleenkäynnistyksen yhteydessä.", + "LabelEnableAutomaticPortMap": "Salli reitittimen porttien automaattinen avaaminen (UPnP)", + "LabelDownloadLanguages": "Latauskielet:", + "LabelDisplaySpecialsWithinSeasons": "Näytä erityiset jaksot kausien sisällä, jolloin ne ilmestyivät", + "LabelDisplayOrder": "Näyttöjärjestys:", + "LabelDisplayName": "Näyttönimi:", + "LabelDisplayMode": "Näyttötila:", + "LabelDateTimeLocale": "Päivämäärä ja aika:", + "LabelCustomRating": "Mukautettu luokitus:", + "LabelCustomDeviceDisplayName": "Näyttönimi:", + "LabelCustomCss": "Mukautettu CSS:", + "LabelCertificatePassword": "Sertifikaatin salasana:", + "LabelAudio": "Audio", + "LabelArtistsHelp": "Erota useita käyttämällä ;", + "LabelAppNameExample": "Esimerkiksi: Sickbeard, Sonarr", + "LabelAppName": "Sovelluksen nimi", + "LabelAllowedRemoteAddressesMode": "Etä-IP-osoitesuodattimen tila:", + "LabelAllowedRemoteAddresses": "Etä-IP-osoitesuodatin:", + "LabelAllowServerAutoRestartHelp": "Palvelin käynnistyy uudelleen vain hiljaisina aikoina, kun yksikään käyttäjä ei ole aktiivinen.", + "LabelAllowServerAutoRestart": "Salli palvelimen automaattinen uudelleenkäynnistys päivitysten asentamiseksi", + "LabelAllowHWTranscoding": "Salli laitteistolla transkoodaus", + "LabelAlbumArtMaxWidth": "Albumin kuvan maksimileveys:", + "LabelAlbumArtMaxHeight": "Albumin kuvan maksimikorkeus:", + "LabelAbortedByServerShutdown": "(Keskeytetty palvelimen sammutuksen takia)", + "Identify": "Tunnista", + "Horizontal": "Horisontaalinen", + "HideWatchedContentFromLatestMedia": "Piilota toistettu sisältö \"uusin media\"-luettelosta", + "HeaderUpcomingOnTV": "Tulossa televisiossa", + "HeaderTypeImageFetchers": "{0} Kuvien hakijat", + "HeaderTranscodingProfile": "Transkoodausprofiili", + "HeaderTracks": "Raidat", + "HeaderThisUserIsCurrentlyDisabled": "Tämä käyttäjä on poistettu käytöstä", + "HeaderSystemDlnaProfiles": "Järjestelmäprofiilit", + "HeaderSubtitleDownloads": "Tekstitysten lataukset", + "HeaderSpecialFeatures": "Lisäominaisuudet", + "HeaderSpecialEpisodeInfo": "Erikoisjakson tiedot", + "HeaderSortOrder": "Lajittelujärjestys", + "HeaderSetupLibrary": "Aseta mediakirjastosi", + "HeaderSeriesStatus": "Sarjan status", + "HeaderSeriesOptions": "Sarjan asetukset", + "HeaderSelectTranscodingPath": "Valitse transkoodauksen väliaikainen polku", + "HeaderSchedule": "Ajastus", + "HeaderScenes": "Kohtaukset", + "HeaderResponseProfile": "Vastausprofiili", + "HeaderRemoveMediaLocation": "Poista mediasijainti", + "HeaderRecordingOptions": "Tallennusasetukset", + "HeaderRecentlyPlayed": "Äskettäin toistetut", + "HeaderProfileServerSettingsHelp": "Nämä arvot mukauttavat sitä, kuinka Jellyfin-palvelin esittää itsensä laitteelle.", + "HeaderProfileInformation": "Profiili-informaatio", + "HeaderPreferredMetadataLanguage": "Ensisijainen metadatan kieli", + "HeaderPinCodeReset": "Nollaa PIN-koodi", + "HeaderPhotoAlbums": "Kuva-albumit", + "HeaderPendingInvitations": "Odottavat kutsut", + "HeaderPaths": "Polut", + "HeaderPasswordReset": "Salasanan nollaus", + "HeaderNextVideoPlayingInValue": "Seuraava video alkaa {0}", + "HeaderNextEpisodePlayingInValue": "Seuraava jakso alkaa {0}", + "HeaderNewDevices": "Uudet laitteet", + "HeaderMyMediaSmall": "Minun mediani (pieni)", + "HeaderMyMedia": "Minun mediani", + "HeaderMyDevice": "Minun laitteeni", + "HeaderLoginFailure": "Kirjautumisvirhe", + "HeaderIdentifyItemHelp": "Anna yksi tai useampi hakukriteeri. Poista kriteerejä lisätäksesi hakutuloksia.", + "HeaderIdentificationCriteriaHelp": "Lisää ainakin yksi tunnistuskriteeri.", + "HeaderFeatures": "Ominaisuudet", + "HeaderFavoriteVideos": "Suosikkivideot", + "HeaderFavoritePeople": "Suosikki-ihmiset", + "HeaderFavoriteMovies": "Suosikkielokuvat", + "HeaderFavoriteBooks": "Suosikkikirjat", + "HeaderExternalIds": "Ulkoiset IDt:", + "HeaderDirectPlayProfile": "Suoratoistoprofiili", + "HeaderEasyPinCode": "Helppo PIN-koodi", + "HeaderDownloadSync": "Lataus ja synkronointi", + "HeaderDeveloperInfo": "Kehittäjäinfo", + "HeaderDetectMyDevices": "Havaitse laitteitani", + "HeaderDeleteProvider": "Poista tarjoaja", + "HeaderDefaultRecordingSettings": "Oletus tallennusasetukset", + "HeaderDateIssued": "Antopäivä", + "HeaderCustomDlnaProfiles": "Mukautetut profiilit", + "HeaderConfirmRevokeApiKey": "Peru API-avain", + "HeaderConfirmProfileDeletion": "Vahvista profiilin poisto", + "HeaderConfirmPluginInstallation": "Vahvista liitännäisen asennus", + "HeaderConfigureRemoteAccess": "Määritä etäkäyttö", + "HeaderChapterImages": "Kappalekuvat", + "HeaderChannels": "Kanavat", + "HeaderApp": "Sovellus", + "HeaderAllowMediaDeletionFrom": "Salli median poisto", + "HeaderAlert": "Hälytys", + "HeaderActivity": "Toiminta", + "HandledByProxy": "Reverse proxyn hoitama", + "HDPrograms": "HD-ohjelmat", + "OptionDownloadArtImage": "Taide", + "OptionDownloadDiscImage": "Levy", + "OptionDownloadBoxImage": "Laatikko", + "OptionDownloadBannerImage": "Lippu", + "OptionDownloadBackImage": "Tausta", + "OptionDisableUser": "Poista tämä käyttäjä käytöstä", + "OptionDescending": "Laskeva", + "OptionDatePlayed": "Toistopäivä", + "OptionDateAddedImportTime": "Käytä kirjastoon skannauspäivää", + "OptionDateAddedFileTime": "Käytä tiedoston luontipäivää", + "OptionDateAdded": "Lisäyspäivä", + "OptionDaily": "Päivittäinen", + "OptionBluray": "Blu-ray", + "TabTrailers": "Trailerit", + "OptionBlockTvShows": "TV-sarjat", + "OptionBlockTrailers": "Trailerit", + "OptionBlockMusic": "Musiikki", + "OptionBlockMovies": "Elokuvat", + "HeaderMovies": "Elokuvat", + "HeaderMoreLikeThis": "Lisää tällaista", + "HeaderMetadataSettings": "Metadata-asetukset", + "MoreMediaInfo": "Mediainfo", + "HeaderMediaInfo": "Mediainfo", + "HeaderMediaFolders": "Mediakansiot", + "HeaderMedia": "Media", + "HeaderLiveTv": "Live-TV", + "HeaderLibraryFolders": "Kirjaston kansiot", + "HeaderLatestMedia": "Uusin media", + "HeaderLatestRecordings": "Uusimmat tallenteet", + "HeaderLatestMusic": "Uusin musiikki", + "HeaderLatestMovies": "Uusimmat elokuvat", + "HeaderLatestEpisodes": "Uusimmat jaksot", + "HeaderInstall": "Asenna", + "HeaderGenres": "Tyylilajit", + "HeaderFrequentlyPlayed": "Usein toistetut", + "HeaderFetcherSettings": "Hakijan asetukset", + "HeaderFetchImages": "Hae kuvia:", + "HeaderFilters": "Suodattimet", + "OptionBlockBooks": "Kirjat", + "Filters": "Suodattimet", + "FastForward": "Hyppää eteenpäin", + "YadifBob": "YADIF Bob", + "MessageInvalidUser": "Väärä käyttäjätunnus tai salasana. Yritä uudelleen.", + "MessageConfirmRestart": "Haluatko varmasti uudelleenkäynnistää Jellyfin-palvelimen?", + "MessageConfirmProfileDeletion": "Haluatko varmasti poistaa tämän profiilin?", + "MessageConfirmDeleteTunerDevice": "Haluatko varmasti poistaa tämän laitteen?", + "MessageConfirmAppExit": "Haluatko poistua?", + "MessageAreYouSureYouWishToRemoveMediaFolder": "Haluatko varmasti poistaa tämän mediakansion?", + "MessageAreYouSureDeleteSubtitles": "Haluatko varmasti poistaa tämän tekstitystiedoston?", + "MessageAlreadyInstalled": "Tämä versio on jo asennettu.", + "Menu": "Valikko", + "MediaInfoStreamTypeVideo": "Video", + "MediaInfoStreamTypeSubtitle": "Tekstitys", + "MediaInfoStreamTypeData": "Data", + "MediaInfoStreamTypeAudio": "Audio", + "MediaInfoSoftware": "Ohjelmisto", + "MediaInfoTimestamp": "Aikaleima", + "MediaInfoResolution": "Resoluutio", + "MediaInfoSize": "Koko", + "MediaInfoProfile": "Profiili", + "MediaInfoLevel": "Taso", + "MediaInfoPath": "Polku", + "MediaInfoLanguage": "Kieli", + "MediaInfoInterlaced": "Lomiteltu", + "MediaInfoFramerate": "Ruudunpäivitysnopeus", + "MediaInfoForced": "Pakotettu", + "MediaInfoDefault": "Oletus", + "MediaInfoExternal": "Ulkoinen", + "MediaInfoChannels": "Kanavat", + "MediaInfoAspectRatio": "Kuvasuhde", + "MarkUnplayed": "Merkitse toistamattomaksi", + "MarkPlayed": "Merkitse toistetuksi", + "ManageRecording": "Hallitse tallennusta", + "ManageLibrary": "Hallitse kirjastoa", + "Logo": "Logo", + "LiveTV": "Live-TV", + "LiveBroadcasts": "Suorat lähetykset", + "Live": "Suora", + "List": "Lista", + "LinksValue": "Linkkejä: {0}", + "LearnHowYouCanContribute": "Katso, miten voit auttaa.", + "Large": "Suuri", + "LabelffmpegPath": "FFmpeg polku:", + "LabelZipCode": "Postinumero:", + "LabelYear": "Vuosi:", + "LabelVideoResolution": "Videon resoluutio:", + "LabelVideo": "Video", + "DashboardArchitecture": "Arkkitehtuuri: {0}", + "DashboardOperatingSystem": "Käyttöjärjestelmä: {0}", + "DashboardServerName": "Palvelin: {0}", + "DashboardVersionNumber": "Versio: {0}", + "LabelVersionInstalled": "{0} asennettu", + "LabelVersion": "Versio:", + "LabelValue": "Arvo:", + "LabelUsername": "Käyttäjätunnus:", + "LabelUser": "Käyttäjä:", + "LabelUseNotificationServices": "Käytä seuraavia palveluita:", + "LabelTypeText": "Teksti", + "LabelTypeMetadataDownloaders": "{0} metadatan lataajat:", + "LabelType": "Tyyppi:", + "LabelTunerType": "Virittimen tyyppi:", + "LabelTunerIpAddress": "Virittimen IP-osoite:", + "LabelTranscodingThreadCountHelp": "Valitse enimmäismäärä säikeitä, joita käytetään transkoodatessa. Säikeiden vähentäminen laskee prosessorin käyttöä, mutta myös lisää riskiä, että uudelleenkoodaus ei tapahdu riittävän nopeasti virheetöntä toistoa varten.", + "LabelTranscodingThreadCount": "Transkoodaus säikeidein lukumäärä:", + "LabelTranscodePath": "Transkoodauksen polku:", + "LabelTimeLimitHours": "Aikaraja (tunteina):", + "LabelTime": "Aika:", + "LabelTheme": "Teema:", + "LabelTextSize": "Tekstin koko:", + "LabelTextColor": "Tekstin väri:", + "LabelTextBackgroundColor": "Tekstin taustaväri:", + "LabelSupportedMediaTypes": "Tuetut mediatyypit:", + "LabelTag": "Tunniste:", + "LabelSubtitles": "Tekstitykset", + "LabelSubtitleFormatHelp": "Esimerkki: srt", + "LabelStatus": "Status:", + "LabelSource": "Lähde:", + "LabelSize": "Koko:", + "LabelServerName": "Palvelimen nimi:", + "LabelServerHostHelp": "192.168.1.100:8096 tai https://myserver.com", + "LabelSelectUsers": "Valitse käyttäjät:", + "LabelSeasonNumber": "Kauden numero:", + "LabelScreensaver": "Näytönsäästäjä:", + "LabelReasonForTranscoding": "Transkoodauksen syy:", + "LabelReadHowYouCanContribute": "Katso, miten voit auttaa.", + "LabelPublicHttpsPort": "Julkinen HTTPS-porttinumero:", + "LabelPublicHttpPort": "Julkinen HTTP-porttinumero:", + "LabelProtocolInfo": "Protokollan info:", + "LabelProtocol": "Protokolla:", + "LabelPreferredSubtitleLanguage": "Ensisijainen tekstityksen kieli:", + "LabelPreferredDisplayLanguageHelp": "Jellyfinin kääntäminen on käynnissä oleva projekti.", + "LabelPlayerDimensions": "Soittimen mitat:", + "LabelPlayer": "Soitin:", + "LabelPlaylist": "Soittolista:", + "LabelPlaceOfBirth": "Synnyinpaikka:", + "LabelPersonRoleHelp": "Esimerkki: Jäätelöauton ajaja", + "LabelPersonRole": "Rooli:", + "LabelPath": "Polku:", + "LabelPasswordRecoveryPinCode": "PIN-koodi:", + "LabelPasswordConfirm": "Salasanan varmistus:", + "LabelPassword": "Salasana:", + "LabelOptionalNetworkPath": "(Valinnainen) Jaettu verkkokansio:", + "LabelNumber": "Numero:", + "LabelNotificationEnabled": "Ota tämä ilmoitus käyttöön", + "LabelNewName": "Uusi nimi:", + "LabelName": "Nimi:", + "LabelMovieCategories": "Elokuvakategoriat:", + "LabelMinScreenshotDownloadWidth": "Pienin kuvakaappauksen latauksen leveys:", + "LabelMinResumePercentageHelp": "Kohteita pidetään toistamattomina, jos toisto keskeytetään ennen tätä aikaa.", + "LabelMinResumeDuration": "Minimi jatkamisen kesto (sekuntia):", + "LabelMinResumePercentage": "Vähimmäisaika jatkoa varten (%):", + "LabelMinResumeDurationHelp": "Kohteiden, joiden toistoaika on tätä lyhyempi, ei voi jatkaa.", + "LabelMethod": "Metodi:", + "LabelMetadataSaversHelp": "Valitse tiedostomuodot, joihin metadata tallennetaan.", + "LabelMetadataSavers": "Metadatan tallentajat:", + "LabelMetadataDownloadLanguage": "Ensisijainen latauskieli:", + "LabelMetadataReaders": "Metadatan lukijat:", + "LabelMetadataPath": "Metadatan polku:", + "LabelMetadata": "Metadata:", + "LabelMessageTitle": "Viestin otsikko:", + "LabelCachePath": "Välimuistin polku:", + "LabelCache": "Välimuisti:", + "LabelBurnSubtitles": "Polta tekstitykset:", + "LabelAutomaticallyRefreshInternetMetadataEvery": "Päivitä metadata automaattisesti:", + "LabelAuthProvider": "Todennuksen tarjoaja:", + "ExtraLarge": "Suurin", + "EveryNDays": "Joka {0} päivä", + "Raised": "Korotettu", + "TabShows": "Sarjat", + "Yesterday": "Eilen", + "Yes": "Kyllä", + "Unplayed": "Toistamattomat", + "Unmute": "Lopeta vaimennus", + "Tuesday": "Tiistai", + "Transcoding": "Transkoodaus", + "Trailers": "Trailerit", + "TitlePlayback": "Toistaminen", + "Thursday": "Torstai", + "TheseSettingsAffectSubtitlesOnThisDevice": "Nämä asetukset vaikuttavat tekstityksiin tällä laitteella", + "ThemeVideos": "Tunnusvideot", + "ThemeSongs": "Tunnuslaulut", + "TagsValue": "Tunnisteet: {0}", + "Tags": "Tunnisteet", + "TabUsers": "Käyttäjät", + "TabUpcoming": "Tulevat", + "TabTranscoding": "Transkoodaus", + "TabSuggestions": "Ehdotukset", + "TabSongs": "Kappaleet", + "TabSettings": "Asetukset", + "TabServer": "Palvelin", + "TabSeries": "Sarjat", + "TabScheduledTasks": "Ajastetut tehtävät", + "TabResumeSettings": "Jatka", + "TabResponses": "Vastaukset", + "TabRecordings": "Tallennukset", + "TabPlugins": "Liitännäiset", + "TabPlaylists": "Soittolistat", + "TabPlaylist": "Soittolista", + "TabPlayback": "Toistaminen", + "TabNfoSettings": "NFO-asetukset", + "TabNetworks": "Verkot", + "TabMyPlugins": "Omat liittännäiseni", + "TabMusicVideos": "Musiikkivideot", + "TabMusic": "Musiikki", + "TabMovies": "Elokuvat", + "TabMetadata": "Metadata", + "TabLogs": "Lokit", + "TabLiveTV": "Live-TV", + "TabLatest": "Uusimmat", + "TabInfo": "Tiedot", + "TabGenres": "Tyylilajit", + "TabFavorites": "Suosikit", + "TabEpisodes": "Jaksot", + "TabDisplay": "Näyttö", + "TabDirectPlay": "Suoratoisto", + "TabDevices": "Laitteet", + "TabDashboard": "Päänäkymä", + "TabCollections": "Kokoelmat", + "TabChannels": "Kanavat", + "TabCatalog": "Luettelo", + "TabArtists": "Artistit", + "TabAlbums": "Albumit", + "TabAlbumArtists": "Albumin artistit", + "TabAdvanced": "Edistynyt", + "TV": "TV", + "Sunday": "Sunnuntai", + "Subtitles": "Tekstitykset", + "Studios": "Studiot", + "StopRecording": "Lopeta tallennus", + "Sort": "Järjestä", + "Smart": "Älykäs", + "SkipEpisodesAlreadyInMyLibrary": "Älä tallenna jaksoja, jotka ovat jo kirjastossani", + "Shuffle": "Satunnaistoisto", + "ShowTitle": "Näytä nimi", + "ShowYear": "Näytä vuosi", + "ShowAdvancedSettings": "Näytä edistyneet asetukset", + "Share": "Jaa", + "Settings": "Asetukset", + "ServerRestartNeededAfterPluginInstall": "Jellyfin palvelin täytyy uudelleenkäynnistää liitännäisen asennuksen jälkeen.", + "ServerNameIsShuttingDown": "Jellyfin palvelin - {0} on sammumassa.", + "ServerNameIsRestarting": "Jellyfin palvelin - {0} uudelleenkäynnistyy.", + "Series": "Sarjat", + "SendMessage": "Lähetä viesti", + "SelectAdminUsername": "Valitse käyttäjätunnus järjestelmänvalvojan tilille.", + "SearchForCollectionInternetMetadata": "Etsi kuvamateriaalia ja metadataa internetistä", + "SearchForMissingMetadata": "Etsi puuttuvaa metadataa", + "Season": "Kausi", + "SearchResults": "Tulokset", + "SearchForSubtitles": "Etsi tekstityksiä", + "Search": "Etsi", + "Screenshots": "Kuvakaappaukset", + "Screenshot": "Kuvakaappaus", + "Schedule": "Ajasta", + "ScanLibrary": "Skannaa kirjasto", + "SaveSubtitlesIntoMediaFolders": "Tallenna tekstitykset mediakansioihin", + "Saturday": "Lauantai", + "ResumeAt": "Jatka kohdasta {0}", + "RestartPleaseWaitMessage": "Odota kunnes Jellyfin palvelin sammuu ja käynnistyy uudelleen. Tämä voi kestää hetken aikaa.", + "RequiredForAllRemoteConnections": "Vaadittu kaikille etäyhteyksille", + "ReplaceExistingImages": "Korvaa olemassaolevat kuvat", + "ReplaceAllMetadata": "Korvaa kaikki metadata", + "RepeatEpisodes": "Toista jaksot uudelleen", + "RepeatAll": "Toista kaikki uudelleen", + "Repeat": "Toista uudelleen", + "RemoveFromPlaylist": "Poista soittolistalta", + "RemoveFromCollection": "Poista kokoelmasta", + "RememberMe": "Muista minut", + "ReleaseDate": "Julkaisupäivä", + "RefreshMetadata": "Päivitä metadata", + "RefreshDialogHelp": "Metadata päivitetään asetuksien ja Internet palveluiden perusteella, jotka ovat kytkettynä päälle Jellyfin palvelimen päänäkymässä.", + "Refresh": "Päivitä", + "Recordings": "Tallennukset", + "RecordingScheduled": "Tallennus ajastettu.", + "RecordingCancelled": "Tallennus peruttu.", + "RecordSeries": "Tallenna sarja", + "Record": "Tallenna", + "OptionAutomatic": "Auto", + "OptionAuto": "Auto", + "OptionAscending": "Nousevassa järjestyksessä", + "OptionArtist": "Artisti", + "OptionAllowVideoPlaybackTranscoding": "Salli transkoodausta vaativan videon toistaminen", + "OptionAllowVideoPlaybackRemuxing": "Salli videon toistaminen, joka vaatii muuntamista ilman koodausta", + "OptionAllowMediaPlaybackTranscodingHelp": "Transkoodauksen estäminen voi aiheuttaa toistovirheitä Jellyfin-sovelluksissa ei-tuettujen mediaformaattien takia.", + "OptionAllowLinkSharingHelp": "Vain mediatietoja sisältävät web-sivut jaetaan. Mediatiedostoja ei koskaan jaeta julkisesti. Jaot ovat määräaikaisia ja päättyvät {0} päivän kuluttua.", + "OptionAllowUserToManageServer": "Salli tämän käyttäjän hallita palvelinta", + "OptionAllowSyncTranscoding": "Salli transkoodausta vaativan median lataaminen ja synkronointi", + "OptionAllowRemoteSharedDevicesHelp": "DLNA-laitteet katsotaan jaetuiksi kunnes käyttäjä alkaa ohjata niitä.", + "OptionAllowRemoteSharedDevices": "Salli jaettujen laitteiden etäohjaaminen", + "OptionAllowRemoteControlOthers": "Salli muiden käyttäjien etäohjaaminen", + "OptionAllowManageLiveTv": "Salli Live-TV tallenteiden hallinta", + "OptionAllowMediaPlayback": "Salli median toisto", + "OptionAllowContentDownloading": "Salli median lataaminen ja synkronointi", + "OptionAllowBrowsingLiveTv": "Salli Live-TV käyttöoikeus", + "HeaderPluginInstallation": "Liitännäisen asennus", + "HeaderPlaybackError": "Toistovirhe", + "HeaderPlayback": "Median toisto", + "HeaderPlayOn": "Toista laitteella", + "OptionAllowLinkSharing": "Salli jakaminen sosiaaliseen mediaan", + "OptionAllowAudioPlaybackTranscoding": "Salli äänen toistaminen joka vaatii uudelleenpakkausta", + "OptionAllUsers": "Kaikki käyttäjät", + "OptionAlbumArtist": "Albumin artisti", + "OptionAlbum": "Albumi", + "OptionAdminUsers": "Järjestelmänvalvojat", + "Option3D": "3D", + "MusicVideo": "Musiikkivideo", + "MoveRight": "Siirry oikealle", + "MoveLeft": "Siirry vasemmalle", + "Mobile": "Mobiili", + "EveryXHours": "Joka {0} tunti", + "EveryXMinutes": "Joka {0} minuutti", + "EveryHour": "Joka tunti", + "LastSeen": "Viimeksi nähty {0}", + "Yadif": "YADIF", + "Writer": "Kirjoittaja", + "WelcomeToProject": "Tervetuloa Jellyfiniin!", + "Wednesday": "Keskiviikko", + "ViewArtist": "Näytä artisti", + "ViewAlbum": "Näytä albumi", + "Vertical": "Vertikaalinen", + "ValueSongCount": "{0} kappaletta", + "ValueSeriesCount": "{0} sarjaa", + "ValueSeconds": "{0} sekuntia", + "ValueOneSong": "1 kappale", + "ValueOneSeries": "1 sarja", + "ValueOneMusicVideo": "1 musiikkivideo", + "ValueOneMovie": "1 elokuva", + "ValueOneEpisode": "1 jakso", + "ValueOneAlbum": "1 albumi", + "ValueMusicVideoCount": "{0} musiikkivideota", + "ValueMovieCount": "{0} elokuvaa", + "ValueMinutes": "{0} min", + "ValueEpisodeCount": "{0} jaksoa", + "ValueDiscNumber": "Levy {0}", + "ValueAlbumCount": "{0} albumia", + "Up": "Ylös", + "OnApplicationStartup": "Käynnistyksen yhteydessä", + "NumLocationsValue": "{0} kansiota", + "NoSubtitleSearchResultsFound": "Ei tuloksia.", + "NoPluginConfigurationMessage": "Tällä liitännäisellä ei ole asetuksia muokattavaksi.", + "NoCreatedLibraries": "Vaikuttaa siltä, ettet ole luonut vielä yhtään kirjastoa. {0} Haluaisitko luoda sellaisen nyt?{1}", + "No": "Ei", + "NextUp": "Seuraavana", + "Next": "Seuraava", + "NewEpisodesOnly": "Vain uudet jaksot", + "NewEpisodes": "Uusia jaksoja", + "NewCollectionNameExample": "Esimerkki: Star Wars Kokoelma", + "NewCollectionHelp": "Kokoelmat mahdollistavat elokuvien ja muun kirjastosisällön personalisoidun ryhmittämisen.", + "NewCollection": "Uusi kokoelma", + "Mute": "Vaimenna", + "Name": "Nimi", + "MySubtitles": "Minun tekstitykseni", + "MusicArtist": "Musiikkiartisti", + "MusicAlbum": "Musiikkialbumi", + "Movie": "Elokuva", + "Monday": "Maanantai", + "MetadataManager": "Metadatan hallintatyökalu", + "Metadata": "Metadata", + "MessageYouHaveVersionInstalled": "Sinulla on versio {0} asennettuna.", + "MessageSettingsSaved": "Asetukset tallennettu.", + "MessagePleaseWait": "Ole hyvä ja odota. Tämä voi kestää hetken.", + "MessageNothingHere": "Täällä ei ole mitään.", + "MessageNoPluginsInstalled": "Sinulla ei ole asennettuna yhtään liitännäistä.", + "MessageNoAvailablePlugins": "Ei saatavilla olevia liitännäisiä.", + "InstallingPackage": "Asennetaan {0} (versio {1})", + "HeaderVideoTypes": "Videotyypit", + "HeaderVideoType": "Videotyyppi", + "HeaderUploadImage": "Lataa kuva", + "HeaderTypeText": "Kirjoita teksti", + "HeaderTunerDevices": "Viritinlaitteet", + "HeaderTuners": "Virittimet", + "HeaderTaskTriggers": "Tehtävän laukaisijat", + "HeaderSubtitleProfilesHelp": "Tekstitysprofiilit kuvaavat tämän laitteen tukemia tekstitysformaatteja.", + "HeaderSubtitleProfiles": "Tekstitysprofiilit", + "HeaderSubtitleProfile": "Tekstitysprofiili", + "HeaderStartNow": "Aloita nyt", + "HeaderSortBy": "Lajittele", + "HeaderSelectServerCachePath": "Valitse palvelimen välimuistin polku", + "HeaderSelectPath": "Valitse polku", + "HeaderSelectCertificatePath": "Valitse sertifikaatin polku", + "HeaderSelectMetadataPath": "Valitse metadatan polku", + "HeaderSecondsValue": "{0} Sekuntia", + "HeaderRunningTasks": "Käynnissä olevat tehtävät", + "HeaderRevisionHistory": "Versiohistoria", + "HeaderRestartingServer": "Uudelleenkäynnistetään palvelinta", + "HeaderRemoveMediaFolder": "Poista mediakansio", + "HeaderRemoteControl": "Etäohjaus", + "HeaderPleaseSignIn": "Ole hyvä ja kirjaudu sisään", + "BoxSet": "Laatikkosarja", + "LabelAccessEnd": "", + "LabelManufacturerUrl": "Valmistajan verkko-osoite", + "LabelManufacturer": "Valmistaja:", + "LabelLogs": "Lokit:", + "LabelLanNetworks": "Lähiverkot:", + "LabelKodiMetadataDateFormat": "Julkaisupäivämäärän muoto:", + "LabelImageType": "Kuvan tyyppi:", + "LabelIconMaxWidth": "Ikonin enimmäisleveys:", + "LabelIconMaxHeight": "Ikonin enimmäiskorkeus:", + "LabelGroupMoviesIntoCollections": "Ryhmitä elokuvat kokoelmiin", + "LabelFormat": "Muoto:", + "LabelFont": "Kirjasinlaji:", + "LabelFolder": "Kansio:", + "LabelEpisodeNumber": "Jaksonumero:", + "LabelDropShadow": "Varjostus:", + "LabelDeathDate": "Kuolinpäivä:", + "LabelDay": "Päivä:", + "LabelDateAdded": "Lisäyspäivämäärä:", + "LabelCollection": "Kokoelma:", + "LabelBirthYear": "Syntymävuosi:", + "LabelBirthDate": "Syntymäaika:", + "LabelArtists": "Artistit:", + "LabelAll": "Kaikki", + "LabelAlbum": "Albumi:", + "LabelAirTime": "Lähetysaika:", + "LabelAccessDay": "Viikonpäivä:", + "Label3DFormat": "3D-formaatti:", + "Kids": "Lapset", + "Images": "Kuvat", + "Hide": "Piilota", + "HeadersFolders": "Kansiot", + "HeaderYears": "Vuodet", + "HeaderVideos": "Videot", + "HeaderVideoQuality": "Kuvanlaatu", + "HeaderUsers": "Käyttäjät", + "HeaderUser": "Käyttäjä", + "HeaderTags": "Tunnisteet", + "HeaderSubtitleAppearance": "Tekstityksen ulkonäkö", + "HeaderStatus": "Tila", + "HeaderShutdown": "Sammuta", + "HeaderServerSettings": "Palvelimen asetukset", + "HeaderSettings": "Asetukset", + "HeaderSendMessage": "Lähetä viesti", + "HeaderSelectServer": "Valitse palvelin", + "HeaderSeasons": "Kaudet", + "HeaderRestart": "Uudelleenkäynnistys", + "HeaderProfile": "Profiili", + "HeaderPlayAll": "Toista kaikki", + "HeaderPeople": "Ihmiset", + "HeaderPassword": "Salasana", + "HeaderNewApiKey": "Uusi API-avain", + "HeaderNavigation": "Navigaatio", + "HeaderMusicVideos": "Musiikkivideot", + "HeaderMusicQuality": "Musiikin laatu", + "HeaderLibraries": "Kirjastot", + "HeaderIdentification": "Tunnistautuminen", + "HeaderForgotPassword": "Unohtuiko salasana", + "HeaderForKids": "Lapsille", + "HeaderError": "Virhe", + "HeaderEpisodes": "Jaksot", + "HeaderEditImages": "Muokkaa kuvia", + "HeaderDisplay": "Näyttö", + "HeaderDevices": "Laitteet", + "HeaderDeleteItems": "Poista valitut", + "HeaderDeleteItem": "Poista valittu", + "HeaderDeleteDevice": "Poista laite", + "HeaderContinueListening": "Jatka kuuntelua", + "HeaderConnectionFailure": "Yhteys epäonnistui", + "HeaderConnectToServer": "Yhdistä palvelimeen", + "HeaderAudioSettings": "Ääniasetukset", + "GroupBySeries": "Ryhmitä sarjan perusteella", + "Fullscreen": "Kokonäyttötila", + "HeaderBooks": "Kirjat", + "HeaderAutomaticUpdates": "Automaattiset päivitykset", + "HeaderAudioBooks": "Äänikirjat", + "HeaderApiKeys": "API-avaimet", + "HeaderApiKey": "API-avain", + "HeaderAdmin": "Ylläpitäjä", + "HeaderAlbums": "Albumit", + "HeaderAddUser": "Lisää käyttäjä", + "HeaderAddUpdateImage": "Lisää/Päivitä kuva", + "HeaderAddToPlaylist": "Lisää soittolistaan", + "HeaderAddToCollection": "Lisää kokoelmaan", + "HeaderActiveDevices": "Aktiiviset laitteet", + "Friday": "Perjantai", + "Premiere": "Ensiesitys", + "Producer": "Tuottaja", + "Quality": "Laatu", + "LabelMessageText": "Viestin sisältö:", + "LabelMaxScreenshotsPerItem": "Kuvakaappausten enimmäismäärä per kohde:", + "LabelLoginDisclaimerHelp": "Viesti, joka näytetään kirjautumissivun alareunassa.", + "LabelLockItemToPreventChanges": "Lukitse tämä kohde estääksesi tulevat muutokset", + "LabelLocalHttpServerPortNumberHelp": "TCP-portin numero, jota Jellyfinin HTTP-palvelimen tulee kuunnella.", + "LabelLocalHttpServerPortNumber": "Paikallisen HTTP-portin numero:", + "LabelKodiMetadataSaveImagePaths": "Tallenna kuvien polut NFO-tiedostojen sisälle", + "LabelKidsCategories": "Lasten kategoriat:", + "LabelHttpsPortHelp": "TCP-portin numero, jota Jellyfinin HTTPS-palvelimen tulee kuunnella.", + "LabelHttpsPort": "Paikallisen HTTPS-portin numero:", + "LabelHardwareAccelerationTypeHelp": "Laitteistokiihdytys vaatii ylimääräistä määritystä.", + "LabelHardwareAccelerationType": "Laitteistokiihdytys:", + "LabelEncoderPreset": "H264 and H265 encoding preset:", + "LabelH264Crf": "H264 encoding CRF:", + "LabelForgotPasswordUsernameHelp": "Anna käyttäjätunnuksesi, jos muistat sen.", + "LabelEveryXMinutes": "Joka:", + "LabelEndDate": "Päättymispäivä:", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Määrittää, kuinka usein Jellyfin etsii SSDP-protokollaa käyttäviä laitteita.", + "LabelEnableDlnaDebugLoggingHelp": "Luo suuria lokitiedostoja ja tulisi käyttää vain tarvittaessa vianmääritystä varten.", + "LabelEnableDlnaServerHelp": "Sallii verkon UPnP-laitteiden selata ja toistaa sisältöä tältä palvelimelta.", + "LabelEnableDlnaServer": "Ota DLNA-palvelin käyttöön", + "LabelEnableDlnaPlayTo": "Salli DLNA toisto", + "LabelEnableDlnaDebugLogging": "Ota DLNA:n virheenjäljitys käyttöön", + "LabelEnableBlastAliveMessages": "Lähetä hereilläolo -viesti", + "LabelEnableBlastAliveMessagesHelp": "Ota tämä käyttöön, jos muilla verkon UPnP-laitteilla on ongelmia palvelimen havaitsemisessa.", + "LabelEnableDlnaClientDiscoveryInterval": "Asiakaslaitteiden havaintoväli (sekunteina)", + "LabelEasyPinCode": "Helppo PIN-koodi:", + "LabelDynamicExternalId": "{0} Id:", + "LabelDisplayLanguageHelp": "Jellyfinin kääntäminen on käynnissä oleva projekti.", + "LabelDisplayLanguage": "Näytön kieli:", + "LabelDiscNumber": "Levynumero:", + "LabelDeviceDescription": "Laitteen kuvaus", + "LabelDefaultScreen": "Oletusnäyttö:", + "LabelDefaultUser": "Oletuskäyttäjä:", + "LabelDashboardTheme": "Palvelimen päänäkymän teema:", + "LabelCustomCertificatePathHelp": "Polku PKCS # 12-tiedostoon, joka sisältää sertifikaatin ja yksityisen avaimen, jotta TLS-tuki voidaan sallia henkilökohtaiselle verkkotunnukselle.", + "LabelCustomCertificatePath": "Mukautetun SSL-sertifikaatin polku:", + "LabelContentType": "Sisältötyyppi:", + "LabelChannels": "Kanavat:", + "LabelCertificatePasswordHelp": "Jos sertifikaattisi vaatii salasanaa, laita se tähän.", + "OptionWednesday": "Keskiviikko", + "OptionTuesday": "Tiistai", + "OptionThursday": "Torstai", + "OptionSunday": "Sunnuntai", + "OptionSaturday": "Lauantai", + "LabelRuntimeMinutes": "Pituus (minuutteja):", + "LabelReleaseDate": "Julkaisupäivä:", + "Genre": "Tyylilaji", + "FolderTypeBooks": "Kirjat", + "FolderTypeMusicVideos": "Musiikkivideot", + "FolderTypeMusic": "Musiikki", + "FolderTypeMovies": "Elokuvat", + "File": "Tiedosto", + "Favorite": "Suosikki", + "Extras": "Extrat", + "ExitFullscreen": "Poistu kokonäyttötilasta", + "Episode": "Jakso", + "ButtonTogglePlaylist": "Soittolista", + "ButtonToggleContextMenu": "Lisää", + "Artist": "Artisti", + "RefreshQueued": "Päivitys odottamassa.", + "SeriesCancelled": "Sarja peruttu.", + "MediaInfoRefFrames": "Ref frames", + "LabelXDlnaDoc": "X-DLNA doc:", + "LabelXDlnaCap": "X-DLNA cap:", + "Guide": "Opas", + "DailyAt": "Päivittäin klo {0}", + "Uniform": "Yhtenäinen", + "TrackCount": "{0} raitaa", + "Track": "Raita", + "TitleHardwareAcceleration": "Laitteistokiihdytys", + "Thumb": "Pikkukuva", + "TabStreaming": "Suoratoisto", + "TabParentalControl": "Lapsilukko", + "TabOther": "Muut", + "TabNotifications": "Ilmoitukset", + "TabNetworking": "Verkkoasetukset", + "TabGuide": "Opas", + "TabContainers": "Säiliöt", + "TabCodecs": "Codecit", + "Suggestions": "Ehdotukset", + "Sports": "Urheilu", + "Smaller": "Pienin", + "SmallCaps": "Small Caps", + "Small": "Pieni", + "Filter": "Suodata", + "New": "Uusi", + "Runtime": "Kesto", + "PlayAllFromHere": "Toista kaikki tästä lähtien", + "PlayNextEpisodeAutomatically": "Toista seuraava jakso automaattisesti", + "PlayCount": "Toistokerrat", + "PlaybackData": "Toistamisen tiedot", + "PinCodeResetComplete": "PIN-koodi on nollattu.", + "Overview": "Yleiskatsaus", + "OptionWakeFromSleep": "Herätä lepotilasta", + "OptionUnairedEpisode": "Julkaisemattomat jaksot", + "OptionParentalRating": "Ikäraja", + "OptionNone": "Ei mitään", + "OptionIgnoreTranscodeByteRangeRequests": "Ohita transkoodauksen tavualuepyynnöt", + "OptionHlsSegmentedSubtitles": "HLS segmentoidut tekstitykset", + "OptionEnableExternalContentInSuggestions": "Ota käyttöön ulkoinen sisältö ehdotuksissa", + "OptionEmbedSubtitles": "Upota säiliöön", + "OptionForceRemoteSourceTranscoding": "Pakota etämedialähteiden transkoodaus (kuten Live-TV)", + "OneChannel": "Yksi kanava", + "Off": "Poissa päältä", + "Normal": "Normaali", + "None": "Ei mitään", + "NoSubtitles": "Ei mitään", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Seuraavat mediasijainnit tullaan poistamaan kirjastostasi:", + "MessageItemsAdded": "Kohteet lisätty.", + "MessageItemSaved": "Kohde tallennettu.", + "MessageEnablingOptionLongerScans": "Tämän vaihtoehdon käyttöönottaminen voi johtaa huomattavasti pidempiin kirjastojen skannauksiin.", + "MessageDownloadQueued": "Lataus asetettu jonoon.", + "MessageConfirmRevokeApiKey": "Haluatko varmasti perua tämän API-avaimen? Sovelluksen yhteys Jellyfin-palvelimeen lopetetaan äkillisesti.", + "MessageConfirmRemoveMediaLocation": "Haluatko varmasti poistaa tämän sijainnin?", + "MessageConfirmRecordingCancellation": "Peruuta tallennus?", + "MessageConfirmDeleteGuideProvider": "Haluatko varmasti poistaa tämän ohjelmaoppaan tarjoajan?", + "MediaInfoStreamTypeEmbeddedImage": "Upotettu kuva", + "MediaInfoSampleRate": "Näytteenottotaajuus", + "MediaInfoPixelFormat": "Pikseliformaatti", + "MediaInfoLayout": "Asettelu", + "MediaInfoContainer": "Säiliö", + "MediaInfoCodecTag": "Codec-tunniste", + "MediaInfoCodec": "Codec", + "MediaInfoBitrate": "Bitrate", + "Like": "Tykkää", + "LabelVideoBitrate": "Videon bitrate:", + "LabelWeb": "Web:", + "LabelVideoCodec": "Videon codec:", + "LabelTranscodingVideoCodec": "Video codec:", + "LabelSkipIfGraphicalSubsPresent": "Ohita, jos video sisältää upotetut tekstitykset", + "LabelInternetQuality": "Verkkoyhteyden laatu:", + "LabelEmbedAlbumArtDidl": "Upota albumin kuvamateriaali Didl:iin", + "LabelDeinterlaceMethod": "Lomituksen poistamismenetelmä:", + "LabelAudioBitDepth": "Audion bittisyvyys:", + "LabelAlbumArtists": "Albumin artistit:", + "Items": "Kohteet", + "ItemCount": "{0} kohdetta", + "Home": "Koti", + "Help": "Apua", + "HeaderXmlSettings": "Xml-asetukset", + "HeaderXmlDocumentAttributes": "Xml-dokumentin attribuutit", + "HeaderXmlDocumentAttribute": "Xml-dokumentin attribuutti", + "HeaderStopRecording": "Lopeta tallennus", + "HeaderRecordingPostProcessing": "Tallennuksen jälkikäsittely", + "HeaderParentalRatings": "Ikärajat", + "HeaderOtherItems": "Muut kohteet", + "HeaderLiveTvTunerSetup": "Live-TV virittimen määritys", + "HeaderLibrarySettings": "Kirjaston asetukset", + "HeaderItems": "Kohteet", + "HeaderGuideProviders": "TV-ohjelmaoppaiden tarjoajat", + "HeaderFavoritePlaylists": "Suosikki soittolistat", + "HeaderEnabledFields": "Käytössä olevat kentät", + "HeaderCodecProfile": "Codec-profiili", + "HeaderContainerProfile": "Säiliöprofiili", + "PleaseSelectTwoItems": "Valitse ainakin kaksi kohdetta.", + "PleaseRestartServerName": "Ole hyvä ja uudelleenkäynnistä Jellyfin-palvelin - {0}.", + "PleaseEnterNameOrId": "Anna nimi tai ulkoinen ID.", + "PreferEmbeddedTitlesOverFileNames": "Suosi upotettuja otsikoita tiedostonimien sijasta", + "PreferredNotRequired": "Suositeltava, mutta ei vaadittu", + "Premieres": "Ensiesitys", + "Primary": "Ensisijainen", + "Previous": "Edellinen", + "RecommendationBecauseYouWatched": "Koska katsoit {0}", + "RecommendationBecauseYouLike": "Koska pidät {0}", + "RecentlyWatched": "Äskettäin katsotut", + "Programs": "Ohjelmat", + "LabelServerNameHelp": "Tätä nimeä käytetään palvelimen tunnistamiseen. Jos tyhjä, käytetään tietokoneen nimeä.", + "LabelEnableRealtimeMonitorHelp": "Tiedostojen muutokset käsitellään välittömästi tuetuissa tiedostojärjestelmissä.", + "LabelEnableRealtimeMonitor": "Ota reaaliaikainen seuranta käyttöön", + "LabelDropImageHere": "Pudota kuva tähän, tai paina selataksesi.", + "LabelDroppedFrames": "Pudotettuja kuvia:", + "LabelDidlMode": "DIDL tila:", + "LabelCustomDeviceDisplayNameHelp": "Tätä nimeä käytetään laitteen tunnistamiseen. Jos tyhjä, käytetään laitteen nimeä.", + "LabelCustomCssHelp": "Käytä omaa CSS: ää web-käyttöliittymään.", + "LabelCorruptedFrames": "Korruptoituneita kuvia:", + "LabelCriticRating": "Kriitikoiden luokitus:", + "LabelCommunityRating": "Yhteisön luokitus:", + "LabelCancelled": "Peruttu", + "LabelBlockContentWithTags": "Estä kohteet tunnisteilla:", + "LabelBitrate": "Bitrate:", + "LabelAudioSampleRate": "Audion näytteenottotaajuus:", + "LabelAudioChannels": "Audiokanavia:", + "LabelAudioBitrate": "Audion bitrate:", + "LabelAudioCodec": "Audio codec:", + "LabelTranscodingContainer": "Säiliö:", + "LabelTranscodingAudioCodec": "Audio codec:", + "LabelSubtitleDownloaders": "Tekstitysten lataajat:", + "LabelSpecialSeasonsDisplayName": "Erikoiskauden näyttönimi:", + "LabelSoundEffects": "Ääniefektit:", + "LabelSortTitle": "Lajitteluotsikko:", + "LabelSkipIfAudioTrackPresent": "Ohita, jos oletusääniraita vastaa latauskieltä", + "LabelSkipBackLength": "Taaksepäin hyppäämisen pituus:", + "LabelSkipForwardLength": "Eteenpäin hyppäämisen pituus:", + "LabelScheduledTaskLastRan": "Viimeisin ajo {0}, kesto {1}.", + "LabelRemoteClientBitrateLimitHelp": "Valinnainen bittinopeusraja yksittäisille suoratoistaville laitteille lähiverkon ulkopuolella. Tämä on hyödyllistä estääkseen laitteita pyytämästä suurempia bittinopeuksia kuin Internet-yhteys voi käsitellä. Tämä voi johtaa palvelimen prosessorin kuormituksen lisääntymiseen, jotta videot voidaan transkoodata pienempiin bittinopeuksiin.", + "LabelRemoteClientBitrateLimit": "Internetistä suoratoiston enimmäisnopeus (Mbps):", + "LabelRefreshMode": "Päivitystila:", + "LabelRecordingPathHelp": "Määritä oletussijainti tallennuksille. Jätä tyhjäksi käyttääksesi palvelimen datakansiota.", + "LabelRecordingPath": "Oletustallennuspolku:", + "LabelProtocolInfoHelp": "Arvo, jota käytetään vastattaessa laitteen GetProtocolInfo-pyyntöihin.", + "LabelProfileCodecsHelp": "Pilkulla erotettuna. Jätä tyhjäksi käyttääksesi kaikissa codeceissa.", + "LabelProfileContainersHelp": "Pilkulla erotettuna. Jätä tyhjäksi käyttääksesi kaikissa säiliöissä.", + "LabelProfileVideoCodecs": "Video codecs:", + "LabelProfileContainer": "Säiliö:", + "LabelProfileCodecs": "Codecs:", + "LabelProfileAudioCodecs": "Audio codecs:", + "LabelPostProcessor": "Jälkikäsittelysovellus:", + "LabelPostProcessorArguments": "Jälkikäsittelysovelluksen komentoriviargumentit:", + "LabelPleaseRestart": "Muutokset tulevat voimaan kun web-asiakasohjelma päivitetään manuaalisesti (reload).", + "LabelPlayDefaultAudioTrack": "Toista oletusraita kielestä riippumatta", + "LabelOverview": "Yleiskatsaus:", + "LabelPasswordResetProvider": "Salasanan nollauksen palveluntarjoaja:", + "LabelParentalRating": "Ikäraja:", + "LabelOptionalNetworkPathHelp": "Jos tämä kansio on jaettu verkossa, polun jakaminen voi mahdollistaa Jellyfin-sovellusten muilla laitteilla käyttää mediatiedostoja suoraan.", + "LabelMovieRecordingPath": "Elokuvien tallenteiden polku (valinnainen):", + "LabelMusicStreamingTranscodingBitrateHelp": "Määritä enimmäisnopeus musiikkia suoratoistettaessa.", + "LabelMusicStreamingTranscodingBitrate": "Musiikin transkoodauksen bitrate:", + "LabelMinBackdropDownloadWidth": "Taustan latauksen vähimmäisleveys:", + "LabelMetadataReadersHelp": "Järjestä ensisijaiset paikallisen metadatan lähteet prioriteettijärjestykseen. Ensimmäinen löydetty tiedosto luetaan.", + "LabelMetadataPathHelp": "Määrää mukautettu sijainti ladatulle kuvamateriaalille ja metadatalle.", + "LabelMetadataDownloadersHelp": "Ota käyttöön ja järjestä ensisijaiset metadatan lataajat prioriteettijärjestykseen. Alemman prioriteetin omaavia lataajia käytetään vain täyttämään puuttuvia tietoja.", + "LabelMaxResumePercentageHelp": "Kohteita pidetään toistettuina, jos toisto pysäytetään tämän ajan kuluttua.", + "LabelMaxResumePercentage": "Enimmäisaika jatkoa varten (%):", + "LabelMaxChromecastBitrate": "Chromecastin suoratoiston laatu:", + "LabelMaxBackdropsPerItem": "Taustojen maksimimäärä per kohde:", + "LabelLoginDisclaimer": "Sisäänkirjautumisen vastuuvapauslauseke:", + "LabelLibraryPageSize": "Kirjastosivun kohteiden määrä:", + "LabelLibraryPageSizeHelp": "Asettaa kirjastosivulla näytettävien kohteiden määrän. Arvo 0 poistaa sivutuksen käytöstä.", + "LabelLineup": "", + "Unrated": "Luokittelematon", + "ExtractChapterImagesHelp": "Pikkukuvien luominen mahdollistaa sovellusten näyttää graafiikkaa valintavalikoissa. Prosessi voi olla hidas, prosessoria kuormittava ja saattaa vaatia useita gigatavuja tilaa. Se suoritetaan, kun videoita havaitaan, ja myös yöksi suunniteltuna tehtävänä. Aikataulu on konfiguroitavissa ajoitetuissa tehtävissä. Tätä tehtävää ei ole suositeltavaa suorittaa korkean kuormituksen aikana.", + "OnWakeFromSleep": "Lepotilasta poistuttaessa", + "WeeklyAt": "{0}sin klo {1}", + "Whitelist": "Sallitut", + "Watched": "Katsotut", + "ViewPlaybackInfo": "Näytä toistamisen tiedot", + "ValueVideoCodec": "Video Codec: {0}", + "ValueTimeLimitSingleHour": "Aikaraja: 1 tunti", + "ValueTimeLimitMultiHour": "Aikaraja: {0} tuntia", + "ValueContainer": "Säiliö: {0}", + "ValueConditions": "Ehdot: {0]", + "ValueCodec": "Codec: {0}", + "ValueAudioCodec": "Audio Codec: {0}", + "SeriesYearToPresent": "{0} - Nykyhetki", + "DeinterlaceMethodHelp": "Valitse lomituksen poistomenetelmä, jota käytetään lomitetun sisällön transkoodaukseen.", + "FormatValue": "Muoto: {0}", + "General": "Yleinen", + "FolderTypeUnset": "Sekalainen sisältö", + "FetchingData": "Noudetaan lisätietoja", + "Features": "Ominaisuudet", + "ErrorMessageStartHourGreaterThanEnd": "Loppumisajan on oltava myöhemmin kuin aloitusaika.", + "MediaInfoAnamorphic": "Anamorfinen" } diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index 131be8a57..1f74b7bd5 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -134,12 +134,12 @@ "BirthLocation": "Lieu de naissance", "BirthPlaceValue": "Lieu de naissance : {0}", "Blacklist": "Liste noire", - "BookLibraryHelp": "Les livres audios et numériques sont supportés. Consultez le {0}Guide de nommage pour livre de Jellyfin{1}.", + "BookLibraryHelp": "Les livres audios et formats textes sont supportés. Consultez le {0}Guide de nommage de livres de Jellyfin{1}.", "Box": "Boîtier", "BoxRear": "Dos de boîtier", "Browse": "Parcourir", "BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.", - "AllowHWTranscodingHelp": "Si l'option est activée, permet au récepteur TV de transcoder les flux à la volée. Cela peut aider à réduire le transcodage requis par le serveur Jellyfin.", + "AllowHWTranscodingHelp": "Permet au récepteur TV de transcoder les flux à la volée. Cela peut aider à réduire le transcodage requis par le serveur Jellyfin.", "BurnSubtitlesHelp": "Détermine si le serveur doit graver les sous-titres lors de la conversion vidéo en fonction du format des sous-titres. Éviter la gravure des sous-titres améliorera les performances du serveur. Sélectionnez Auto pour graver les formats basés sur l'image (par exemple, VOBSUB, PGS, SUB/IDX etc) ainsi que certains sous-titres ASS/SSA", "ButtonAccept": "Accepter", "ButtonAdd": "Ajouter", @@ -185,5 +185,13 @@ "ButtonManualLogin": "Connexion manuelle", "ButtonMenu": "Menu", "ButtonMore": "Plus", - "ButtonNetwork": "Réseau" + "ButtonNetwork": "Réseau", + "AspectRatio": "Format de visionnement", + "AskAdminToCreateLibrary": "Demander à l'administrateur pour créer une bibliothèque de média.", + "Artist": "Artiste", + "AllowFfmpegThrottlingHelp": "Quand un transcodage ou rémux se déplace après la position de relecture, suspendre le processus pour consommer moins de ressources. Ceci est le plus utile pour chercher moins. Désactiver s'il y a des problèmes de relecture.", + "AllowFfmpegThrottling": "Restreindre la vitesse de transcodage", + "AlbumArtist": "Artiste de l'Album", + "Album": "Album", + "AuthProviderHelp": "Sélectionner un fournisseur d'authentification pour authentifier le mot de passe de cet utilisateur." } diff --git a/src/strings/fr.json b/src/strings/fr.json index 63483821a..3f1d22c75 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1504,5 +1504,8 @@ "UnsupportedPlayback": "Jellyfin ne peut pas décoder du contenu protégé par un système de gestion des droits numériques, mais une tentative de lecture sera effectuée sur tout le contenu, y compris les titres protégés. Certains fichiers peuvent apparaître complètement noir, du fait de protections ou de fonctionnalités non supportées, comme les titres interactifs.", "MessageUnauthorizedUser": "Vous n'êtes pas autorisé à accéder au serveur pour le moment. Veuillez contacter l'administrateur de votre serveur pour plus d'informations.", "ButtonTogglePlaylist": "Liste de lecture", - "ButtonToggleContextMenu": "Plus" + "ButtonToggleContextMenu": "Plus", + "Filter": "Filtre", + "New": "Nouveau", + "HeaderFavoritePlaylists": "Listes de lecture favorites" } diff --git a/src/strings/gsw.json b/src/strings/gsw.json index a154e4fc8..2c5210969 100644 --- a/src/strings/gsw.json +++ b/src/strings/gsw.json @@ -7,7 +7,7 @@ "ButtonQuickStartGuide": "Schnellstart Instruktione", "ButtonResetPassword": "Passwort zrug setze", "ButtonSave": "Speichere", - "ButtonSignOut": "Sign out", + "ButtonSignOut": "Uslogge", "ButtonSort": "Sortiere", "ChannelAccessHelp": "Wähl en Kanal us, um de mit dem User z'teile. Administratore werded immer d'Möglichkeit ha alli Kanäl mitm Metadate Manager z'bearbeite.", "Continuing": "Fortlaufend", @@ -29,7 +29,7 @@ "HeaderLatestSongs": "Letschti Songs", "HeaderLatestTrailers": "Letschti Trailer", "HeaderManagement": "Verwaltig", - "HeaderNextUp": "Als nächts", + "HeaderNextUp": "Als Nächstes", "HeaderNowPlaying": "Jetz am spelle", "HeaderParentalRating": "Parental Rating", "HeaderPaths": "Pfad", @@ -131,22 +131,22 @@ "Wednesday": "Mittwoch", "WelcomeToProject": "Willkomme bi Jellyfin!", "WizardCompleted": "Das esch alles wo mer momentan müend wüsse. Jellyfin het i de zwüscheziit agfange informatione über diini medie-bibliothek z'sammle. Lueg der es paar vo eusne Apps a und denn klick uf Beende um zum Server Dashboard z'cho.", - "Albums": "Albom", - "Artists": "Könstler", - "Books": "Büecher", - "Channels": "Kanäu", - "Collections": "Sammlige", - "Favorites": "Favorite", + "Albums": "Alben", + "Artists": "Künstler", + "Books": "Bücher", + "Channels": "Kanäle", + "Collections": "Sammlungen", + "Favorites": "Favoriten", "Folders": "Ordner", "Genres": "Genres", - "HeaderAlbumArtists": "Albom-Könstler", - "HeaderContinueWatching": "Wiiterluege", - "HeaderFavoriteAlbums": "Lieblingsalbe", - "HeaderFavoriteArtists": "Lieblings-Interprete", - "HeaderFavoriteEpisodes": "Lieblingsepisode", - "HeaderFavoriteShows": "Lieblingsserie", + "HeaderAlbumArtists": "Album-Künstler", + "HeaderContinueWatching": "weiter schauen", + "HeaderFavoriteAlbums": "Lieblingsalben", + "HeaderFavoriteArtists": "Lieblings-Künstler", + "HeaderFavoriteEpisodes": "Lieblingsepisoden", + "HeaderFavoriteShows": "Lieblingsserien", "HeaderFavoriteSongs": "Lieblingslieder", - "HeaderLiveTV": "Live-Färnseh", + "HeaderLiveTV": "Live-Fernseh", "HeaderRecordingGroups": "Ufnahmegruppe", "LabelIpAddressValue": "IP-Adrässe: {0}", "LabelRunningTimeValue": "Loufziit: {0}", diff --git a/src/strings/he.json b/src/strings/he.json index 0eafd988f..a3e4bc932 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -1,14 +1,14 @@ { "Actor": "שחקן", "Add": "הוסף", - "AddToCollection": "להוסיף לאוסף", - "AddToPlayQueue": "הוסף לתור הפעלה", + "AddToCollection": "הוסף לאוסף", + "AddToPlayQueue": "הוסף לרשימת ניגון", "AddToPlaylist": "הוסף לרשימת ניגון", - "AdditionalNotificationServices": "עיין בקטלוג התוספים להתקנת שרותי התראות נוספים", + "AdditionalNotificationServices": "עיין ברשימת התוספים להתקנת שירותי התראות נוספים.", "All": "הכל", "AllChannels": "כל הערוצים", "AllEpisodes": "כל הפרקים", - "AllLibraries": "כל הספרייה", + "AllLibraries": "כל הספריות", "Anytime": "בכל עת", "AroundTime": "בסביבות {0}", "AsManyAsPossible": "כמה שיותר", @@ -52,7 +52,7 @@ "ConfirmDeleteItems": "מחיקת פריטים אלה תמחק אותם הן ממערכת הקבצים והן מספריית המדיה שלך. האם אתה בטוח שברצונך להמשיך?", "ConfirmDeletion": "אשר מחיקה", "Continuing": "ממשיך", - "CustomDlnaProfilesHelp": "צור פרופיל מותאם אישית למכשיר חדש או לעקוף פרופיל מערכת", + "CustomDlnaProfilesHelp": "צור פרופיל מותאם אישית למכשיר חדש או לעקיפת פרופיל מערכת.", "DefaultErrorMessage": "אירעה שגיאה בעיבוד הבקשה. בבקשה נסה שוב מאוחר יותר.", "Delete": "מחק", "DeleteImage": "מחק תמונה", @@ -130,7 +130,7 @@ "HeaderSeries": "סדרה", "HeaderSeriesOptions": "אפשרויות סדרה", "HeaderServerSettings": "הגדרות שרת", - "HeaderSetupLibrary": "הגדר את ספריית המדיה שלך.", + "HeaderSetupLibrary": "הגדר את ספריית המדיה שלך", "HeaderSpecialEpisodeInfo": "פרטי אפיזודות מיוחדות", "HeaderSpecialFeatures": "מאפיינים מיוחדים", "HeaderStatus": "מצב", @@ -164,7 +164,7 @@ "LabelChannels": "ערוצים:", "LabelCollection": "אוספים:", "LabelCommunityRating": "דירוג הקהילה:", - "LabelContentType": "סוג התוכן", + "LabelContentType": "סוג התוכן:", "LabelCountry": "מדינה:", "LabelCriticRating": "דירוג ביקורת:", "LabelCurrentPassword": "סיסמא נוכחית:", @@ -221,7 +221,7 @@ "LabelNext": "הבא", "LabelNotificationEnabled": "אפשר התראה זו", "LabelNumber": "מספר:", - "LabelNumberOfGuideDays": "מספר ימי לוח שידורים להורדה", + "LabelNumberOfGuideDays": "מספר ימים להורדה מלוח השידורים:", "LabelNumberOfGuideDaysHelp": "הורדת יותר ימי לוח שידורים מאפשרת יכולת לתכנן ולראות יותר תוכניות קדימה, אבל גם זמן ההורדה יעלה. מצב אוטומטי ייקבע לפני מספר הערוצים.", "LabelOriginalAspectRatio": "יחס גובה-רוחב מקורי:", "LabelOriginalTitle": "כותרת מקורית:", @@ -234,14 +234,14 @@ "LabelPersonRoleHelp": "דוגמה: נהג משאית גלידה", "LabelPlaceOfBirth": "מקום לידה:", "LabelPlaylist": "רשימת ניגון:", - "LabelPreferredDisplayLanguage": "שפת ממשק מועדפת", - "LabelPreferredDisplayLanguageHelp": "תרגום הממשק של Jellyfin הוא תהליך ממושך", + "LabelPreferredDisplayLanguage": "שפת תצוגה מועדפת:", + "LabelPreferredDisplayLanguageHelp": "תרגום Jellyfin הוא תהליך מתמשך.", "LabelPrevious": "הקודם", - "LabelProfileAudioCodecs": "מקודדי צליל", - "LabelProfileCodecs": "מקודדים", + "LabelProfileAudioCodecs": "מקודדי שמע:", + "LabelProfileCodecs": "מקודדים:", "LabelProfileVideoCodecs": "‮מקודדי וידאו:", "LabelPublicHttpPort": "מספר פורט HTTP פומבי", - "LabelReadHowYouCanContribute": "למד איך תוכל לתרום", + "LabelReadHowYouCanContribute": "למד איך אתה יכול לתרום.", "LabelRecord": "הקלטה:", "LabelRefreshMode": "מצב רענון:", "LabelReleaseDate": "תאריך הוצאה:", @@ -254,17 +254,17 @@ "LabelSortTitle": "מיין כותרת:", "LabelStartWhenPossible": "התחל ברגע שניתן:", "LabelStatus": "סטטוס:", - "LabelStopWhenPossible": "הפסק ברגע שאפשר", + "LabelStopWhenPossible": "הפסק כשיתאפשר:", "LabelTagline": "שורת תיוג:", "LabelTime": "זמן:", - "LabelTimeLimitHours": "הגבלת זמן (בשעות)", + "LabelTimeLimitHours": "מגבלת זמן (שעות):", "LabelTitle": "כותרת:", "LabelTrackNumber": "קטע מספר:", "LabelTriggerType": "סוגר טריגר:", "LabelType": "סוג:", "LabelUseNotificationServices": "השתמש בשירותים הבאים:", "LabelUser": "משתמש:", - "LabelUserLibrary": "ספריית משתמש", + "LabelUserLibrary": "ספריית משתמש:", "LabelYear": "שנה:", "LabelYourFirstName": "שמך הפרטי:", "LabelYoureDone": "סיימת!", @@ -282,7 +282,7 @@ "MessageItemsAdded": "פריטים נוספו.", "MessageLeaveEmptyToInherit": "השאר ריק כדי לרשת את ההגדרות מפריט אב או את ערך ברירת המחדל הגלובלי.", "MessageNothingHere": "אין כאן כלום.", - "MessagePleaseEnsureInternetMetadata": "בבקשה וודא כי הורדת מידע מהאינטרנט מאופשרת", + "MessagePleaseEnsureInternetMetadata": "אנא וודא כי הורדת מטא-דאטה מהאינטרנט מופעלת.", "MinutesAfter": "דקות אחרי", "MinutesBefore": "דקות לפני", "Monday": "שני", @@ -397,7 +397,7 @@ "RecentlyWatched": "נצפה לאחרונה", "Record": "הקלט", "RecordSeries": "הקלט סדרה", - "RecordingCancelled": "בטל הקלטה", + "RecordingCancelled": "הקלטה בוטלה.", "RecordingScheduled": "ההקלטה מתוזמנת.", "Refresh": "רענון", "RefreshDialogHelp": "המטא נתונים מתרעננים על סמך הגדרות ושירותי אינטרנט שמופעלים בלוח המחוונים של מרכז אמבי.", @@ -419,7 +419,7 @@ "SearchForMissingMetadata": "חפש מטא נתונים חסרים", "SearchForSubtitles": "חיפוש של כתוביות", "SearchResults": "תוצאות חיפוש", - "SeriesCancelled": "בטל סדרות", + "SeriesCancelled": "סדרה בוטלה.", "SeriesRecordingScheduled": "הקלטת סדרה מתוזמנת.", "SeriesSettings": "הגדרות סדרה", "SeriesYearToPresent": "{0} - היום", @@ -510,8 +510,8 @@ "Artists": "אומנים", "Books": "ספרים", "Absolute": "מוחלט", - "AccessRestrictedTryAgainLater": "הגישה כרגע מוגבלת. אנא נסה שוב מאוחר יותר.", - "AddedOnValue": "נוסף {0}", + "AccessRestrictedTryAgainLater": "הגישה מוגבלת כרגע, נסה שוב במועד מאוחר יותר.", + "AddedOnValue": "נוספו {0}", "Blacklist": "רשימה שחורה", "Banner": "באנר", "Auto": "אוטומטי", @@ -531,7 +531,7 @@ "AlwaysPlaySubtitles": "הפעל תמיד", "AllowRemoteAccessHelp": "אם לא מסומן, כל החיבורים המרוחקים ייחסמו.", "AllowRemoteAccess": "אפשר חיבור מרוחק לשרת Jellyfin זה.", - "AllowMediaConversionHelp": "אפשר או חסום גישה להמרת מדיה.", + "AllowMediaConversionHelp": "הענק או דחה גישה להמרת מדיה.", "Aired": "שודר", "AirDate": "תאריך שידור", "Yesterday": "אתמול", @@ -549,7 +549,7 @@ "AllowOnTheFlySubtitleExtraction": "אפשר חילוץ כתוביות בזמן אמת", "AllowHWTranscodingHelp": "אפשר למלקט לקודד הזרמות בזמן אמת. זה עשוי לעזור בהפחתת הקידוד שנעשה ע\"י השרת.", "AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB/IDX)", - "AddItemToCollectionHelp": "הוסף חפצים לאוסף על ידי חיפוש שלהם ולחיצה על כפתור ימני בעכבר או כפתור התפריט כדי להוסיף לאוסף.", + "AddItemToCollectionHelp": "הוסף חפצים לאוסף על ידי חיפושם ושימוש בתפריט הלחצן הימני או לחצן התפריט כדי להוסיפם לאוסף.", "Songs": "שירים", "Shows": "סדרות", "DownloadsValue": "{0} הורדות", @@ -761,5 +761,16 @@ "Artist": "אמן", "AllowedRemoteAddressesHelp": "רשימת IP \\ מיסוך רשת המופרדת בפסיקים עבור רשתות שיורשו להתחבר מרחוק. במידה ותישאר ריקה, כל הכתובות יורשו להתחבר.", "Album": "אלבום", - "AlbumArtist": "אמן האלבום" + "AlbumArtist": "אמן האלבום", + "LabelSortOrder": "מיין סדר:", + "ShowYear": "הצג שנה", + "ShowTitle": "הצג כותרת", + "DropShadow": "צייר צל", + "Playlists": "רשימות הפעלה", + "Raised": "מורם", + "LabelSpecialSeasonsDisplayName": "שם תצוגת \"עונה מיוחדת\":", + "LabelSource": "מקור:", + "LabelSoundEffects": "אפקטי סאונד:", + "ButtonTogglePlaylist": "רשימת ניגון", + "ButtonToggleContextMenu": "עוד" } diff --git a/src/strings/hr.json b/src/strings/hr.json index 9710c1345..107014626 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -1009,5 +1009,6 @@ "AllComplexFormats": "Svi kompleksni formati (ASS, SSA, VOBSUB, PGS, SUB/IDX, itd.)", "Books": "Knjige", "Channels": "Kanali", - "Collections": "Kolekcije" + "Collections": "Kolekcije", + "Artists": "Izvođači" } diff --git a/src/strings/hu.json b/src/strings/hu.json index 8dd5d4d85..61d4dfbf0 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -101,8 +101,8 @@ "EnableBackdrops": "Háttérképek", "EnableBackdropsHelp": "A háttérképek a könyvtár böngészése közben néhány oldal hátterében jelennek meg.", "EnableHardwareEncoding": "Hardveres kódolás engedélyezése", - "EnableThemeSongs": "Főcím dalok", - "EnableThemeSongsHelp": "Főcím dalok lejátszása háttérben a könyvtár böngészése közben.", + "EnableThemeSongs": "Főcímdalok", + "EnableThemeSongsHelp": "Főcímdalok lejátszása háttérben a könyvtár böngészése közben.", "EndsAtValue": "Várható befejezés {0}", "Episodes": "Epizódok", "ExitFullscreen": "Kilépés a teljes képernyőből", @@ -167,7 +167,7 @@ "HeaderLibrarySettings": "Médiatár beállítások", "HeaderLiveTvTunerSetup": "Élő TV tuner beállítása", "HeaderMedia": "Média", - "HeaderMediaFolders": "Média Könyvtárak", + "HeaderMediaFolders": "Médiakönyvtárak", "HeaderMediaInfo": "Média Infó", "HeaderMetadataSettings": "Metaadat Beállítások", "HeaderMoreLikeThis": "Több ehhez hasonló", @@ -244,7 +244,7 @@ "LabelCustomDeviceDisplayName": "Megjelenítendő név:", "LabelCustomDeviceDisplayNameHelp": "Adj meg egy egyedi nevet, vagy hagyd üresen a készülék által elküldött név használatához.", "LabelCustomRating": "Egyéni értékelés:", - "LabelDashboardTheme": "Szerver vezérlőpult kinézet:", + "LabelDashboardTheme": "Szerver vezérlőpult kinézete:", "LabelDateAdded": "Hozzáadva:", "LabelDateTimeLocale": "Dátum és idő formátum:", "LabelDay": "Nap:", @@ -424,7 +424,7 @@ "OptionMissingEpisode": "Hiányzó Epizódok", "OptionMonday": "Hétfő", "OptionNameSort": "Név", - "OptionNew": "Új...", + "OptionNew": "Új…", "OptionParentalRating": "Korhatár besorolás", "OptionPlayCount": "Lejátszások száma", "OptionPlayed": "Megnézett", @@ -584,7 +584,7 @@ "Aired": "Adásban", "Albums": "Albumok", "AllChannels": "Minden csatorna", - "AllComplexFormats": "Minden összetett formátum (ASS, SSA, VOBSUB, PGS, SUB, IDX)", + "AllComplexFormats": "Minden összetett formátum (ASS, SSA, VOBSUB, PGS, SUB, IDX, ...)", "AllowMediaConversion": "Média konvertálás engedélyezése", "AllowMediaConversionHelp": "Add meg vagy tiltsd le a média konvertálás funkcióhoz való hozzáférést.", "AllowRemoteAccess": "Engedélyezze a távoli kapcsolatokat a Jellyfin szerverhez.", @@ -630,7 +630,7 @@ "ChannelAccessHelp": "Válaszd ki a megosztani kívánt csatornákat a felhasználóval. A rendszergazdák a metaadatkezelő segítségével szerkeszthetik az összes csatornát.", "ChannelNameOnly": "Csak {0} csatorna", "ChannelNumber": "Csatorna száma", - "CinemaModeConfigurationHelp": "A Cinema Mode igazi mozi élményt nyújt előzetessel és egyedi intróval a film vetítése előtt.", + "CinemaModeConfigurationHelp": "A Mozi mód igazi mozi élményt nyújt előzetessel és egyedi intróval a film vetítése előtt.", "ColorSpace": "Színtér", "ColorTransfer": "Színátvitel", "Composer": "Zeneszerző", @@ -669,7 +669,7 @@ "DrmChannelsNotImported": "A csatornák DRM-el nem kerülnek importálásra.", "DropShadow": "Árnyék", "EasyPasswordHelp": "Az egyszerű PIN kódot az offline hozzáféréshez használják a támogatott kliens alkalmazásokban, valamint hálózaton belüli bejelentkezéshez is használható.", - "EnableCinemaMode": "Cinema Mode", + "EnableCinemaMode": "Mozi mód", "EnableColorCodedBackgrounds": "Színkódolt háttérképek", "EnableDisplayMirroring": "Kijelző tükrözés", "EnableExternalVideoPlayers": "Külső videolejátszók", @@ -789,7 +789,7 @@ "Shows": "Sorozatok", "Songs": "Dalok", "ValueSpecialEpisodeName": "Special - {0}", - "EnableThemeVideos": "Videók témák", + "EnableThemeVideos": "Videótémák", "EnableThemeVideosHelp": "Videó témájának lejátszása háttérben a könyvtár böngészése közben.", "HeaderBlockItemsWithNoRating": "Blokkolja azokat az elemeket amelyek tiltott, vagy nem felismerhető minősítésűek:", "HeaderSchedule": "Ütemezés", @@ -1508,5 +1508,9 @@ "ReleaseGroup": "Kiadócsoport", "MessageUnauthorizedUser": "Jelenleg nincs jogosultságod a szerverhez való hozzáféréshez. Kérjük, lépj kapcsolatba az adminisztrátorral további információkért!", "ButtonTogglePlaylist": "Lejátszási listák", - "ButtonToggleContextMenu": "Továbbiak" + "ButtonToggleContextMenu": "Továbbiak", + "Filter": "Szűrés", + "New": "Új", + "HeaderFavoritePlaylists": "Kedvenc lejátszási listák", + "ApiKeysCaption": "A jelenleg engedélyezett API kulcsok listája" } diff --git a/src/strings/it.json b/src/strings/it.json index 0f9cee571..3d09244c3 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -14,13 +14,13 @@ "Albums": "Album", "All": "Tutto", "AllChannels": "Tutti i canali", - "AllComplexFormats": "Tutti i formati complessi (ASS, SSA, VOBSUB, PGS, SUB, IDX)", + "AllComplexFormats": "Tutti i formati complessi (ASS, SSA, VOBSUB, PGS, SUB, IDX, ...)", "AllEpisodes": "Tutti gli episodi", "AllLanguages": "Tutte le lingue", "AllLibraries": "Tutte le librerie", "AllowHWTranscodingHelp": "Abilita il sintonizzatore per codificare i flussi al volo. Ciò potrebbe contribuire a ridurre la transcodifica richiesta dal server.", "AllowOnTheFlySubtitleExtraction": "Consenti l'estrazione sottotitoli al volo", - "AllowOnTheFlySubtitleExtractionHelp": "I sottotitoli incorporati possono essere estratti dai video e consegnati ad applicazioni in testo semplice per evitare la transcodifica dei video. In alcuni sistemi questo può richiedere molto tempo e causare un rallentamento della riproduzione video durante il processo di estrazione. Disattivare questa opzione per avere i sottotitoli incorporati con la transcodifica video quando non sono supportati nativamente dal dispositivo client.", + "AllowOnTheFlySubtitleExtractionHelp": "I sottotitoli incorporati possono essere estratti dai video e consegnati ai client in testo semplice per evitare la transcodifica dei video. In alcuni sistemi questo può richiedere molto tempo e causare un rallentamento della riproduzione video durante il processo di estrazione. Disattivare questa opzione per avere i sottotitoli incorporati con la transcodifica video quando non sono supportati nativamente dal dispositivo client.", "AllowRemoteAccess": "Abilita connessioni remote a questo Server Jellyfin.", "AllowRemoteAccessHelp": "Se deselezionato, tutte le connessioni remote saranno bloccate.", "AllowedRemoteAddressesHelp": "Elenco separato da virgola di indirizzi IP o voci IP / maschera di rete per reti che potranno connettersi da remoto. Se lasciato vuoto, saranno consentiti tutti gli indirizzi remoti.", @@ -40,12 +40,12 @@ "BirthDateValue": "Nato il: {0}", "BirthLocation": "Luogo di nascita", "BirthPlaceValue": "nato a: {0}", - "BookLibraryHelp": "Libri e audiolibri sono supportati. Rivedere {0}la guida ai nomi dei libri di Jellyfin{1}.", + "BookLibraryHelp": "Libri e audiolibri sono supportati. Rivedi la guida {0} ai nomi dei libri {1} di Jellyfin.", "Books": "Libri", "BoxRear": "Box (retro)", "Browse": "Esplora", "BrowsePluginCatalogMessage": "Sfoglia il catalogo dei Plugins.", - "BurnSubtitlesHelp": "Determina se il server deve imprimere i sottotitoli quando i video vengono convertiti. Evitare ciò migliorerà di molto le prestazioni. Selezionare Auto per imprimere formati basati sull'immagine (VOBSUB, PGS, SUB, IDX) e alcuni sottotitoli ASS o SSA.", + "BurnSubtitlesHelp": "Determina se il server deve imprimere i sottotitoli quando i video vengono convertiti. Evitare ciò migliorerà di molto le prestazioni. Selezionare Auto per imprimere formati basati sull'immagine (VOBSUB, PGS, SUB, IDX, ...) e alcuni sottotitoli ASS o SSA.", "ButtonAdd": "Aggiungi", "ButtonAddMediaLibrary": "Aggiungi raccolta multimediale", "ButtonAddScheduledTaskTrigger": "Aggiungi operazione", @@ -995,7 +995,7 @@ "OptionMissingEpisode": "Episodi mancanti", "OptionMonday": "Lunedì", "OptionNameSort": "Nome", - "OptionNew": "Nuovo...", + "OptionNew": "Nuovo…", "OptionNone": "Nessuno", "OptionOnAppStartup": "All'avvio", "OptionOnInterval": "Su intervallo", @@ -1501,5 +1501,11 @@ "AlbumArtist": "Artisti dell'Album", "ReleaseGroup": "Release Group", "UnsupportedPlayback": "Jellyfin non è in grado di decriptare i contenuti protetti da DRM ma tutti i contenuti verranno tentati a prescindere, compresi quelli protetti. Alcuni file potrebbero apparire completamente neri a causa della crittografia o di altre funzionalità non supportate, come i titoli interattivi.", - "MessageUnauthorizedUser": "Non sei autorizzato ad accedere in questo momento al server. Contatta l'amministratore per ulteriori dettagli." + "MessageUnauthorizedUser": "Non sei autorizzato ad accedere in questo momento al server. Contatta l'amministratore per ulteriori dettagli.", + "ButtonTogglePlaylist": "Playlist", + "ButtonToggleContextMenu": "Altro", + "HeaderFavoritePlaylists": "Playlist Favorite", + "Filter": "Filtro", + "New": "Nuovo", + "ApiKeysCaption": "Elenco chiavi API abilitate" } diff --git a/src/strings/kk.json b/src/strings/kk.json index 144fb007b..a31d2b375 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -15,7 +15,7 @@ "Alerts": "Eskertýler", "All": "Bári", "AllChannels": "Barlyq arnalar", - "AllComplexFormats": "Barlyq kúrdeli pishimderi (ASS, SSA, VOBSUB, PGS, SUB/IDX jáne t.b.)", + "AllComplexFormats": "Barlyq kúrdeli pishimder (ASS, SSA, VOBSUB, PGS, SUB jáne IDX)", "AllEpisodes": "Barlyq bólimder", "AllLanguages": "Barlyq tilder", "AllLibraries": "Barlyq tasyǵyshhanalar", @@ -27,7 +27,7 @@ "AllowRemoteAccess": "Osy Jellyfin Serverine syrtqy qosylymdar úshin ruqsat etý.", "AllowRemoteAccessHelp": "Eger jalaýsha alastalǵan bolsa, baryq syrtqy baılanystar qursaýlanady.", "AllowedRemoteAddressesHelp": "Qashyqtan qosylýǵa ruqsat etiletin jeliler úshin útirlermen bólingen IP-mekenjaılarynyń tizbesi nemese IP/netmask jazbalar Eger bos qaldyrylsa, barlyq qashyqtaǵy mekenjaılarǵa ruqsat etiledi.", - "AlwaysPlaySubtitles": "Sýbtıtrlerdi árqashan oınatý", + "AlwaysPlaySubtitles": "Árqashan oınatý", "AlwaysPlaySubtitlesHelp": "Til teńshelimine sáıkes kelgen sýbtıtrler dybys tiline qatyssyz júkteledi.", "AnamorphicVideoNotSupported": "Anamorftyq beıne úshin qoldaý kórsetilmeıdi", "AndroidUnlockRestoreHelp": "Aldyńǵy satyp alýdy qalpyna keltirý úshin, bastapqyda satyp alý jasalǵan naq sol Google (nemese Amazon) tirkelgisimen qurylǵyǵa kirińiz. Qoldanba dúkeni qosylǵan jáne kezkelgen ata-ana shekteýsiz, jáne belsendi ınternet baılanysy bar ekenine kóz jetkizińiz. Aldyńǵy satyp alý qalpyna keltirý úshin muny tek qana bir ret isteý kerek.", @@ -56,7 +56,7 @@ "BoxRear": "Qorap arty", "Browse": "Sharlaý", "BrowsePluginCatalogMessage": "Qoljetimdi plagındermen tanysý úshin plagın tizimdemesin sholyńyz.", - "BurnSubtitlesHelp": "Sýbtıtrler pishimine baılanysty beıneni túrlendirgen kezde server sýbtıtrlerdi jazyýyn anyqtaıdy. Sýbtıtrler jazýdy qashqaqtaý serverdiń ónimdiligin jaqsartady. Sýretke negizdelgen pishimderdi (VOBSUB, PGS, SUB/IDX j.t.b.) jáne keıbir ASS/SSA sýbtıtrlerin jazý úshin Avtomattyny tańdańyz.", + "BurnSubtitlesHelp": "Beıneni qaıta kodtaǵan kezde server sýbtıtrlerdi jazyýyn anyqtaıdy. Onan qashqaqtaý serverdiń ónimdiligin biraz jaqsartady. Sýretke negizdelgen pishimderdi (VOBSUB, PGS, SUB jáne IDX) jáne keıbir ASS nemese SSA sýbtıtrlerin jazý úshin Avtomattyny tańdańyz.", "ButtonAdd": "Ústeý", "ButtonAddMediaLibrary": "Tasyǵyshhana ústeý", "ButtonAddScheduledTaskTrigger": "Trıger ústeý", @@ -198,7 +198,7 @@ "DisplayInOtherHomeScreenSections": "Basqy ekran bólimderinde beıneleý (mys. Eń sońǵy tasyǵyshderekter jáne Kórýdi jalǵastyrý)", "DisplayMissingEpisodesWithinSeasons": "Joq bólimderdi maýsym ishinde beıneleý", "DisplayMissingEpisodesWithinSeasonsHelp": "Bul sondaı-aq server konfıgýrasýasyndaǵy TD tasyǵyshhanalary úshin qosýlýy qajet.", - "DisplayModeHelp": "Jellyfin iske qosylǵanda ekran túrin tańdańyz.", + "DisplayModeHelp": "Interfeıs úshin laıyqty ornalasý mánerin tańdańyz.", "DoNotRecord": "Jazýǵa bolmaıdy", "Down": "Tómenge", "Download": "Júktep alý", @@ -503,7 +503,7 @@ "Images": "Sýretter", "ImportFavoriteChannelsHelp": "Qosylǵanda, túner qurylǵysyndaǵy tańdaýly retinde belgilengen ǵana arnalar shetten ákelinetin bolady.", "ImportMissingEpisodesHelp": "Qosylǵanda, joq epızodtar týraly aqparat sizdiń Jellyfin derekqorǵa ákelinedi jáne maýsymdar men telehıkaıalar aıasynda paıda bolady. Tasyǵyshhana skanerleýde bul aıtarlyqtaı uzaq ýaqyt alýy múmkin.", - "InstallingPackage": "{0} ornatylýda", + "InstallingPackage": "{0} ({1} nusqasy) ornatylýda", "InstantMix": "Lezdik qospalaý", "ItemCount": "{0} tarmaq", "Items": "Tarmaqtar", @@ -986,16 +986,16 @@ "NoNextUpItemsMessage": "Eshteńe tabylmady. Kórsetimderińizdi qaraı bastańyz!", "NoPluginConfigurationMessage": "Osy plagınde teńsheletin parametrler joq.", "NoSubtitleSearchResultsFound": "Eshqandaı nátıjeler tabylmady.", - "NoSubtitles": "Sýbtıtrlersiz", + "NoSubtitles": "Eshqandaı", "NoSubtitlesHelp": "Ádepkide sýbtıtrler júktelmeıdi. Olardy oınatý kezinde áli de qolmen qosýǵa bolady.", "None": "Eshqandaı", "Normal": "Kádimgi", "NumLocationsValue": "{0} qalta", "Off": "Óshir", "OneChannel": "Bir arnadan", - "OnlyForcedSubtitles": "Tek qana májbúrli sýbtıtrler", + "OnlyForcedSubtitles": "Tek qana májbúrli", "OnlyForcedSubtitlesHelp": "Tek qana májbúrli dep belgilengen sýbtıtrler júkteledi.", - "OnlyImageFormats": "Tek keskin pishimder (VOBSUB, PGS, SUB j.t.b.)", + "OnlyImageFormats": "Tek keskin pishimder (VOBSUB, PGS jáne SUB)", "Open": "Ashý", "OptionActor": "Aktór", "OptionActors": "Aktórler", @@ -1138,9 +1138,9 @@ "OptionWeekly": "Apta saıyn", "OriginalAirDateValue": "Bastapqy efır: {0}", "Overview": "Jalpy sholý", - "PackageInstallCancelled": "{0} ornatylýy boldyrylmady.", - "PackageInstallCompleted": "{0} ornatylýy aıaqtaldy.", - "PackageInstallFailed": "{0} ornatylýy sátsiz.", + "PackageInstallCancelled": "{0} ({1} nusqasy) ornatylýy boldyrylmady.", + "PackageInstallCompleted": "{0} ({1} nusqasy) ornatylýy aıaqtaldy.", + "PackageInstallFailed": "{0} ({1} nusqasy) ornatylýy sátsiz.", "ParentalRating": "Jastas sanaty", "PasswordMatchError": "Paróli men Paróldi rastaý óristeri sáıkes bolý kerek.", "PasswordResetComplete": "Paról ysyryldy.", @@ -1501,7 +1501,35 @@ "ButtonSplit": "Bólý", "AskAdminToCreateLibrary": "Tasýǵyshanany jasaý úshin ákimshiden suraý.", "AllowFfmpegThrottling": "Qaıta kodtaýdy retteý", - "PlaybackErrorNoCompatibleStream": "Klıent profaılyn jasaýda másele oryn aldy jáne server úılesimdi pishiminde tasyǵysh derekterin jibermedi.", + "PlaybackErrorNoCompatibleStream": "Bul klıent tasyǵysh derektermen úılesimsiz jáne server úılesimdi pishiminde tasyǵysh derekterin jibermedi.", "AllowFfmpegThrottlingHelp": "Qaıta kodtaý nemese qaıta býmalaý aǵymdyq oınatý jaıǵasymynan edáýir alǵa ozǵanda, qor kózderin azdaý tutynatyndaı etip údiristi kidirtedi. Bul jıi izdemeı qaraý kezinde paıdaly. Eger oınatý máseleleri bolsa, ony óshirińiz.", - "Album": "" + "Album": "Álbom", + "DeinterlaceMethodHelp": "Jol aralyq jaımaly mazmundy qaıta kodtaý kezinde paıdalaný úshin jol aralyq jaımany joıý ádisin tańdańyz.", + "LabelDeinterlaceMethod": "Jol aralyq jaımany joıý ádisi:", + "YadifBob": "YADIF eki eseleýimen", + "OnApplicationStartup": "Qoldanba iske qosylǵanda", + "EveryXHours": "Ár {0} saǵ", + "EveryHour": "Ár saǵat", + "EveryXMinutes": "Ár {0} mın", + "OnWakeFromSleep": "Uıqylyqtan oıanǵanda", + "WeeklyAt": "{0} {1} kezinde", + "DailyAt": "Kúnde {0} kezinde", + "LastSeen": "Sońǵy kóringeni {0}", + "PersonRole": "- {0}", + "ListPaging": "{0}-{1} {2} ishinen", + "Yadif": "YADIF", + "Track": "Jolshyq", + "Season": "Maýsym", + "ReleaseGroup": "Shyǵarýshy top", + "Person": "Tulǵa", + "OtherArtist": "Basqa oryndaýshy", + "Movie": "Fılm", + "LabelLibraryPageSize": "Tasyǵyshhana betiniń ólshemi:", + "Episode": "Bólim", + "ClientSettings": "Týtynýshy parametrleri", + "ButtonTogglePlaylist": "Oýnatý tizimi", + "ButtonToggleContextMenu": "Kúbirek", + "BoxSet": "Jıyntyq", + "Artist": "Ornatýshy", + "AlbumArtist": "Álbom ornatýshysy" } diff --git a/src/strings/ko.json b/src/strings/ko.json index 9e0bd4260..33c44334a 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -1325,7 +1325,7 @@ "MediaInfoPixelFormat": "픽셀 형식", "MapChannels": "채널 매핑", "LaunchWebAppOnStartupHelp": "서버가 처음 시작되면 웹 브라우저에서 웹 클라이언트를 실행하십시오. 서버 재시작의 경우에는 적용되지 않습니다.", - "Large": "큰", + "Large": "크게", "LanNetworksHelp": "대역폭을 강제로 제한할 때 로컬 네트워크로 간주되는 쉼표로 구분된 IP 주소 및 IP/서브넷 마스크 목록입니다. 지정될 경우 모든 다른 IP 주소는 외부 네트워크로 간주되며 외부 대역폭 제한이 적용됩니다. 공백일 경우 서버의 서브넷만이 로컬 네트워크로 간주됩니다.", "LabelffmpegPathHelp": "ffmpeg 실행 파일 혹은 ffmpeg를 포함하는 폴더 경로입니다.", "LabelXDlnaDocHelp": "urn:schemas-dlna-org:device-1-0 네임스페이스에 포함된 X_DLNADOC 요소의 내용을 결정합니다.", @@ -1427,5 +1427,11 @@ "NoSubtitlesHelp": "자막을 자동으로 불러오지 않습니다. 재생 중에 수동으로 켤 수 있습니다.", "MusicLibraryHelp": "{0}음악 이름 지정 규칙{1}을 확인하십시오.", "MovieLibraryHelp": "{0}영화 이름 지정 규칙{1}을 확인하십시오.", - "MessageUnauthorizedUser": "현재 서버에 접속할 권한이 없습니다. 자세한 정보는 서버 관리자에게 문의하십시오." + "MessageUnauthorizedUser": "현재 서버에 접속할 권한이 없습니다. 자세한 정보는 서버 관리자에게 문의하십시오.", + "HeaderFavoritePlaylists": "즐겨찾는 플레이리스트", + "ButtonTogglePlaylist": "플레이리스트", + "ButtonToggleContextMenu": "더보기", + "Rate": "평", + "PerfectMatch": "정확히 일치", + "OtherArtist": "다른 아티스트" } diff --git a/src/strings/lv.json b/src/strings/lv.json index 8c19b23ad..8aa0fd525 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -239,7 +239,7 @@ "Kids": "Bērni", "Items": "Vienumi", "ItemCount": "{0} vienumi", - "InstallingPackage": "Instalē {0}", + "InstallingPackage": "Instalē {0} (versija {1})", "Images": "Attēli", "Identify": "Identificēt", "Horizontal": "Horizontāls", @@ -455,7 +455,7 @@ "DrmChannelsNotImported": "Kanāli ar DRM netiks importēti.", "DownloadsValue": "{0} lejupielādes", "Download": "Lejupielādēt", - "DisplayModeHelp": "Izvēlies ekrāna veidu, uz kura tu izmanto Jellyfin.", + "DisplayModeHelp": "Izvēlies izkārtojuma veidu, kuru tu gribi priekš šī interfeisa.", "DoNotRecord": "Neierakstīt", "DisplayInOtherHomeScreenSections": "Rādīt mājas ekrāna sadaļās kā jaunākā multvide un turpini skatīties", "DisplayInMyMedia": "Rādīt mājas ekrānā", @@ -605,8 +605,8 @@ "Art": "Māksla", "AroundTime": "Ap {0}", "Anytime": "Jebkad", - "AnyLanguage": "Jebkura valoda", - "AlwaysPlaySubtitles": "Vienmēr rādīt subtitrus", + "AnyLanguage": "Jebkura Valoda", + "AlwaysPlaySubtitles": "Vienmēr Rādīt", "AllowedRemoteAddressesHelp": "Ar komatiem atdalīts IP adrešu vai IP/tīkla masku saraksts, kas norāda uz tīkliem, kas var pieslēgties attālināti. Ja atstāts tukšs, visas attālinātās adreses tiks atļautas.", "AllowRemoteAccessHelp": "Ja atķeksēts, visi attālinātie savienojumi tiks bloķēti.", "AllowRemoteAccess": "Atļaut attālinātus savienojumus šim Jellyfin Serverim.", @@ -615,7 +615,7 @@ "AllLibraries": "Visas bibliotēkas", "AllLanguages": "Visas valodas", "AllEpisodes": "Visas epizodes", - "AllComplexFormats": "Visi sarezģītie formāti (ASS, SSA, VOBSUB, PGS, SUB/IDX, utt.)", + "AllComplexFormats": "Visi Sarežģītie formāti (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)", "AllChannels": "Visi kanāli", "All": "Viss", "Alerts": "Paziņojumi", @@ -951,8 +951,8 @@ "HeaderCustomDlnaProfiles": "Pielāgoti Profili", "HeaderConfirmProfileDeletion": "Apstiprināt Profila Dzēšanu", "HeaderChapterImages": "Nodaļu Attēli", - "HeaderCastCrew": "Lomas/Apkalpe", - "HeaderCastAndCrew": "Lomas/Apkalpe", + "HeaderCastCrew": "Lomas & Apkalpe", + "HeaderCastAndCrew": "Lomas un Apkalpe", "HeaderAppearsOn": "Redzams", "FFmpegSavePathNotFound": "Mēs nespējām atrast FFmpeg norādītajā ceļā. FFprobe arī ir vajadzīgs, un tam ir jāatrodas tajā pašā mapē. Šīs komponentes parasti tiek apvienotas vienā un tajā pašā lejupielādē. Lūdzu pārbaudiet ceļu un mēģiniet vēlreiz.", "HeaderAdditionalParts": "Papildus Ceļi", @@ -1001,7 +1001,7 @@ "ButtonArrowLeft": "Kreisi", "ButtonArrowDown": "Lejup", "ButtonAddScheduledTaskTrigger": "Pievienot Trigeru", - "BookLibraryHelp": "Audio un teksta grāmatas tiek atbalstītas. Pārskati {0}grāmatu nosaukumu instrukciju{1}.", + "BookLibraryHelp": "Audio un teksta grāmatas tiek atbalstītas. Pārskati {0} grāmatu nosaukumu instrukciju {1}.", "Blacklist": "Melnais saraksts", "AuthProviderHelp": "Izvēlies Autentifikācijas Nodrošinājumu, kas tiks izmantots lai autentificētu šī lietotāja paroli.", "AspectRatio": "Attēla Proporcijas", @@ -1081,5 +1081,58 @@ "OptionAllowBrowsingLiveTv": "Atļaut Tiešraides TV piekļuvi", "MediaInfoForced": "Piespiests", "LabelPublicHttpPortHelp": "Publiskai porta numurs, kas tiks kartēts uz vietējo HTTP portu.", - "LabelOptionalNetworkPath": "(Neobligāts) Koplietota tīkla mape:" + "LabelOptionalNetworkPath": "(Neobligāts) Koplietota tīkla mape:", + "LabelLibraryPageSizeHelp": "Uzstāda vienumu daudzumu, ko rādīt bibliotēkas lapā. Uzstādi uz 0 lai atspējotu lapošanu.", + "LabelLibraryPageSize": "Bibliotēkas lapu lielums:", + "LabelKodiMetadataUserHelp": "Saglabāt skatīšanās datus uz NFO datnēm, lai tos varētu izmantot citas lietotnes.", + "LabelKodiMetadataDateFormatHelp": "Visi datumi iekš NFO datnēm tiks parsēti ar šo formātu.", + "LabelInNetworkSignInWithEasyPasswordHelp": "Izmanto vieglo pin kodu lai piekļūtu klientiem savā vietējā tīklā. Tava parastā parole būs vajadzīga ārpus mājām. Ja pin kods ir atstāts tukšs, tev nevajadzēs paroli savā vietējā mājas tīklā.", + "LabelInNetworkSignInWithEasyPassword": "Iespējot iekštīkla piekļuvi ar manu vieglo pin kodu", + "LabelImportOnlyFavoriteChannels": "Ierobežot uz kanāliem, kas atzīmēti kā favorīti", + "LabelGroupMoviesIntoCollectionsHelp": "Kad tiks rādīti filmu saraksti, filmas kas pieder pie kolekcijas tiks attēlotas kā viens grupēts vienums.", + "LabelServerNameHelp": "Šis vārds tiks izmantots lai identificētu tavu serveri un noklusējumā ir servera datora vārds.", + "LabelExtractChaptersDuringLibraryScan": "Izvilkt sadaļu attēlus bibliotēkas skenēšanas laikā", + "LabelBaseUrlHelp": "Šeit tu vari pievienot pielāgotas apakš-mapes lai piekļūtu serverim no unikālāka URL.", + "LabelBaseUrl": "Pamata URL:", + "LabelEnableSingleImageInDidlLimitHelp": "Dažas ierīces pareizi neatskaņos ja vairāki attēli ir iegulti iekš Didl.", + "LabelEnableSingleImageInDidlLimit": "Ierobežot uz vienu iegulto attēlu", + "LabelEnableDlnaClientDiscoveryIntervalHelp": "Nosaka laiku sekundēs starp Jellyfin veiktajiem SSDP meklējumiem.", + "LabelEmbedAlbumArtDidlHelp": "Dažas ierīces labprātāk izmanto šo metodi lai saņemtu albumu vākus. Citas var neatskaņot ar šo opciju ieslēgtu.", + "LabelDroppedFrames": "Nomestie kadri:", + "LabelDownMixAudioScaleHelp": "Pastiprināt audio lejupmiksēšanas laikā. Vērtība viens paturēs oriģinālo skaļumu.", + "LabelDownMixAudioScale": "Audio pastiprinājums lejupmiksējot:", + "LabelDisplayMissingEpisodesWithinSeasons": "Rādīt trūkstošās epizodes sezonās", + "LabelDateAddedBehaviorHelp": "Ja atrodas metadatu vērtība, tā vienmēr tiks izmantota pirms jebkuras no šīm opcijām.", + "LabelDashboardTheme": "Servera vadības paneļa tēma:", + "LabelCustomDeviceDisplayNameHelp": "Ievadi pielāgotu displeja vārdu vai atstāj tukšu lai izmantotu ierīces noteikto.", + "LabelCachePathHelp": "Nosaki pielāgotu atrašanās vietu priekš keša datnēm kā attēliem. Atstāj tukšu lai izmantotu servera noklusējumu.", + "LabelAllowedRemoteAddressesMode": "Attālās IP adreses filtra režīms:", + "LabelAllowedRemoteAddresses": "Attālās IP adreses filtrs:", + "LabelAlbumArtPN": "Albumu vāku PN:", + "LabelAirsBeforeSeason": "Tiešraidē pirms sezonas:", + "LabelAirsBeforeEpisode": "Tiešraidē pirms epizodes:", + "LabelAirsAfterSeason": "Tiešraidē pēc sezonas:", + "HeaderSubtitleProfilesHelp": "Subtitru profili apraksta ierīces atbalstītos subtitru formātus.", + "HeaderPendingInvitations": "Gaidošie Uzaicinājumi", + "HeaderKeepSeries": "Paturēt Sēriju", + "HeaderFavoritePlaylists": "Atskaņošanas Sarakstu Favorīti", + "ApiKeysCaption": "Saraksts ar pašlaik iespējotajām API atslēgām", + "EncoderPresetHelp": "Izvēlies ātrāku vērtību lai uzlabotu veiktspēju, vai lēnāku vērtību lai uzlabotu kvalitāti.", + "FetchingData": "Iegūst papildu datus", + "ErrorDeletingItem": "Notika kļūda dzēšot vienumu no Jellyfin Servera. Lūdzu pārliecinies vai Jellyfin Server ir rakstoša piekļuve pie satura mapes un mēģini vēlreiz.", + "ErrorAddingTunerDevice": "Kļūda pievienojot tūnera ierīci. Lūdzu pārliecinies ka tā ir pieejama un mēģini vēlreiz.", + "ErrorAddingMediaPathToVirtualFolder": "Notika kļūda pievienojot satura ceļu. Lūdzu pārliecinies ka ceļš ir derīgs un ka Jellyfin Servera procesam ir piekļuve tai vietai.", + "Episode": "Epizode", + "DeviceAccessHelp": "Tas attiecas tikai uz ierīcēm, kas var tikt unikāli identificētas un neaizliegs piekļuvi no pārlūka. Filtrējot lietotāju ierīču piekļuvi neatļaus tiem izmantot jaunas ierīces, līdz tās nav tikušas šeit atļautas.", + "DeinterlaceMethodHelp": "Izvēlies rindpārlēces sakļaušanas (deinterlacing) metodi kad tiek trans-kodēts rindpārlēces izvērsts (interlaced) saturs.", + "CustomDlnaProfilesHelp": "Izveido pielāgotu profilu priekš jaunas ierīces, vai pārraksti sistēmas profilu.", + "ColorTransfer": "Krāsu pārsūtīšana", + "ClientSettings": "Klientu Iestatījumi", + "ButtonTogglePlaylist": "Atskaņošanas Saraksts", + "ButtonToggleContextMenu": "Vairāk", + "BurnSubtitlesHelp": "Nosaka, vai serverim ir jāiededzina subtitri video trans-kodēšanas laikā. To nedarot tiks stipri palielināta veiktspēja. Izvēlies Auto lai iededzinātu uz attēliem bāzētus formātus (VOBSUB, PGS, SUB, IDX, …) un noteiktus ASS vai SSA subtitrus.", + "Artist": "Izpildītājs", + "AllowOnTheFlySubtitleExtractionHelp": "Iegultie subtitri var tikt izvilkto no video un nogādāti klientiem kā parasts teksts, lai nevajadzētu veikt lieku video trans kodēšanu. Uz dažām sistēmām tas var aizņemt ilgu laiku un likt video atskaņošanai uzkārties izvilkšanas procesa laikā. Atspējo šo lai iegultos subtitrus iededzinātu video trans kodēšanas veidā, kad tos noklusēti neatbalsta klienta ierīce.", + "AlbumArtist": "Albuma Izpildītājs", + "Album": "Albums" } diff --git a/src/strings/nb.json b/src/strings/nb.json index 1e410c9d2..0a616ae2e 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -1473,5 +1473,12 @@ "BoxSet": "Samleboks", "Artist": "Artist", "AlbumArtist": "Albumartist", - "Album": "Album" + "Album": "Album", + "LabelLibraryPageSizeHelp": "Velger hvor mange elementer som skal bli vist på en bibliotek side. Velg 0 for å deaktivere.", + "LabelLibraryPageSize": "Biblioteks side størrelse:", + "LabelDeinterlaceMethod": "Deinterlacing metode:", + "HeaderFavoritePlaylists": "Favorittspillelister", + "DeinterlaceMethodHelp": "Velg deinterlacing metoden som skal bli brukt når man transkoder interlaced innhold.", + "ButtonTogglePlaylist": "Spilleliste", + "ButtonToggleContextMenu": "Mer" } diff --git a/src/strings/nl.json b/src/strings/nl.json index 06bd4ca22..a3c3a84f1 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1513,5 +1513,8 @@ "YadifBob": "YADIF Bob", "Yadif": "YADIF", "Track": "Nummer", - "SelectAdminUsername": "Selecteer een gebruikersnaam voor het beheerder account." + "SelectAdminUsername": "Selecteer een gebruikersnaam voor het beheerder account.", + "HeaderFavoritePlaylists": "Favoriete afspeellijsten", + "ButtonTogglePlaylist": "Afspeellijst", + "ButtonToggleContextMenu": "Meer" } diff --git a/src/strings/pl.json b/src/strings/pl.json index 431ea3feb..1cea825bf 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -54,7 +54,7 @@ "BoxRear": "Pudełko (tył)", "Browse": "Przeglądaj", "BrowsePluginCatalogMessage": "Przejrzyj nasz katalog wtyczek żeby zobaczyć dostępne wtyczki.", - "BurnSubtitlesHelp": "Określa czy serwer powinien wypalać napisy podczas konwersji wideo, w zależności od formatu napisów. Unikanie wypalania napisów poprawia wydajność serwera. Wybierz Automatycznie, w celu wypalania zarówno napisów w formatach graficznych (np. VOBSUB, PGS, SUB/IDX, itp.), jak i pewnych napisów ASS/SSA.", + "BurnSubtitlesHelp": "Określa czy serwer powinien wypalać napisy podczas konwersji wideo, w zależności od formatu napisów. Unikanie wypalania napisów znacząco poprawia wydajność serwera. Wybierz Automatycznie, w celu wypalania zarówno napisów w formatach graficznych (np. VOBSUB, PGS, SUB/IDX), jak i pewnych napisów ASS lub SSA.", "ButtonAdd": "Dodaj", "ButtonAddMediaLibrary": "Dodaj media do biblioteki", "ButtonAddScheduledTaskTrigger": "Dodaj wyzwalacz", @@ -190,7 +190,7 @@ "DisplayInOtherHomeScreenSections": "Wyświetlaj na ekranie startowym sekcje Ostatnio dodane i Kontynuuj odtwarzanie", "DisplayMissingEpisodesWithinSeasons": "Wyświetlaj w sezonach brakujące odcinki", "DisplayMissingEpisodesWithinSeasonsHelp": "Ta opcja musi zostać dodatkowo aktywowana w bibliotece seriali, w konfiguracji serwera.", - "DisplayModeHelp": "Określa typ urządzenia, na którym uruchomiono Jellyfin.", + "DisplayModeHelp": "Wybierz styl układu interfejsu.", "DoNotRecord": "Nie nagrywaj", "Down": "W dół", "Download": "Pobierz", @@ -490,7 +490,7 @@ "Images": "Obrazy", "ImportFavoriteChannelsHelp": "Jeśli aktywne, tylko kanały oznaczone jako ulubione na tunerze, będą importowane.", "ImportMissingEpisodesHelp": "W przypadku aktywacji tej opcji, informacje o brakujących odcinkach zostaną zaimportowane do bazy Jellyfin i będą wyświetlane na listach sezonów i seriali. Może to jednak znacznie wydłużyć czas skanowania biblioteki.", - "InstallingPackage": "Instalowanie {0}", + "InstallingPackage": "Instalowanie {0} (wersja {1})", "InstantMix": "Szybki remiks", "ItemCount": "{0} pozycje", "Items": "Pozycje", @@ -953,16 +953,16 @@ "NoNextUpItemsMessage": "Nie znaleziono niczego. Zacznij oglądać swoje seriale!", "NoPluginConfigurationMessage": "Ta wtyczka nie ma żadnych ustawień.", "NoSubtitleSearchResultsFound": "Brak wyników wyszukiwania.", - "NoSubtitles": "Brak napisów", + "NoSubtitles": "Brak", "NoSubtitlesHelp": "Domyślnie napisy nie będą wczytywane. Można je ciągle włączyć ręcznie podczas odtwarzania.", "None": "Brak", "Normal": "Normalny", "NumLocationsValue": "{0} foldery", "Off": "Wyłączone", "OneChannel": "Jeden kanał", - "OnlyForcedSubtitles": "Tylko wymuszone napisy", + "OnlyForcedSubtitles": "Tylko wymuszone", "OnlyForcedSubtitlesHelp": "Tylko napisy oznaczone jako wymuszone będą wczytywane.", - "OnlyImageFormats": "Tylko formaty graficzne (VOBSUB, PGS, SUB, itp.)", + "OnlyImageFormats": "Tylko Formaty Graficzne (VOBSUB, PGS, SUB)", "OptionAdminUsers": "Administratorzy", "OptionAlbumArtist": "Wykonawca albumu", "OptionAllUsers": "Wszyscy użytkownicy", @@ -1100,7 +1100,7 @@ "OptionWeekly": "Cotygodniowo", "OriginalAirDateValue": "Data pierwszej emisji: {0}", "Overview": "Opis", - "PackageInstallCancelled": "Instalacja {0} anulowana.", + "PackageInstallCancelled": "Instalacja {0} (wersja {1}) anulowana.", "PackageInstallCompleted": "Instalacja {0} zakończona.", "PackageInstallFailed": "Instalacja {0} nieudana.", "ParentalRating": "Kategoria wiekowa", @@ -1470,5 +1470,18 @@ "EnableFastImageFadeIn": "Szybkie pojawianie się obrazów", "Artist": "Artysta", "AlbumArtist": "Album artysty", - "Album": "Album" + "Album": "Album", + "Person": "Osoba", + "OtherArtist": "Inny artysta", + "Movie": "Film", + "MessageUnauthorizedUser": "Nie masz dostępu do zasobów serwera. Skontaktuj się z administratorem sieci, aby uzyskać więcej informacji.", + "LabelLibraryPageSizeHelp": "Ustaw liczbę pozycji pokazywanych na stronie biblioteki. Ustaw 0, aby wyłączyć podział na strony.", + "LabelLibraryPageSize": "Rozmiar strony biblioteki:", + "LabelDeinterlaceMethod": "Metoda usuwania przeplotu:", + "HeaderFavoritePlaylists": "Ulubione Playlisty", + "Episode": "Odcinek", + "DeinterlaceMethodHelp": "Wybierz metodę usuwania przeplotu używaną podczas transkodowania.", + "ClientSettings": "Ustawienia klienta", + "ButtonTogglePlaylist": "Playlista", + "ButtonToggleContextMenu": "Więcej" } diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index 6a808d090..d7418749e 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -182,7 +182,7 @@ "DisplayInOtherHomeScreenSections": "Exibir nas seções da tela inicial como mídia recente e continuar assistindo", "DisplayMissingEpisodesWithinSeasons": "Exibir episódios em falta nas temporadas", "DisplayMissingEpisodesWithinSeasonsHelp": "Isto também deve ser ativado para as bibliotecas de TV na configuração do servidor.", - "DisplayModeHelp": "Seleciona o tipo de tela para executar o Jellyfin.", + "DisplayModeHelp": "Selecione o estilo de layout que deseje para a interface.", "DoNotRecord": "Não gravar", "Down": "Baixo", "DrmChannelsNotImported": "Canais com DRM não serão importados.", @@ -626,7 +626,7 @@ "LabelKodiMetadataEnablePathSubstitution": "Ativar substituição de local", "LabelKodiMetadataEnablePathSubstitutionHelp": "Ativa a substituição do local das imagens usando as configurações de substituição de local do servidor.", "LabelKodiMetadataSaveImagePaths": "Salvar o local das imagens dentro dos arquivos nfo", - "LabelKodiMetadataSaveImagePathsHelp": "Isto é recomendado se os nomes dos arquivos de imagem não estão de acordo com as recomendações do Kodi.", + "LabelKodiMetadataSaveImagePathsHelp": "Isto é recomendado se os nomes dos arquivos de imagem não estão de acordo com as exigências do Kodi.", "LabelKodiMetadataUser": "Salvar informações do que o usuário assiste aos NFO's para:", "LabelKodiMetadataUserHelp": "Salva os dados para arquivos NFO para que outras aplicações possam usar.", "LabelLanNetworks": "Redes LAN:", @@ -1021,7 +1021,7 @@ "OptionMissingEpisode": "Episódios em Falta", "OptionMonday": "Segunda-feira", "OptionNameSort": "Nome", - "OptionNew": "Novo...", + "OptionNew": "Novo…", "OptionNone": "Nenhum", "OptionOnAppStartup": "Ao iniciar a aplicação", "OptionOnInterval": "Em um intervalo", @@ -1501,5 +1501,11 @@ "AlbumArtist": "Artista do Album", "Album": "Album", "UnsupportedPlayback": "O Jellyfin não pode descriptografar conteúdo protegido por DRM, porém mesmo assim fará uma tentativa para todo tipo de conteúdo, incluindo títulos protegidos. A imagem de alguns arquivos pode aparecer completamente preta devido a criptografia ou outros recursos não suportados, como títulos interativos.", - "MessageUnauthorizedUser": "Você não está autorizado a acessar o servidor neste momento. Por favor, contate o administrador do servidor para mais informações." + "MessageUnauthorizedUser": "Você não está autorizado a acessar o servidor neste momento. Por favor, contate o administrador do servidor para mais informações.", + "ButtonTogglePlaylist": "Playlist", + "ButtonToggleContextMenu": "Mais", + "Filter": "Filtro", + "New": "Novo", + "HeaderFavoritePlaylists": "Playlists Favoritas", + "ApiKeysCaption": "Lista de chaves API ativadas no momento" } diff --git a/src/strings/ro.json b/src/strings/ro.json index c27996ec4..aa6bdf4a3 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -249,7 +249,7 @@ "ButtonStop": "Stop", "ButtonSubmit": "Trimite", "Collections": "Colecții", - "AllowRemoteAccess": "Permite conexiuni externe către serverul Jellyfin.", + "AllowRemoteAccess": "Permite conexiuni externe către acest server Jellyfin.", "AllowRemoteAccessHelp": "Dacă este nebifat, toate conexiunile externe vor fi blocate.", "AlwaysPlaySubtitles": "Întotdeauna arată", "AnyLanguage": "Orice Limbă", @@ -288,7 +288,7 @@ "Director": "Regizor", "AllowOnTheFlySubtitleExtractionHelp": "Subtitrările încorporate pot fi extrase din video și transmise către client în mod text pentru a preveni transcodarea videoului. Pe unele sisteme acest lucru poate dura mult timp și poate cauza oprirea redării video în timpul procesului de extragere. Dezactivează opțiunea pentru a avea subtitrările încorporate incluse în videoul transcodat atunci când nu sunt nativ suportate de către dispozitivul client.", "BirthLocation": "Locul nașterii", - "BurnSubtitlesHelp": "Determină dacă serverul ar trebui să includă subtitrări când face transcodarea video. Evitând acest lucru va îmbunătăți performanța serverului. Selectează Auto pentru includerea formaturilor bazate pe imagini (VOBSUB, PGS, SUB, IDX) și anumitor subtitrări ASS sau SSA.", + "BurnSubtitlesHelp": "Determină dacă serverul ar trebui să includă subtitrări când face transcodarea video. Evitând acest lucru va îmbunătăți performanța serverului. Selectează Auto pentru includerea formaturilor bazate pe imagini (VOBSUB, PGS, SUB, IDX, ...) și anumitor subtitrări ASS sau SSA.", "ButtonPreviousTrack": "Calea anterioară", "ButtonRevoke": "Revocă", "ButtonSettings": "Setări", @@ -304,14 +304,14 @@ "Delete": "Șterge", "DeleteImage": "Șterge Imaginea", "DeleteUserConfirmation": "Sigur doriți să ștergeți acest utilizator?", - "Depressed": "Depresat", + "Depressed": "Deprimat", "Descending": "Descendent", "DetectingDevices": "Detectez dispozitive", "DirectPlaying": "Redare directă", "DirectStreamHelp2": "Transmiterea directă a unui fișier utilizează foarte puțină putere de procesare fără pierderi în calitatea video.", "DirectStreaming": "Transmitere directă", "Artists": "Artiști", - "BookLibraryHelp": "Cărți audio și text sunt suportate. Verifică {0}ghidul numirii cărților{1}.", + "BookLibraryHelp": "Cărți audio și text sunt suportate. Verifică {0} ghidul numirii cărților{1}.", "ButtonAddImage": "Adaugă Imagine", "ButtonArrowUp": "Sus", "ButtonAudioTracks": "Cale Audio", @@ -511,7 +511,7 @@ "GuestStar": "Vedeta invitata", "GuideProviderSelectListings": "Selectați Listări", "EncoderPresetHelp": "Alegeți o valoare mai rapidă pentru a îmbunătăți performanța sau o valoare mai lentă pentru a îmbunătăți calitatea.", - "HardwareAccelerationWarning": "Activarea accelerării hardware poate provoca instabilitate în anumite medii. Asigurați-vă că sistemul de operare și driverele video sunt complet actualizate. Dacă întâmpinați dificultăți pentru a reda video după activarea acestei opțiuni, va trebui să schimbați setarea la Nimic.", + "HardwareAccelerationWarning": "Activarea accelerării hardware poate provoca instabilitate în anumite medii. Asigurați-vă că sistemul de operare și driverele video sunt complet actualizate. Dacă întâmpinați dificultăți pentru a reda video după activarea acestei opțiuni, va trebui să schimbați setarea la inapoi la Nimic.", "HeaderAccessSchedule": "Program de Acces", "HeaderAccessScheduleHelp": "Creați un program de acces pentru a limita accesul la anumite ore.", "HeaderActiveDevices": "Dispozitive active", @@ -1334,7 +1334,7 @@ "OptionOnInterval": "La un interval", "OptionOnAppStartup": "La pornirea aplicației", "OptionNone": "Nici unul", - "OptionNew": "Nou...", + "OptionNew": "Nou…", "OptionMissingEpisode": "Episoade lipsă", "OptionMax": "Max", "OptionLoginAttemptsBeforeLockoutHelp": "O valoare zero înseamnă că va moșteni valoarea implicită de trei încercări pentru utilizatorii normali și cinci pentru administratori. Setarea acestei opțiuni la -1 va dezactiva funcția.", @@ -1359,9 +1359,9 @@ "OptionEnableExternalContentInSuggestions": "Activați conținut extern în sugestii", "OptionEmbedSubtitles": "Inclus în container", "OptionDownloadLogoImage": "Siglă", - "OptionDownloadImagesInAdvanceHelp": "În mod implicit, majoritatea imaginilor sunt descărcate numai la cererea unei aplicații din Jellyfin. Activați această opțiune pentru a descărca în prealabil toate imaginile, în timp ce fișierele media noi sunt importate. Acest lucru poate provoca scanări ale bibliotecii semnificativ mai lungi.", + "OptionDownloadImagesInAdvanceHelp": "În mod implicit, majoritatea imaginilor sunt descărcate numai la cererea unei aplicații din Jellyfin. Activați această opțiune pentru a descărca în prealabil toate imaginile, pe măsură ce fișierele media sunt importate. Acest lucru poate provoca scanări ale bibliotecii semnificativ mai lungi.", "OptionDownloadImagesInAdvance": "Descărcați imaginile în avans", - "OptionDownloadDiscImage": "Placă", + "OptionDownloadDiscImage": "Disc", "OptionDisplayFolderViewHelp": "Afișați dosarele alături de celelalte biblioteci media. Acest lucru poate fi util dacă doriți să aveți o vizualizare direct în dosar.", "OptionDisplayFolderView": "Afișați o vizualizare de dosar pentru a afișa dosarele media simple", "OptionDateAddedImportTime": "Utilizați data scanării în bibliotecă", @@ -1465,8 +1465,8 @@ "NoCreatedLibraries": "Se pare că nu ați creat încă biblioteci. {0} Doriți să creați una acum? {1}", "AskAdminToCreateLibrary": "Cereți unui administrator să creeze o bibliotecă.", "PlaybackErrorNoCompatibleStream": "Clientul nu este compatibil cu formatul media, iar serverul nu trimite un format media compatibil.", - "AllowFfmpegThrottlingHelp": "Când un transcod sau un remux se află destul de departe înainte de poziția actuală de redare, întrerupeți procesul, astfel încât să consume mai puține resurse. Acest lucru este cel mai util când priviți fără a derula des. Dezactivați acestă opțiune dacă întâmpinați probleme de redare.", - "AllowFfmpegThrottling": "Accelerare Transcod-uri", + "AllowFfmpegThrottlingHelp": "Când un transcod sau un remux se află destul de departe înainte de poziția actuală de redare, întrerupeți procesul, astfel încât să consume mai puține resurse. Acest lucru este util atunci când priviți fără a derula des. Dezactivați acestă opțiune dacă întâmpinați probleme de redare.", + "AllowFfmpegThrottling": "Limitare Transcod-uri", "Track": "Cale", "Season": "Sezon", "ReleaseGroup": "Gruparea lansării", @@ -1493,7 +1493,7 @@ "ListPaging": "{0}-{1} din {2}", "WriteAccessRequired": "Jellyfin Server necesită acces de scriere la acest folder. Vă rugăm să vă asigurați accesul la scriere și încercați din nou.", "PathNotFound": "Calea nu a fost găsită. Vă rugăm să vă asigurați de validitatea căii și încercați din nou.", - "YadifBob": "YADIF Bob", + "YadifBob": "Gigi Bob", "Yadif": "YADIF", "LabelDeinterlaceMethod": "Metoda de intercalare:", "DeinterlaceMethodHelp": "Selectați metoda de intercalat pe care să o utilizați la transcodarea conținutului intercalat.", @@ -1502,5 +1502,9 @@ "LabelLibraryPageSize": "Mărimea paginii Bibliotecă:", "MessageUnauthorizedUser": "Nu sunteți autorizat să accesați serverul în acest moment. Vă rugăm să contactați administratorul serverului pentru mai multe informații.", "ButtonTogglePlaylist": "Listă de redare", - "ButtonToggleContextMenu": "Mai mult" + "ButtonToggleContextMenu": "Mai mult", + "Filter": "Filtru", + "New": "Nou", + "HeaderFavoritePlaylists": "Listă Favorită", + "ApiKeysCaption": "Lista cheilor API active" } diff --git a/src/strings/ru.json b/src/strings/ru.json index 33169c555..9fc2a00df 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -269,7 +269,7 @@ "Guide": "Телегид", "GuideProviderLogin": "Вход", "GuideProviderSelectListings": "Выбор перечней", - "H264CrfHelp": "Постоянное значение оценки (Constant Rate Factor, CRF) - параметр качества по умолчанию для кодека x264. Возможно задавать значения от 0 до 51, где меньшие значения привели бы к улучшению качества (за счёт увеличения размеров файлов). Разумными являются значения от 18 до 28. Стандартно для x264 - 23, так что вы можете использовать это в качестве отправной точки.", + "H264CrfHelp": "Постоянное значение оценки (Constant Rate Factor, CRF) - параметр качества по умолчанию для кодёра x264. Возможно задавать значения от 0 до 51, где меньшие значения привели бы к улучшению качества (за счёт увеличения размеров файлов). Приемлемыми являются значения от 18 до 28. Стандартно для x264 - 23, так что вы можете использовать это в качестве отправной точки.", "EncoderPresetHelp": "Выберите значение быстрее для улучшения производительности, или значение медленнее для улучшения качества.", "HDPrograms": "HD-передачи", "HandledByProxy": "Обрабатывается обратным прокси", @@ -1223,6 +1223,8 @@ "ShowYear": "Отображать год", "Shows": "Передачи", "Shuffle": "Перемешать", + "New": "Новинка", + "Filter": "Фильтр", "SimultaneousConnectionLimitHelp": "Максимальное количество разрешённых одновременных потоков. Введите 0, чтобы снять ограничения.", "SkipEpisodesAlreadyInMyLibrary": "Не записывать эпизоды, которые уже находятся в моей медиатеке", "SkipEpisodesAlreadyInMyLibraryHelp": "Эпизоды будут сравниваться с помощью номеров сезонов и эпизодов, когда они имеются.", @@ -1471,7 +1473,7 @@ "PlaybackErrorNoCompatibleStream": "Этот клиент несовместим с медиаданными, а сервер не отправляет медиаданные в совместимом формате.", "AllowFfmpegThrottlingHelp": "Когда перекодирование или переупаковка достаточно далеко опережают текущую позицию воспроизведения, процесс приостанавливается, так что он использует меньше ресурсов. Это наиболее полезно, когда вы редко меняете позиции в видео. Выключите это, если у вас возникли проблемы с воспроизведением.", "OnWakeFromSleep": "При пробуждении ото сна", - "YadifBob": "YADIF Bob", + "YadifBob": "YADIF с удвоением", "OnApplicationStartup": "При запуске приложения", "EveryXHours": "Каждые {0} часов", "EveryHour": "Каждый час", @@ -1493,7 +1495,7 @@ "Artist": "Исполнитель", "AlbumArtist": "Исполнитель альбома", "Album": "Альбом", - "LastSeen": "Последнимй раз был {0}", + "LastSeen": "Последний раз был {0}", "WriteAccessRequired": "Jellyfin Server требуются права на запись в эту папку. Обеспечьте доступ для записи и попробуйте снова.", "PathNotFound": "Путь не может быть найден. Убедитесь, что путь правильный и попробуйте снова.", "ReleaseGroup": "Релиз-группа", @@ -1503,5 +1505,6 @@ "LabelDeinterlaceMethod": "Метод устранения гребёнки:", "DeinterlaceMethodHelp": "Выберите метод устранения гребёнки, который будет использоваться при перекодировании чересстрочного содержания.", "UnsupportedPlayback": "Jellyfin не может расшифровать содержимое, защищенное DRM, но в любом случае будет предпринята попытка расшифровки всего содержимого, включая защищенные заголовки. Некоторые файлы могут выглядеть полностью черными из-за шифрования или других неподдерживаемых функций, таких как интерактивные заголовки.", - "MessageUnauthorizedUser": "В настоящее время у вас нет доступа к серверу. Пожалуйста, свяжитесь с администратором сервера для получения дополнительной информации." + "MessageUnauthorizedUser": "В настоящее время у вас нет доступа к серверу. Пожалуйста, свяжитесь с администратором сервера для получения дополнительной информации.", + "HeaderFavoritePlaylists": "Избранные плей-листы" } diff --git a/src/strings/sk.json b/src/strings/sk.json index 7b80e3264..05d0913f6 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -5,7 +5,7 @@ "Albums": "Albumy", "All": "Všetko", "AllChannels": "Všetky kanály", - "AllComplexFormats": "Všetky komplexné formáty (ASS, SSA, VOBSUB, PGS, SUB, IDX)", + "AllComplexFormats": "Všetky komplexné formáty (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)", "AllEpisodes": "Všetky epizódy", "AllLanguages": "Všetky jazyky", "AllLibraries": "Všetky knižnice", @@ -25,7 +25,7 @@ "BirthDateValue": "Narodený/á: {0}", "BirthLocation": "Miesto narodenia", "BirthPlaceValue": "Miesto narodenia: {0}", - "BookLibraryHelp": "Audioknihy a učebnice sú podporované. Prečítajte si {0}pravidlá pre názvy kníh v Jellyfine{1}.", + "BookLibraryHelp": "Audioknihy a učebnice sú podporované. Prečítajte si {0} pravidlá pre názvy kníh v Jellyfine {1}.", "Books": "Knihy", "ButtonAdd": "Pridať", "ButtonAddMediaLibrary": "Pridať knižnicu médií", @@ -648,7 +648,7 @@ "OptionMissingEpisode": "Chýbajúce epizódy", "OptionMonday": "Pondelok", "OptionNameSort": "Názov", - "OptionNew": "Nové...", + "OptionNew": "Nové…", "OptionNone": "Žiadne", "OptionOnAppStartup": "Pri spustení aplikácie", "OptionParentalRating": "Rodičovské hodnotenie", @@ -1180,7 +1180,7 @@ "CancelSeries": "Ukončiť seriál", "ButtonSplit": "Rozdeliť", "ButtonAddImage": "Pridať obrázok", - "BurnSubtitlesHelp": "Určuje, či má server vpáliť titulky počas transkódovania videa. Vynechanie tejto možnosti výrazne zvýši výkon. Vyberte možnosť Auto, pokiaľ chcete vpáliť do obrazu titulky v grafickom formáte (VOBSUB, PGS, SUB, IDX) a niektoré ASS alebo SSA titulky.", + "BurnSubtitlesHelp": "Určuje, či má server vpáliť titulky počas transkódovania videa. Vynechanie tejto možnosti výrazne zvýši výkon. Vyberte možnosť Auto, pokiaľ chcete vpáliť do obrazu titulky v grafickom formáte (VOBSUB, PGS, SUB, IDX, …) a niektoré ASS alebo SSA titulky.", "BrowsePluginCatalogMessage": "Prehliadnite si náš katalóg dostupných zásuvných modulov.", "Browse": "Prechádzať", "Blacklist": "Blacklist", @@ -1189,7 +1189,7 @@ "Art": "Umenie", "AlwaysPlaySubtitlesHelp": "Titulky odpovedajúce jazykovej preferencií sa načítajú bez ohľadu na jazyk zvuku.", "AllowedRemoteAddressesHelp": "Zoznam IP adries alebo IP/netmask záznamov pre siete oddelené čiarkami z ktorých sa dá vzdialene pripojiť. Pokiaľ zoznam bude prázdny, všetky adresy budú povolené.", - "AllowOnTheFlySubtitleExtractionHelp": "Vložené titulky môžu byť extrahované z videa a prenesené na klienta vo forme jednoduchého textu aby sa zabránilo transkódovaniu videa. Na niektorých systémoch táto operácia môže trvať dlhší čas a a spôsobiť sekanie videa počas počas extrahovania. Vypnutie tejto funkcie bude mať za následok, že titulky budú počas transkódovania vypálené do samotného videa pokiaľ klientské zariadenie natívne nepodporuje ich formát.", + "AllowOnTheFlySubtitleExtractionHelp": "Vložené titulky môžu byť extrahované z videa a prenesené na klienta vo forme jednoduchého textu, aby sa zabránilo transkódovaniu videa. Na niektorých systémoch táto operácia môže trvať dlhší čas a a spôsobiť sekanie videa počas počas extrahovania. Vypnutie tejto funkcie bude mať za následok, že titulky budú počas transkódovania vypálené do samotného videa pokiaľ klientské zariadenie natívne nepodporuje ich formát.", "Watched": "Pozreté", "TvLibraryHelp": "Pozrite sa na {0}sprievodcu pomenovania TV programov{1}.", "LabelLineup": "Lineup:", @@ -1500,5 +1500,13 @@ "Artist": "Umelec", "AlbumArtist": "Umelec albumu", "LabelLibraryPageSizeHelp": "Určuje množstvo položiek na zobrazenie na stránke knižnice. Nastavte 0 pre vypnutie stránkovania.", - "LabelLibraryPageSize": "Veľkosť stránky knižnice:" + "LabelLibraryPageSize": "Veľkosť stránky knižnice:", + "MessageUnauthorizedUser": "Momentálne nemáte oprávnenie na prístup k serveru. Prosím, kontaktujte svojho administrátora serveru pre viac informácií.", + "UnsupportedPlayback": "Jellyfin nemôže dešifrovať obsah chránený technológiou DRM, ale pokúsi sa o to, vrátane chránených titulov. Niektoré súbory sa môžu zobraziť ako kompletne čierne z dôvodu, že sú zašifrované alebo obsahujú nepodporované funckie, ako napríklad interaktívne funkcie.", + "Filter": "Filter", + "New": "Nové", + "HeaderFavoritePlaylists": "Obľúbené playlisty", + "ButtonTogglePlaylist": "Playlist", + "ButtonToggleContextMenu": "Viac", + "ApiKeysCaption": "Zoznam v súčasnosti povolených API kľúčov" } diff --git a/src/strings/sv.json b/src/strings/sv.json index 7f6e1abc6..443549e79 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -2,7 +2,7 @@ "AccessRestrictedTryAgainLater": "För närvarande är åtkomsten begränsad. Försök igen senare.", "Actor": "Skådespelare", "Add": "Lägg till", - "AddItemToCollectionHelp": "Lägg till objekt till samlingar genom att söka efter dem och använda deras högerklick- eller knack/tryck-meny för att lägga till dem.", + "AddItemToCollectionHelp": "Lägg till objekt i samlingar genom att söka efter dem och använda deras högerklick- eller pekmeny för att lägga till dem i en samling.", "AddToCollection": "Lägg till i samling", "AddToPlayQueue": "Lägg till i spelkö", "AddToPlaylist": "Lägg till i spellista", @@ -22,7 +22,7 @@ "AllowOnTheFlySubtitleExtractionHelp": "Inbäddade undertexter kan extraheras ur videor och skickas till klienter i textformat för att förhindra omkodning. I vissa system kan detta ta en lång tid och stoppa videouppspelningen under extraheringsprocessen. Avaktivera detta för att bränna in inbäddade undertexter genom omkodning när de inte stöds av klienten.", "AllowRemoteAccess": "Tillåt fjärranslutningar till denna Jellyfin-server.", "AllowRemoteAccessHelp": "Om avaktiverat så blockeras alla fjärranslutningar.", - "AlwaysPlaySubtitles": "Visa alltid undertexter", + "AlwaysPlaySubtitles": "Visa alltid", "AlwaysPlaySubtitlesHelp": "Undertexter på det önskade språket kommer att laddas oavsett ljudspårets språk.", "AnyLanguage": "Alla språk", "Anytime": "När som helst", @@ -898,7 +898,7 @@ "NumLocationsValue": "{0} mappar", "Off": "Av", "OneChannel": "En kanal", - "OnlyForcedSubtitles": "Endast tvingande undertexter", + "OnlyForcedSubtitles": "Endast påtvingad", "OnlyForcedSubtitlesHelp": "Endast undertexter markerade som tvingande kommer att laddas.", "OnlyImageFormats": "Endast bildbaserade format (VOBSUB, PGS, SUB, etc)", "OptionAdminUsers": "Administratörer", @@ -1489,5 +1489,23 @@ "Episode": "Avsnitt", "ClientSettings": "Klientinställningar", "BoxSet": "Samlingsbox", - "Artist": "Artist" + "Artist": "Artist", + "ButtonTogglePlaylist": "Spellista", + "ButtonToggleContextMenu": "Mer", + "AlbumArtist": "Albumartist", + "LabelLibraryPageSize": "Bibliotekets sidstorlek:", + "LabelDeinterlaceMethod": "Deinterlacing-metod:", + "WeeklyAt": "{0}s vid {1}", + "LastSeen": "Senast sedd {0}", + "YadifBob": "YADIF Bob", + "Yadif": "YADIF", + "Filter": "Filter", + "New": "Ny", + "MessageUnauthorizedUser": "Du har inte behörighet att komma åt servern just nu. Kontakta din serveradministratör för mer information.", + "HeaderFavoritePlaylists": "Favoritspellista", + "OnWakeFromSleep": "Vid start från vilande läge", + "UnsupportedPlayback": "Jellyfin kan inte dekryptera inehåll skyddat av DRM men allt inehåll kommer ändå försökas, även skyddade titlar. Vissa filer kan se helt svart ut på grund av kryptering eller andra funktioner som inte stöds, till exempel interaktiva titlar.", + "LabelLibraryPageSizeHelp": "Sätter en begränsad sidstorlek i bibliotek. Sätt 0 för att avaktivera begränsad sidstorlek.", + "ApiKeysCaption": "Lista av aktiva API-nycklar", + "DeinterlaceMethodHelp": "Välj metod för borttagning av inflätning vid konvertering av inflätat inehåll." } diff --git a/src/strings/tr.json b/src/strings/tr.json index 5d6772b75..d69391ce9 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -672,12 +672,12 @@ "HeaderYears": "Yıl", "HeaderXmlSettings": "Xml Ayarları", "HeaderXmlDocumentAttributes": "Xml Döküman Öznitelikleri", - "HeaderXmlDocumentAttribute": "Xml Dökümanı Öznitelik", + "HeaderXmlDocumentAttribute": "Xml Döküman Özniteliği", "HeaderUser": "Kullanıcı", "HeaderUploadImage": "Resim Yükle", "HeaderUpcomingOnTV": "TV'de Yaklaşan", "HeaderTypeText": "Metin Gir", - "HeaderTunerDevices": "Tuner Cihazları", + "HeaderTunerDevices": "Alıcı Cihazları", "HeaderThisUserIsCurrentlyDisabled": "Bu kullanıcı şu anda pasif", "HeaderTags": "Etiketler", "HeaderSubtitleProfiles": "Altyazı Profilleri", @@ -735,5 +735,8 @@ "BoxSet": "Seri Filmler", "AskAdminToCreateLibrary": "Kütüphane oluşturmak için yöneticiden izin iste.", "AllowFfmpegThrottlingHelp": "Video dönüşüm işlemleri yeterince ilerlediyse kaynak tüketimini azaltmak için durdur. İleri/geri sarma işlemlerinin az yapıldığı durumlarda çok kullanışlıdır. Oynatım sorunları ile karşılaşırsanız bu özelliği kapatın.", - "AlbumArtist": "Sanatçı" + "AlbumArtist": "Sanatçı", + "HeaderTuners": "Alıcılar", + "HeaderTranscodingProfileHelp": "Kodlama gerekince hangi formatın kullanılacağını belirtmek için kodlama profili ekle.", + "ButtonTogglePlaylist": "Liste" } diff --git a/src/strings/uk.json b/src/strings/uk.json index 57bd67864..5a859a4ae 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -20,9 +20,9 @@ "HeaderAutomaticUpdates": "Автоматичне оновлення", "HeaderBooks": "Книги", "HeaderDeleteDevice": "Видалить пристрій", - "HeaderLatestEpisodes": "Останні епізоди", - "HeaderLatestMedia": "Останні медіа", - "HeaderLatestMovies": "Останні фільми", + "HeaderLatestEpisodes": "Нещодавно переглянуті серії", + "HeaderLatestMedia": "Нещодавно переглянуті", + "HeaderLatestMovies": "Нещодавні фільми", "HeaderLatestMusic": "Остання музика", "HeaderMovies": "Фільми", "HeaderSeasons": "Сезони", @@ -93,21 +93,71 @@ "ValueSeriesCount": "{0} серій", "ValueSongCount": "{0} пісень", "AddToPlaylist": "Додати до списку відтворення", - "AccessRestrictedTryAgainLater": "Доступ тимчасово заборонений. Спробуйте пізніше.", + "AccessRestrictedTryAgainLater": "На цей момент доступ заборонений. Повторіть спробу пізніше.", "Actor": "Виконавець", - "AllLanguages": "Всі мови", - "AllLibraries": "Всі бібліотеки", + "AllLanguages": "Усі мови", + "AllLibraries": "Усі бібліотеки", "AddToCollection": "Додати до колекції", "AddToPlayQueue": "Додати до черги відтворення", "All": "Всі", "AllChannels": "Всі канали", "AllEpisodes": "Всі епізоди", - "AllowRemoteAccess": "Дозволити віддалене підключення до цього сервера Jellyfin", - "AlwaysPlaySubtitles": "Завжди відтворювати субтитри", + "AllowRemoteAccess": "Дозволити віддалене підключення до цього сервера Jellyfin.", + "AlwaysPlaySubtitles": "Завжди вмикати субтитри", "AnyLanguage": "Будь-яка мова", "Anytime": "Завжди", "Add": "Додати", "AddedOnValue": "Додано", "Albums": "Альбоми", - "Absolute": "Абсолютний" + "Absolute": "Абсолютний", + "HeaderFavoriteEpisodes": "Улюблені серії", + "Movies": "Фільми", + "Collections": "Колекції", + "Folders": "Директорії", + "HeaderNextUp": "Наступний", + "HeaderAlbumArtists": "Виконавці альбомів", + "HeaderFavoriteSongs": "Улюблені пісні", + "Favorites": "Улюблені", + "HeaderFavoriteAlbums": "Улюблені альбоми", + "Genres": "Жанри", + "Books": "Книги", + "Artists": "Виконавці", + "HeaderLiveTV": "Ефірне ТБ", + "Channels": "Канали", + "HeaderFavoriteArtists": "Улюблені виконавці", + "HeaderFavoriteShows": "Улюблені шоу", + "HeaderContinueWatching": "Продовжити перегляд", + "AddItemToCollectionHelp": "Додайте елементи до колекції за допомогою пошуку або кліком правої кнопкої миші чи натисненням на меню.", + "AllowedRemoteAddressesHelp": "Список з комами, в якості розділювачів, визначає IP-адреси та IP/мережеві маски для мереж, яким дозволено підключатись віддалено. Якщо залишити строку пустою, то усі віддалені підключення будуть дозволені.", + "AllowRemoteAccessHelp": "Якщо не відмічено прапорцем, усі віддалені підключення будуть заблоковані.", + "AllowFfmpegThrottling": "Примусово обмежити перекодування", + "AllowMediaConversionHelp": "Надайте або забороніть доступ для можливості перетворення медіа.", + "AllowMediaConversion": "Дозволити перетворення медіа", + "Alerts": "Термінові сповіщення", + "AlbumArtist": "Виконавець альбому", + "Album": "Альбом", + "AdditionalNotificationServices": "Пошук у каталозі плагінів для встановлення додаткових сервісів сповіщень.", + "ShowYear": "Відобразити рік", + "ShowTitle": "Відобразити назву", + "Raised": "Піднятий", + "OptionResElement": "кожний елемент", + "DropShadow": "Тінь", + "Blacklist": "Чорний список", + "BirthLocation": "Місце народження", + "Banner": "Обкладинка", + "AutoBasedOnLanguageSetting": "Автоматично (на основі поточної мови)", + "Auto": "Автоматично", + "AuthProviderHelp": "Оберіть сервіс аутентифікації, який буде використаний з поточним паролем користувача.", + "Audio": "Аудіо", + "AttributeNew": "Новий", + "AspectRatio": "Відношення сторін", + "AskAdminToCreateLibrary": "Попросіть адміністратора створити бібліотеку.", + "Ascending": "У порядку зростання", + "AsManyAsPossible": "Настільки багато наскільки можливо", + "Artist": "Виконавець", + "Art": "Мистецтво", + "AllowOnTheFlySubtitleExtractionHelp": "Вбудовані субтитри можуть бути експортовані з відео і надіслані, по черзі, клієнтам у вигляді тексту. Це допоможе уникнути перекодування відео. На деяких системах, перекодування може зайняти тривалий час і зупинити відтворення відео, для того щоб забезпечити експортування. Вимкнення цієї функції дозволить вбудованим субтитрам бути інтегрованим у відео, під час перекодування, якщо вбудовані субтитри не підтримуються на стороні клієнта.", + "AllowOnTheFlySubtitleExtraction": "Дозволити експортування субтитрів «на льоту»", + "AllowHWTranscodingHelp": "Дозволити клієнту перекодування на «на льоту». Це дозволить відмикати перекодування, якщо вона вимагається сервером.", + "AllComplexFormats": "Усі складні формати (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)" } diff --git a/src/strings/vi.json b/src/strings/vi.json index e32272bda..9ff05dcb6 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -30,7 +30,7 @@ "HeaderLatestEpisodes": "Các tập phim mới nhất", "HeaderLatestMovies": "Phim mới nhất", "HeaderRecentlyPlayed": "Phát gần đây", - "HeaderSeries": "Series:", + "HeaderSeries": "Series", "HeaderStatus": "Trạng thái", "HeaderSystemDlnaProfiles": "Hồ sơ hệ thống", "HeaderUsers": "dùng", @@ -42,7 +42,7 @@ "LabelEnableDlnaPlayTo": "Cho phép DLNA chạy để", "LabelEvent": "Sự kiện:", "LabelFinish": "Kết thúc", - "LabelLanguage": "Ngôn ngữ", + "LabelLanguage": "Ngôn ngữ:", "LabelName": "Tên:", "LabelNewPassword": "Mật khẩu mới:", "LabelNewPasswordConfirm": "Xác nhận mật khẩu mới:", @@ -51,7 +51,7 @@ "LabelSaveLocalMetadata": "Lưu các ảnh nghệ thuật và metadata vào trong các thư mục media", "LabelSaveLocalMetadataHelp": "Lưu các ảnh nghệ thuật và metadata vào trong các thư mục media, sẽ đưa chúng vào một nơi bạn có thể chỉnh sửa dễ dàng hơn.", "LabelTime": "Thời gian:", - "LabelYourFirstName": "Tên của Bạn", + "LabelYourFirstName": "Tên của bạn:", "LabelYoureDone": "Bạn đã hoàn thành!", "MaxParentalRatingHelp": "Nội dung với đánh giá cao hơn sẽ được ẩn đi từ người dùng này.", "MessageNothingHere": "Không có gì ở đây.", @@ -87,7 +87,7 @@ "OptionTrackName": "Tên bài", "ParentalRating": "Parental Rating", "PasswordMatchError": "Mật khẩu và mật khẩu xác nhận cần phải khớp nhau .", - "PasswordResetComplete": "Mật khẩu đã được reset", + "PasswordResetComplete": "Mật khẩu đã được cài đặt lại.", "PasswordResetConfirmation": "Bạn có chắc muốn reset mật khẩu?", "PasswordSaved": "Mật khẩu đã được lưu.", "Saturday": "Thứ Bảy", @@ -116,7 +116,7 @@ "ThisWizardWillGuideYou": "Thủ thuật này sẽ hướng dẫn quá trình cài đặt cho bạn. Để bắt đầu, vui lòng lựa chọn ngôn ngữ bạn ưa thích.", "UninstallPluginConfirmation": "Bạn có chắc muốn gỡ bỏ{0}?", "UninstallPluginHeader": "Gỡ bỏ Plugin", - "AccessRestrictedTryAgainLater": "Truy cập hiện đang hạn chế. Hãy thử lại sau.", + "AccessRestrictedTryAgainLater": "Truy cập hiện đang bị hạn chế. Hãy thử lại sau.", "AddToCollection": "Thêm vào bộ sưu tập", "Actor": "Diễn viên", "ButtonRevoke": "Thu hồi", @@ -149,7 +149,7 @@ "ButtonFullscreen": "Toàn màn hình", "ButtonForgotPassword": "Quên mật khẩu", "ButtonFilter": "Lọc", - "ButtonEditOtherUserPreferences": "Chỉnh sửa hồ sơ, hình ảnh và sở thích cá nhân.", + "ButtonEditOtherUserPreferences": "Chỉnh sửa thông tin, hình ảnh và sở thích cá nhân.", "ButtonEditImages": "Sửa hình ảnh", "ButtonEdit": "Sửa", "ButtonDownload": "Tải", @@ -167,11 +167,11 @@ "ButtonAddScheduledTaskTrigger": "Thêm kích hoạt", "ButtonAddMediaLibrary": "Thêm thư viện Media", "ButtonAddImage": "Thêm hình ảnh", - "BurnSubtitlesHelp": "Xác định xem máy chủ có ghi phụ đề khi chuyển đổi video hay không tùy thuộc vào định dạng phụ đề. Tránh ghi trong phụ đề sẽ cải thiện hiệu suất máy chủ. Chọn Tự động để ghi hình ảnh dựa trên các định dạng (VOBSUB, PGS, SUB / IDX, v.v.) và phụ đề ASS/SSA nhất định.", + "BurnSubtitlesHelp": "Xác định xem máy chủ có nên ghi phụ đề khi chuyển đổi video hay không. Tránh thực hiện việc này sẽ cải thiện hiệu suất máy chủ đáng kể. Chọn Tự động để ghi các phụ đề có định dạng dựa trên hình ảnh (VOBSUB, PGS, SUB, IDX, ...) và một vài phụ đề ASS/SSA nhất định.", "Browse": "Duyệt", "BoxRear": "Hộp (mặt sau)", "Books": "Sách", - "BookLibraryHelp": "Âm thanh và sách văn bản được hỗ trợ. Xem lại {0}hướng dẫn đặt tên sách{1}.", + "BookLibraryHelp": "Âm thanh và sách văn bản được hỗ trợ. Xem lại {0} hướng dẫn đặt tên sách {1}.", "Blacklist": "Danh sách đen", "BirthPlaceValue": "Nơi sinh: {0}", "BirthLocation": "Nơi sinh", @@ -188,15 +188,15 @@ "Ascending": "Tăng dần", "AsManyAsPossible": "Càng nhiều càng tốt", "Artists": "Nghệ Sĩ", - "AroundTime": "Xunh quanh {0}", + "AroundTime": "Khoảng {0}", "Anytime": "Bất cứ lúc nào", - "AnyLanguage": "Bất kỳ ngôn ngữ", + "AnyLanguage": "Ngôn Ngữ Bất Kỳ", "AlwaysPlaySubtitlesHelp": "Phụ đề phù hợp với sở thích ngôn ngữ sẽ được tải bất kể ngôn ngữ âm thanh.", "AlwaysPlaySubtitles": "Luôn hiển thị phụ đề", "AllowedRemoteAddressesHelp": "Danh sách địa chỉ IP được phân tách bằng dấu phẩy hoặc các mục IP/netmask cho các mạng sẽ được phép kết nối từ xa. Nếu để trống, tất cả các địa chỉ sẽ được cho phép.", "AllowRemoteAccessHelp": "Nếu không được chọn, tất cả các kết nối từ xa sẽ bị chặn.", "AllowRemoteAccess": "Cho phép kết nối từ xa đến Máy chủ Jellyfin.", - "AllowOnTheFlySubtitleExtractionHelp": "Phụ đề nhúng có thể được trích xuất từ video và dùng như văn bản thuần túy để giúp ngăn chặn chuyển mã video. Trên một số hệ thống, việc này có thể mất nhiều thời gian và khiến quá trình phát video bị đình trệ trong quá trình trích xuất. Vô hiệu hóa điều này để có phụ đề nhúng được ghi trong chuyển mã video khi chúng không được thiết bị khách hỗ trợ.", + "AllowOnTheFlySubtitleExtractionHelp": "Phụ đề nhúng có thể được trích xuất từ video và dùng như văn bản thuần túy để giúp ngăn chặn chuyển mã video. Trên một số hệ thống, việc này có thể mất nhiều thời gian và khiến quá trình phát video bị đình trệ trong quá trình trích xuất. Vô hiệu hóa điều này để có phụ đề nhúng được ghi trong video khi chuyển mã trong trường hợp chúng không được hỗ trợ trên thiết bị phát.", "AllowOnTheFlySubtitleExtraction": "Cho phép trích xuất phụ đề trực tiếp", "AllowMediaConversionHelp": "Cấp hoặc từ chối truy cập vào tính năng chuyển đổi media.", "AllowMediaConversion": "Cho phép chuyển đổi media", @@ -204,7 +204,7 @@ "AllLibraries": "Tất cả các thư viện", "AllLanguages": "Tất cả các ngôn ngữ", "AllEpisodes": "Tất cả các tập phim", - "AllComplexFormats": "Tất cả các định dạng phức tạp (ASS, SSA, VOBSUB, PGS, SUB / IDX, v.v.)", + "AllComplexFormats": "Tất cả các định dạng phức tạp (ASS, SSA, VOBSUB, PGS, SUB, IDX, ...)", "AllChannels": "Tất cả các kênh", "Alerts": "Cảnh Báo", "Albums": "Albums", @@ -215,7 +215,7 @@ "AddToPlaylist": "Thêm vào danh sách phát", "AddToPlayQueue": "Thêm vào hàng đợi", "AddItemToCollectionHelp": "Thêm các mục vào bộ sưu tập bằng cách tìm kiếm và nhấp chuột phải hoặc nhấn vào menu để thêm chúng vào bộ sưu tập.", - "Absolute": "Tuyệt Đối", + "Absolute": "Tuyệt đối", "ButtonSend": "Gửi", "ButtonSelectView": "Chọn chế độ xem", "ButtonSelectServer": "Chọn máy chủ", @@ -236,5 +236,475 @@ "ButtonStart": "Bắt đầu", "ButtonSignIn": "Đăng nhập", "ButtonShutdown": "Tắt", - "ButtonSettings": "Cài đặt" + "ButtonSettings": "Cài đặt", + "DefaultErrorMessage": "Có lỗi xảy ra trong lúc xử lý yêu cầu của bạn. Xin hãy thử lại sau.", + "Default": "Mặc định", + "DeathDateValue": "Không hoạt động: {0}", + "DatePlayed": "Ngày phát", + "DateAdded": "Ngày thêm vào", + "CustomDlnaProfilesHelp": "Tạo một bộ thiết lập tuỳ chọn dành cho một thiết bị mới hoặc thay thế một thiết lập hệ thống.", + "CriticRating": "Đánh giá phê bình", + "CopyStreamURLError": "Có lỗi xảy ra lúc sao chép URL.", + "CopyStreamURLSuccess": "URL đã được sao chép.", + "CopyStreamURL": "Sao Chép URL Phát Sóng", + "Continuing": "Tiếp tục", + "ContinueWatching": "Tiếp tục xem", + "Connect": "Kết nối", + "ConfirmEndPlayerSession": "Bạn có muốn tắt máy chủ Jellyfin trên {0}?", + "ConfirmDeletion": "Xác Nhận Xoá", + "ConfirmDeleteItems": "Xoá những mục này sẽ xoá chúng khỏi ổ cứng và thư viện của bạn. Bạn có chắc chắn muốn tiếp tục?", + "ConfirmDeleteItem": "Xoá mục này sẽ xoá nó khỏi ổ cứng và thư viện của bạn. Bạn có chắc chắn muốn tiếp tục?", + "ConfirmDeleteImage": "Bạn có chắc chắn xoá ảnh này?", + "ConfigureDateAdded": "Thiết lập cách xác định \"ngày thêm vào\" trong mục cài đặt Thư Viện của phần quản lý máy chủ Jellyfin", + "Composer": "Tác giả", + "CommunityRating": "Đánh giá của cộng đồng", + "ColorTransfer": "Chuyển đổi màu", + "ColorSpace": "Bộ mã màu", + "ColorPrimaries": "Những màu chủ đạo", + "Collections": "Bộ sưu tập", + "ClientSettings": "Cài đặt thiết bị phát", + "CinemaModeConfigurationHelp": "Chế độ Cinema giúp bạn mang lại trải nghiệm rạp chiếu phim ngay tại phòng khách với khả năng phát trailers và những đoạn mở đầu tuỳ chọn trước phần chính của bộ phim.", + "ChannelNumber": "Kênh số", + "Channels": "Kênh", + "ChannelNameOnly": "Chỉ kênh {0}", + "ChannelAccessHelp": "Chọn những kênh để chia vẻ với người dùng này. Người quản lý sẽ có thể thay đổi toàn bộ kênh bằng cách sử dụng bộ quản lý thông tin.", + "ChangingMetadataImageSettingsNewContent": "Thay đổi về thiết lập của việc tải thông tin hoặc hình ảnh sẽ chỉ có tác dụng với những nội dung mới được thêm vào thư viện. Để những thiết lập mới có tác dụng với nội dung đã có sẵn, bạn sẽ phải cập nhật lại thông tin của chúng.", + "CancelSeries": "Ngưng series", + "ButtonTogglePlaylist": "Danh sách phát", + "ButtonToggleContextMenu": "Thêm", + "BoxSet": "Tuyển tập", + "Box": "Hộp", + "Banner": "Ảnh bìa", + "Art": "Nghệ thuật", + "Artist": "Nghệ Sĩ", + "AllowFfmpegThrottlingHelp": "Tạm dừng quá trình chuyển mã hoặc chuyển đổi định dạng để tiết kiệm tài nguyên máy chủ khi việc này đã đủ để phát so với vị trí hiện tại. Điều này hữu hiệu khi không tua nhanh thường xuyên lúc nghe nhạc hoặc xem phim. Hãy tắt tính năng này nếu có hiện tượng giật lag khi nghe nhạc hoặc xem phim.", + "AllowFfmpegThrottling": "Điều tiết sự chuyển mã", + "AlbumArtist": "Nghệ sĩ Album", + "Album": "Album", + "DisplayMissingEpisodesWithinSeasonsHelp": "Thiết lập này cũng phải được kích hoạt trong thiết lập máy chủ dành cho thư viện phim bộ.", + "DisplayMissingEpisodesWithinSeasons": "Hiển thị những tập phim bị thiếu trong mỗi phần", + "DisplayInOtherHomeScreenSections": "Những phần hiển thị trên trang chính như là nội dung mới nhất và nội dung tiếp theo", + "DisplayInMyMedia": "Hiển thị trên trang chính", + "Display": "Hiển thị", + "Dislike": "Không thích", + "Disconnect": "Ngắt kết nối", + "Disc": "Đĩa", + "Disabled": "Đã vô hiệu hoá", + "Directors": "Đạo Diễn", + "Director": "Đạo Diễn", + "DirectStreaming": "Phát trực tuyến", + "DirectStreamHelp2": "Phát trực tuyến sử dụng rất ít tài nguyên máy chủ mà không giảm chất lượng video.", + "DirectStreamHelp1": "Nội dung này tương thích với thiết bị về độ phân giải và dạng mã hoá (H.264, AC3, v.v.), nhưng lại không tương tích định dạng (mkv, avi, wmv, v.v.). Video sẽ được chuyển đổi định dạng trực tiếp ngay trước khi phát trên thiết bị.", + "DirectPlaying": "Phát trực tiếp", + "DeviceAccessHelp": "Thiết lập này chỉ áp dụng cho những thiết bị có thể định danh và sẽ không chặn được truy cập từ trình duyệt. Chọn lọc thiết bị người dùng sẽ chặn người dùng này truy cập từ những thiết bị mới cho đến khi được duyệt.", + "DetectingDevices": "Đang tìm kiếm thiết bị", + "Desktop": "Máy tính", + "Descending": "Giảm dần", + "Depressed": "Hạ xuống", + "DeleteUserConfirmation": "Bạn có chắc chắn muốn xoá người dùng này?", + "DeleteMedia": "Xoá nội dung", + "DeleteDeviceConfirmation": "Bạn có chắc chắn muốn xoá thiết bị này? Nó sẽ xuất hiện lại khi người dùng đăng nhập bằng thiết bị đó.", + "DeinterlaceMethodHelp": "Chọn phương pháp khử xen kẽ khi chuyển mã những nội dung sử dụng phương pháp quét xen kẽ.", + "DefaultSubtitlesHelp": "Phụ đề được sử dụng dựa vào thiết lập mặc định (default) và bắt buộc (forced) trong phần thông tin bổ trợ. Tuỳ chọn ưu tiên ngôn ngữ sẽ có tác dụng khi có nhiều phụ đề khác nhau.", + "DefaultMetadataLangaugeDescription": "Đây là thiết lập mặc định chung, bạn có thể tuỳ chỉnh thiết lập riêng cho từng thư viện.", + "DisplayModeHelp": "Chọn kiểu bố trí giao diện mà bạn muốn.", + "Download": "Tải xuống", + "Down": "Xuống", + "DoNotRecord": "Không ghi lại", + "EnableCinemaMode": "Chế độ rạp phim", + "EnableBackdropsHelp": "Hiển thị phông nền phía sau một số trang khi xem thư viện.", + "EnableBackdrops": "Phông nền", + "EditSubtitles": "Chỉnh sửa phụ đề", + "EditMetadata": "Chỉnh sửa thông tin", + "EditImages": "Chỉnh sửa hình ảnh", + "Edit": "Chỉnh sửa", + "EasyPasswordHelp": "Mã PIN tiện lợi được sử dụng cho việc truy cập offline trên những thiết bị được hỗ trợ và cũng có thể sử dụng dành cho truy cập dễ dàng trong nội mạng.", + "DropShadow": "Đổ Bóng", + "DrmChannelsNotImported": "Những kênh được bảo vệ bản quyền sẽ không được nhập vào.", + "DownloadsValue": "{0} đã tải xuống", + "EnableColorCodedBackgrounds": "Màu nền theo loại kênh", + "HeaderDateIssued": "Ngày Phát Hành", + "HeaderContinueWatching": "Tiếp Tục Xem", + "HeaderContinueListening": "Tiếp Tục Nghe", + "HeaderCodecProfileHelp": "Bộ giải mã chỉ ra những kiểu mã hoá nhất định mà một thiết bị có thể phát. Nếu một nội dung không thể phát, nó sẽ được chuyển mã, thậm chí nếu kiểu mã hoá đó được thiết lập phát trực tiếp.", + "HeaderContainerProfileHelp": "Bộ định dạng chỉ ra những định dạng nhất định mà một thiết bị có thể phát. Nếu nội dung có định dạng không thể phát, nội dung sẽ được chuyển đổi định dạng, kể cả khi định dạng đó được thiết lập phát trực tiếp.", + "HeaderContainerProfile": "Bộ Định Dạng", + "HeaderConnectionFailure": "Kế Nối Thất Bại", + "HeaderConnectToServer": "Kết Nối Đến Máy Chủ", + "HeaderConfirmRevokeApiKey": "Thu Hồi Quyền Truy Cập API Key", + "HeaderConfirmProfileDeletion": "Xác Nhận Xoá Hồ Sơ", + "HeaderConfirmPluginInstallation": "Xác Nhận Cài Đặt Plugin", + "HeaderConfigureRemoteAccess": "Thiết Lập Truy Cập Từ Xa", + "HeaderCodecProfile": "Bộ Giải Mã", + "HeaderChapterImages": "Hình Ảnh Phân Đoạn", + "HeaderChannels": "Kênh", + "HeaderChannelAccess": "Quyền Truy Cập Kênh", + "HeaderCastCrew": "Diễn Viên & Ê-kíp", + "HeaderCastAndCrew": "Diễn Viên & Ê-kíp", + "HeaderCancelSeries": "Huỷ Series", + "HeaderCancelRecording": "Dừng Ghi Âm/Ghi Hình", + "HeaderBranding": "Tạo Thương Hiệu", + "HeaderBooks": "Sách", + "HeaderBlockItemsWithNoRating": "Khoá những mục không có thông tin đánh giá hoặc thông tin không đáng tin cậy:", + "HeaderAudioSettings": "Cài Đặt Âm Thanh", + "HeaderAudioBooks": "Sách Nói", + "HeaderAppearsOn": "Xuất Bản Vào", + "HeaderApp": "Ứng dụng", + "HeaderApiKeysHelp": "Những ứng dụng khác cần có \"API key\" để tương tác với máy chủ Jellyfin. Những mã này được tạo ra bằng cách đăng nhập vào máy chủ Jellyfin, hoặc bạn có thể cung cấp cho ứng dụng một mã truy cập.", + "HeaderApiKeys": "API Keys", + "HeaderApiKey": "API Key", + "HeaderAllowMediaDeletionFrom": "Cho Phép Xoá Nội Dung", + "HeaderAlert": "Thông Báo", + "HeaderAlbums": "Albums", + "HeaderAlbumArtists": "Nghệ Sĩ Album", + "HeaderAdmin": "Quản Trị", + "HeaderAdditionalParts": "Phần Bổ Sung", + "HeaderAddUpdateImage": "Thêm/Thay Đổi Hình Ảnh", + "HeaderAddToPlaylist": "Thêm vào Danh Sách Phát", + "HeaderAddToCollection": "Thêm vào Bộ Sưu Tập", + "HeaderAddScheduledTaskTrigger": "Thêm Kích Hoạt Tác Vụ", + "HeaderActivity": "Hoạt Động", + "HeaderActiveRecordings": "Bản Ghi Hình/Ghi Âm Đang Hoạt Động", + "HardwareAccelerationWarning": "Bật tính năng hỗ trợ từ phần cứng có thể gây ra sự bất ổn trong một vài môi trường. Hãy chắc chắn rằng điều hành và driver thiết bị đồ hoạ đã được cập nhật mới nhất. Nếu gặp vấn đề khi phát video sau khi bật tính năng này, bạn nên tắt tính năng này.", + "HeaderActiveDevices": "Thiết Bị Đang Hoạt Động", + "HeaderAccessScheduleHelp": "Tạo một thời gian biểu để giới hạn quyền truy cập vào một số khung giờ nhất định.", + "HeaderAccessSchedule": "Thời Gian Truy Cập", + "HandledByProxy": "Được xử lý bằng phương thức đảo ngược proxy", + "HDPrograms": "Chương trình chất lượng cao (HD)", + "EncoderPresetHelp": "Chọn một giá trị nhanh hơn để cải thiện hiệu suất máy chủ, hoặc một giá trị chậm hơn để tăng chất lượng video.", + "H264CrfHelp": "Hệ Số Tỉ Lệ Cố Định (Constant Rate Factor (CRF)) là thiết lập chất lượng mặc định dành cho bộ mã hoá x264. Bạn có thể điều chỉnh giá trị trong khoảng 0 đến 51, trong đó giá trị càng nhỏ thì chất lượng càng tốt (đồng nghĩa với việc dung lượng tập tin lớn hơn). Giá trị vừa phải nằm trong khoảng từ 18 đến 28. Giá trị mặc định dành cho x264 là 23, vì thế bạn có thể sử dụng nó để bắt đầu điều chỉnh cho phù hợp.", + "GuideProviderSelectListings": "Chọn Danh Sách", + "GuideProviderLogin": "Đăng nhập", + "Guide": "Lịch phát sóng", + "GuestStar": "Ngôi sao khách mời", + "GroupVersions": "Chia nhóm theo phiên bản", + "GroupBySeries": "Chia nhóm theo bộ", + "Genres": "Thể loại", + "Genre": "Thể loại", + "General": "Tổng Hợp", + "Fullscreen": "Toàn màn hình", + "Friday": "Thứ Sáu", + "FormatValue": "Định dạng: {0}", + "Folders": "Thư mục", + "FolderTypeUnset": "Nội Dung Tổng Hợp", + "FolderTypeMusicVideos": "Video Âm Nhạc", + "FolderTypeMusic": "Nhạc", + "FolderTypeMovies": "Phim lẻ", + "FolderTypeBooks": "Sách", + "Filters": "Bộ lọc", + "File": "Tập tin", + "FetchingData": "Đang tải thêm thông tin", + "Features": "Mục đặc trưng", + "Favorites": "Mục yêu thích", + "Favorite": "Mục yêu thích", + "FastForward": "Tua nhanh", + "FFmpegSavePathNotFound": "Máy chủ không thể tìm thấy chương trình FFmpeg trong đường dẫn bạn đã nhập. FFprobe thì cũng cần thiết và phải nằm trong cùng thư mục bên trên. Những phần mềm này thường được tổng hợp cùng nhau trong một lượt tải. Hãy thử lại sau khi kiểm tra đường dẫn.", + "Extras": "Đặc biệt", + "ExtractChapterImagesHelp": "Trích xuất hình ảnh từ những phân đoạn chính sẽ cho phép thiết bị phát hiển thị bảng lựa chọn cảnh thông qua những hình ảnh đó. Quá trình đó có thể chậm, cần nhiều tài nguyên máy chủ, và có thể cần một vài gigabytes trống. Điều này sẽ được thực hiện khi video được tìm thấy, và cũng như trong tác vụ hàng đêm. Thời gian thực hiện tác vụ này có thể điều chỉnh trong phần cài đặt tác vụ thường xuyên. Không nên thực hiện quá trình này trong giờ sử dụng cao điểm.", + "ExtraLarge": "Rất Lớn", + "ExitFullscreen": "Thoát khỏi chế độ toàn màn hình", + "EveryNDays": "Mỗi {0} ngày", + "ErrorSavingTvProvider": "Có lỗi xảy ra khi lưu thông tin của nhà cung cấp TV này. Hãy thử lại khi chắc chắn rằng nó có thể truy cập.", + "ErrorPleaseSelectLineup": "Hãy chọn một danh sách và thử lại. Nếu không có danh sách nào sẵn sàng, hãy chắc chắn rằng thông tin tài khoản, mật khẩu, và mã bưu điện đều chính xác.", + "ErrorMessageStartHourGreaterThanEnd": "Thời gian kết thúc phải lớn hơn thời gian bắt đầu.", + "ErrorGettingTvLineups": "Có lỗi xảy ra khi tải danh sách TV này. Hãy thử lại khi chắc chắn rằng thông tin của bạn chính xác.", + "ErrorDeletingItem": "Có lỗi xảy ra khi xoá mục này khỏi máy chủ Jellyfin. Hãy thử lại sau khi kiểm tra chắc chắn rằng máy chủ Jellyfin có quyền ghi/xoá vào thư mục nội dung.", + "ErrorAddingXmlTvFile": "Có lỗi xảy ra khi truy cập tài liệu XMLTV. Hãy thử lại khi chắc chắn rằng tài liệu này tồn tại.", + "ErrorAddingTunerDevice": "Có lỗi xảy ra khi thêm vào thiết bị bắt sóng này. Hãy thử lại khi chắc chắn rằng nó có thể truy cập.", + "ErrorAddingMediaPathToVirtualFolder": "Có lỗi xảy ra khi thêm đường dẫn này. Hãy chắc chắn rằng đường dẫn này đúng và máy chủ Jellyfin có quyền truy cập dữ liệu ở đường dẫn đó.", + "ErrorAddingListingsToSchedulesDirect": "Có lỗi xảy ra khi thêm danh sách này vào tài khoản Schedules Direct của bạn. Schedules Direct chỉ cho phép một số lượng danh sách nhất định mỗi tài khoản. Bạn có thể cần phải đăng nhập vào trang web của Schedules Direct và xoá những danh sách khác trước khi có thể thêm danh sách mới.", + "Episodes": "Tập", + "Episode": "Tập", + "EndsAtValue": "Kết thúc tại {0}", + "Ended": "Đã kết thúc", + "EnableThemeVideosHelp": "Phát nền những video chủ đề khi lướt qua thư viện nội dung.", + "EnableThemeVideos": "Video chủ đề", + "EnableThemeSongsHelp": "Phát những bài hát chủ đề khi lướt qua thư viện nội dung.", + "EnableThemeSongs": "Nhạc chủ đề", + "EnableStreamLoopingHelp": "Cho phép tính năng này nếu live streams chỉ dài một vài giây và cần được lặp lại liên tục. Bật tính năng này khi không cần thiết có thể gây ra nhiều vấn đề khác.", + "EnableStreamLooping": "Tự động phát lại live streams", + "EnablePhotosHelp": "Hình ảnh sẽ được nhận diện và hiển thị bên cạnh những nội dung media.", + "EnablePhotos": "Hiển thị hình ảnh", + "EnableNextVideoInfoOverlayHelp": "Khi ở phần cuối video, hiển thị thông tin về video tiếp theo trong danh sách phát hiện tại.", + "EnableNextVideoInfoOverlay": "Hiển thị thông tin video tiếp theo ở phần cuối video", + "EnableHardwareEncoding": "Sử dụng phần cứng để hỗ trợ chuyển mã", + "EnableExternalVideoPlayersHelp": "Phần mềm phát video từ thiết bị sẽ được hiển thị khi bắt đầu phát video.", + "EnableExternalVideoPlayers": "Sử dụng phần mềm phát video từ thiết bị", + "EnableDisplayMirroring": "Cho phép trình chiếu trên thiết bị khác", + "HeaderProfileInformation": "Thông Tin Hồ Sơ", + "HeaderProfile": "Hồ Sơ", + "HeaderPreferredMetadataLanguage": "Ngôn Ngữ Thông Tin Bổ Trợ Yêu Thích", + "HeaderPluginInstallation": "Cài Đặt Plugin", + "HeaderPleaseSignIn": "Hãy đăng nhập", + "HeaderPlaybackError": "Lỗi Phát Sóng", + "HeaderPlayback": "Phát Nội Dung", + "HeaderPlayOn": "Phát Trên", + "HeaderPlayAll": "Phát Tất Cả", + "HeaderPinCodeReset": "Đặt Lại Mã PIN", + "HeaderPhotoAlbums": "Album Ảnh", + "HeaderPeople": "Nhân Vật", + "HeaderPendingInvitations": "Những Lời Mời Đang Chờ", + "HeaderPaths": "Đường Dẫn", + "HeaderPasswordReset": "Đặt Lại Mật Khẩu", + "HeaderPassword": "Mật Khẩu", + "HeaderParentalRatings": "Đánh Giá Của Phụ Huynh", + "HeaderOtherItems": "Những Mục Khác", + "HeaderOnNow": "Phát Sóng Hiện Tại", + "HeaderNextVideoPlayingInValue": "Video Tiếp Theo Sẽ Phát trong {0}", + "HeaderNextUp": "Tiếp Theo", + "HeaderNextEpisodePlayingInValue": "Tập Tiếp Theo Sẽ Được Chạy trong {0}", + "HeaderNewDevices": "Thiết Bị Mới", + "HeaderNewApiKey": "Mã API Mới", + "HeaderNavigation": "Điều Hướng", + "HeaderMyMediaSmall": "Nội Dung Của Tôi (cỡ nhỏ)", + "HeaderMyMedia": "Nội Dung Của Tôi", + "HeaderMyDevice": "Thiết Bị Của Tôi", + "HeaderMusicVideos": "Video Âm Nhạc", + "HeaderMusicQuality": "Chất Lượng Âm Nhạc", + "HeaderMovies": "Phim", + "HeaderMoreLikeThis": "Nội Dung Tương Tự", + "HeaderMetadataSettings": "Cài Đặt Dữ Liệu Bổ Trợ", + "HeaderMediaInfo": "Thông Tin Nội Dung", + "HeaderMediaFolders": "Thư Mục Chứa Nội Dung", + "HeaderMedia": "Nội Dung", + "HeaderLoginFailure": "Đăng Nhập Không Thành Công", + "HeaderLiveTvTunerSetup": "Cài Đặt Bộ Bắt Sóng TV", + "HeaderLiveTv": "Truyền Hình Trực Tiếp", + "HeaderLiveTV": "Truyền Hình Trực Tiếp", + "HeaderLibrarySettings": "Cài Đặt Thư Viện", + "HeaderLibraryOrder": "Thứ Tự Thư Viện", + "HeaderLibraryFolders": "Thư Mục Của Thư Viện", + "HeaderLibraryAccess": "Truy Cập Thư Viện", + "HeaderLibraries": "Thư Viện", + "HeaderLatestRecordings": "Bản Ghi Âm/Ghi Hình Mới Nhất", + "HeaderLatestMusic": "Âm Nhạc Mới Nhất", + "HeaderLatestMedia": "Nội Dung Mới Nhất", + "HeaderKodiMetadataHelp": "Để bật hoặc tắt dữ liệu từ NFO, hãy chỉnh sửa thư viện trong phần cài đặt thư viện của Jellyfin và điều chỉnh phần lưu trữ dữ liệu bổ trợ.", + "HeaderKeepSeries": "Lưu Series", + "HeaderKeepRecording": "Tiếp Tục Ghi Âm/Ghi Hình", + "HeaderItems": "Mục", + "HeaderInstantMix": "Trộn Lẫn Nhanh", + "HeaderInstall": "Cài Đặt", + "HeaderImageSettings": "Thiết Lập Hình Ảnh", + "HeaderImageOptions": "Tuỳ Chọn Hình Ảnh", + "HeaderIdentifyItemHelp": "Hãy nhập một hoặc nhiều điều kiện tìm kiếm. Xoá điều kiện để tăng số lượng kết quả tìm kiếm.", + "HeaderIdentificationHeader": "Thông Tin Nhận Biết Trong Phần Đầu", + "HeaderIdentificationCriteriaHelp": "Nhập vào ít nhật một thông tin nhận biết.", + "HeaderIdentification": "Thông Tin Nhận Biết", + "HeaderHttpHeaders": "HTTP Headers", + "HeaderHome": "Trang Chủ", + "HeaderGuideProviders": "Nhà Cung Cấp Lịch Phát Sóng TV", + "HeaderGenres": "Thể Loại", + "HeaderForgotPassword": "Quên Mật Khẩu", + "HeaderForKids": "Dành Cho Trẻ Em", + "HeaderFilters": "Bộ Lọc", + "HeaderFetcherSettings": "Cài Đặt Chương Trình Tải Xuống", + "HeaderFetchImages": "Tải Hình Ảnh:", + "HeaderFeatures": "Nổi Bật", + "HeaderFavoritePeople": "Nhân Vật Yêu Thích", + "HeaderFavoriteAlbums": "Album Yêu Thích", + "HeaderFavoriteBooks": "Sách Yêu Thích", + "HeaderFavoriteVideos": "Video Yêu Thích", + "HeaderFavoriteSongs": "Bài Hát Yêu Thích", + "HeaderFavoriteArtists": "Nghệ Sĩ Yêu Thích", + "HeaderFavoriteEpisodes": "Tập Phim Yêu Thích", + "HeaderFavoriteShows": "Chương Trình Yêu Thích", + "HeaderFavoriteMovies": "Phim Yêu Thích", + "HeaderExternalIds": "Mã Định Danh Từ Bên Ngoài:", + "HeaderError": "Lỗi", + "HeaderEpisodes": "Tập", + "HeaderEnabledFieldsHelp": "Bỏ chọn một mục để khoá lựa chọn đó và không để nó thay đổi.", + "HeaderEnabledFields": "Những Mục Được Kích Hoạt", + "HeaderEditImages": "Chỉnh Sửa Hình Ảnh", + "HeaderEasyPinCode": "Mã PIN Đơn Giản", + "HeaderDownloadSync": "Tải Xuống Và Đồng Bộ", + "HeaderDisplay": "Hiển Thị", + "HeaderDirectPlayProfileHelp": "Thêm thiết lập phát trực tiếp để chỉ ra những định dạng mà thiết bị có thể phát trực tiếp mà không cần chuyển mã.", + "HeaderDirectPlayProfile": "Thiết Lập Phát Trực Tiếp", + "HeaderDevices": "Thiết Bị", + "HeaderDeviceAccess": "Truy Cập Thiết Bị", + "HeaderDeveloperInfo": "Thông Tin Nhà Phát Triển", + "HeaderDetectMyDevices": "Tìm Kiếm Những Thiết Bị Của Tôi", + "HeaderDeleteTaskTrigger": "Xoá Kích Hoạt Tác Vụ", + "HeaderDeleteProvider": "Xoá Nhà Cung Cấp", + "HeaderDeleteItems": "Xoá Những Mục Này", + "HeaderDeleteItem": "Xoá Mục Này", + "HeaderDeleteDevice": "Xoá Thiết Bị", + "HeaderDefaultRecordingSettings": "Thiết Lập Ghi Âm/Ghi Hình Mặc Định", + "HeaderRecordingOptions": "Tuỳ Chọn Ghi Âm/Ghi Hình", + "HeaderProfileServerSettingsHelp": "Những thông tin này về máy chủ Jellyfin sẽ hiển thị trên các thiết bị phát được kết nối.", + "HeaderSettings": "Cài Đặt", + "HeaderServerSettings": "Cài Đặt Máy Chủ", + "HeaderSeriesStatus": "Trạng Thái Series", + "HeaderSeriesOptions": "Tuỳ Chọn Series", + "HeaderSendMessage": "Gửi Tin Nhắn", + "HeaderSelectTranscodingPathHelp": "Hãy chọn đường dẫn để lưu tạm những tập tin chuyển mã. Máy chủ phải có quyền ghi trên thư mục đó.", + "HeaderSelectTranscodingPath": "Chọn Đường Dẫn Chuyển Mã", + "HeaderSelectServerCachePathHelp": "Hãy chọn đường dẫn để lưu tập tin ghi tạm cho máy chủ. Máy chủ phải có quyền ghi trên thư mục đó.", + "HeaderSelectServerCachePath": "Chọn Đường Dẫn Ghi Tạm Cho Máy Chủ", + "HeaderSelectServer": "Chọn Máy Chủ", + "HeaderSelectPath": "Chọn Đường Dẫn", + "HeaderSelectMetadataPathHelp": "Hãy chọn đường dẫn mà bạn muốn lưu thông tin bổ trợ. Máy chủ phải có quyền ghi trên thư mục đó.", + "HeaderSelectMetadataPath": "Chọn Đường Dẫn Thông Tin Bổ Trợ", + "HeaderSelectCertificatePath": "Chọn Đường Dẫn Đến Chứng Chỉ", + "HeaderSecondsValue": "{0} Giây", + "HeaderSeasons": "Phần", + "HeaderSchedule": "Lịch Phát Sóng", + "HeaderScenes": "Phân Cảnh", + "HeaderRunningTasks": "Những Tác Vụ Hoạt Động", + "HeaderRevisionHistory": "Lịch Sử Chỉnh Sửa", + "HeaderRestartingServer": "Đang Khởi Động Lại Máy Chủ", + "HeaderRestart": "Khởi Động Lại", + "HeaderResponseProfileHelp": "Hồ sơ phản hồi là phương thức tuỳ chỉnh thông tin gửi về thiết bị phát khi phát một số nội dung nhất định.", + "HeaderResponseProfile": "Hồ Sơ Phản Hồi", + "HeaderRemoveMediaLocation": "Xoá Đường Dẫn Nội Dung", + "HeaderRemoveMediaFolder": "Xoá Thư Mục Nội Dung", + "HeaderRemoteControl": "Điều Khiển Từ Xa", + "HeaderRecordingPostProcessing": "Xử Lý Sau Khi Ghi Âm/Ghi Hình", + "HeaderSortOrder": "Thứ tự Sắp xếp", + "HeaderSortBy": "Sắp xếp theo", + "HeaderStartNow": "Bắt đầu", + "HeaderSetupLibrary": "Thiết lập thư viện nội dung của bạn", + "HeaderTracks": "Bài Hát", + "HeaderThisUserIsCurrentlyDisabled": "Người dùng này hiện tại đang bị khoá", + "HeaderTaskTriggers": "Kích Hoạt Tác Vụ", + "HeaderTags": "Nhãn", + "HeaderSubtitleProfilesHelp": "Hồ sơ phụ đề chỉ ra những định dạng phụ đề được hỗ trợ bởi thiết bị phát.", + "HeaderSubtitleProfiles": "Hồ Sơ Phụ Đề", + "HeaderSubtitleProfile": "Hồ Sơ Phụ Đề", + "HeaderSubtitleDownloads": "Tải Phụ Đề", + "HeaderSubtitleAppearance": "Giao Diện Phụ Đề", + "HeaderStopRecording": "Ngừng Ghi Hình/Ghi Âm", + "HeaderSpecialFeatures": "Những Phần Đặc Biệt Nổi Bật", + "HeaderSpecialEpisodeInfo": "Thông Tin Tập Đặc Biệt", + "HeaderShutdown": "Tắt Máy Chủ", + "LabelCustomDeviceDisplayNameHelp": "Cung cấp một tên hiển thị riêng hoặc bỏ trống để sử dụng tên có sẵn của thiết bị.", + "LabelCustomDeviceDisplayName": "Tên hiển thị:", + "LabelCustomCssHelp": "Áp dụng tuỳ chỉnh riêng của bạn vào giao diện trang web.", + "LabelCustomCss": "CSS tuỳ chọn:", + "LabelCustomCertificatePathHelp": "Đường dẫn đến tập tin PKCS #12 chứa chứng chỉ (certificate) và khoá riêng (private key) để bật tính năng TLS trên một tên miền tuỳ chọn.", + "LabelCustomCertificatePath": "Đường dẫn đến chứng chỉ SSL:", + "LabelCriticRating": "Đánh giá phê bình:", + "LabelCorruptedFrames": "Những khung hình bị lỗi:", + "LabelContentType": "Loại nội dung:", + "LabelCommunityRating": "Đánh giá của cộng đồng:", + "LabelCollection": "Bộ Sưu Tập:", + "LabelChannels": "Kênh:", + "LabelCertificatePasswordHelp": "Nếu chứng chỉ của bạn cần mật khẩu, hãy nhập nó ở đây.", + "LabelCertificatePassword": "Mật khẩu chứng chỉ:", + "LabelCancelled": "Đã Huỷ", + "LabelCachePathHelp": "Chọn một đường dẫn cho những tập tin lưu tạm như là hình ảnh. Bỏ trống để sử dụng cài đặt mặc định của máy chủ.", + "LabelCachePath": "Đường dẫn cache:", + "LabelCache": "Cache:", + "LabelBurnSubtitles": "Nhúng phụ đề:", + "LabelBlockContentWithTags": "Chặn những mục có nhãn:", + "LabelBlastMessageIntervalHelp": "Xác định thời gian tồn tại giữa các tin nhắn (tính bằng giây).", + "LabelBlastMessageInterval": "Thời gian tồn tại của tin nhắn (giây)", + "LabelBitrate": "Bitrate:", + "LabelBirthYear": "Năm sinh:", + "LabelBirthDate": "Ngày sinh:", + "LabelBindToLocalNetworkAddressHelp": "Không bắt buộc. Cài đặt đè địa chỉ IP nội bộ để kết nối đến máy chủ HTTP. Nếu bỏ trống, máy chủ sẽ cài đặt vào toàn bộ những địa chỉ nội bộ có sẵn. Nếu thay đổi tuỳ chọn này, cần phải khởi động lại máy chủ Jellyfin để có tác dụng.", + "LabelBindToLocalNetworkAddress": "Cài đặt vào địa chỉ nội bộ:", + "LabelAutomaticallyRefreshInternetMetadataEvery": "Tự động cập nhật dữ liệu bổ trợ từ Internet:", + "LabelAuthProvider": "Nhà Cung Cấp Xác Thực:", + "LabelAudioSampleRate": "Sample rate âm thanh:", + "LabelAudioCodec": "Bộ giải mã âm thanh:", + "LabelAudioChannels": "Các kênh âm thanh:", + "LabelAudioBitrate": "Bitrate của âm thanh:", + "LabelAudioBitDepth": "Chiều sâu của âm thanh:", + "LabelAudio": "Âm Thanh", + "LabelArtistsHelp": "Sử dụng dấu ; để tách rời nhiều nghệ", + "LabelArtists": "Nghệ sĩ:", + "LabelAppNameExample": "Ví dụ: Sickbeard, Sonarr", + "LabelAppName": "Tên ứng dụng", + "LabelAllowedRemoteAddressesMode": "Chế độ bộ lọc địa chỉ IP từ xa:", + "LabelAllowedRemoteAddresses": "Bộ lọc địa chỉ IP từ xa:", + "LabelAllowServerAutoRestartHelp": "Máy chủ chỉ khởi động lại trong thời gian rỗi khi không có người dùng đang sử dụng.", + "LabelAllowHWTranscoding": "Cho phép chuyển mã bằng phần cứng", + "LabelAll": "Tất Cả", + "LabelAlbumArtists": "Nghệ sĩ album:", + "LabelAlbumArtPN": "Bìa album PN:", + "LabelAlbumArtMaxWidthHelp": "Độ phân giải cao nhất của bìa album thông qua upnp:albumArtURI.", + "LabelAlbumArtMaxWidth": "Chiều ngang lớn nhất của bìa album:", + "LabelAlbumArtMaxHeightHelp": "Độ phân giải cao nhất của bìa album thông qua upnp:albumArtURI.", + "LabelAlbumArtMaxHeight": "Chiều cao lớn nhất của bìa album:", + "LabelAlbumArtHelp": "PN được sử dụng cho bìa album, trong dlna:profileID thuộc tính upnp:albumArtURI. Một vài thiết bị phát cần một giá trị đặc biệt, không ảnh hưởng đến kích thước của hình ảnh.", + "LabelAlbum": "Album:", + "LabelAirsBeforeSeason": "Phát sóng trước mùa:", + "LabelAirsBeforeEpisode": "Phát sóng trước tập:", + "LabelAirsAfterSeason": "Phát sóng sau mùa:", + "LabelAirTime": "Thời gian phát sóng:", + "LabelAirDays": "Ngày phát sóng:", + "LabelAccessStart": "Thời gian bắt đầu:", + "LabelAccessEnd": "Thời gian kết thúc:", + "LabelAccessDay": "Ngày trong tuần:", + "LabelAbortedByServerShutdown": "(Đã huỷ bởi máy chủ ngừng hoạt động)", + "Label3DFormat": "Định dạng 3D:", + "Kids": "Trẻ Em", + "Items": "Mục", + "ItemCount": "{0} mục", + "InstantMix": "Trộn Lẫn Nhanh", + "InstallingPackage": "Đang cài đặt {0} (phiên bản {1})", + "ImportMissingEpisodesHelp": "Nếu bật tuỳ chọn này, thông tin bị thiếu trong các tập phim sẽ được nhập vào cơ sở dữ liệu của máy chủ Jellyfin và hiển thị trong các phần và series. Điều này có thể làm việc quét thư viện lâu hơn rất nhiều.", + "ImportFavoriteChannelsHelp": "Nếu bật tuỳ chọn này, chỉ những kênh yêu thích trong thiết bị bắt sóng sẽ được nhập vào.", + "Images": "Hình Ảnh", + "Identify": "Nhận Dạng", + "HttpsRequiresCert": "Để bật kết nối bảo mật, bạn cần phải cung cấp một Chứng Chỉ SSL đáng tin cậy, ví dụ như \"Let's Encrypt\". Hãy cung cấp Chứng Chỉ SSL hoặc là tắt tính năng kết nối bảo mật.", + "Horizontal": "Nằm Ngang", + "Home": "Trang Chủ", + "HideWatchedContentFromLatestMedia": "Ẩn những nội dung đã xem khỏi phần nội dung mới nhất", + "Hide": "Ẩn", + "Help": "Trợ Giúp", + "HeadersFolders": "Thư Mục", + "HeaderYears": "Năm", + "HeaderXmlSettings": "Cài Đặt XML", + "HeaderXmlDocumentAttributes": "Những Thuộc Tính Tài Liệu XML", + "HeaderXmlDocumentAttribute": "Thuộc Tính Tài Liệu XML", + "HeaderVideos": "Videos", + "HeaderVideoTypes": "Kiểu Video", + "HeaderVideoType": "Kiểu Video", + "HeaderVideoQuality": "Chất Lượng Video", + "HeaderUser": "Người Dùng", + "HeaderUploadImage": "Tải Lên Hình Ảnh", + "HeaderUpcomingOnTV": "Sắp Phát Sóng Trên TV", + "HeaderTypeText": "Nhập nội dung", + "HeaderTypeImageFetchers": "{0} Trình Tải Hình Ảnh", + "HeaderTuners": "Bộ Điều Khiển Thu Phát Sóng", + "HeaderTunerDevices": "Thiết Bị Bắt Sóng", + "HeaderTranscodingProfileHelp": "Thêm hồ sơ chuyển mã để chỉ ra những định dạng nên dùng khi cần chuyển mã.", + "HeaderTranscodingProfile": "Hồ Sơ Chuyển Mã", + "LabelEnableAutomaticPortMap": "Kích hoạt tính năng tự động kết nối các port", + "LabelEmbedAlbumArtDidlHelp": "Một vài thiết bị ưu tiên phương pháp này để tải bìa album. Một số thiết bị khác có thể không phát được nếu tuỳ chọn này được kích hoạt.", + "LabelEmbedAlbumArtDidl": "Bìa album trong Didl", + "LabelEasyPinCode": "Mã PIN đơn giản:", + "LabelDynamicExternalId": "{0} Id:", + "LabelDropShadow": "Đổ bóng:", + "LabelDroppedFrames": "Những khung hình bị loại bỏ:", + "LabelDropImageHere": "Kéo thả hình ảnh vào đây, hoặc click để lựa chọn hình ảnh.", + "LabelDownloadLanguages": "Ngôn ngữ tải xuống:", + "LabelDownMixAudioScaleHelp": "Tăng cường âm lượng khi trộn âm thanh. Giá trị bằng 1 sẽ giữ nguyên âm lượng gốc.", + "LabelDownMixAudioScale": "Tăng cường âm lượng khi trộn âm thanh:", + "LabelDisplaySpecialsWithinSeasons": "Hiển thị những tập đặc biệt trong phần mà nó được phát sóng", + "LabelDisplayOrder": "Thứ tự hiển thị:", + "LabelDisplayName": "Tên hiển thị:", + "LabelDisplayMode": "Chế độ hiển thị:", + "LabelDisplayMissingEpisodesWithinSeasons": "Hiển thị những tập bị thiếu", + "LabelDisplayLanguageHelp": "Dự án chuyển ngữ Jellyfin là một dự án diễn ra ra liên tục.", + "LabelDisplayLanguage": "Ngôn ngữ hiển thị:", + "LabelDiscNumber": "Đĩa số:", + "LabelDidlMode": "Chế độ DIDL:", + "LabelDeviceDescription": "Mô tả thiết bị", + "LabelDeinterlaceMethod": "Phương pháp khử xen kẽ:", + "LabelDefaultUserHelp": "Xác định thư viện được hiển thị trên những thiết bị đã kết nối. Tuỳ chọn này có thể được ghi đè trên hồ sơ của từng thiết bị.", + "LabelDefaultUser": "Người dùng mặc định:", + "LabelDefaultScreen": "Màn hình mặc định:", + "LabelDeathDate": "Ngày mất:", + "LabelDateTimeLocale": "Ngày giờ địa phương:", + "LabelDateAddedBehaviorHelp": "Nếu có giá trị dữ liệu bổ trợ, nó sẽ luôn được sử dụng trước một trong các tùy chọn này.", + "LabelDateAddedBehavior": "Ngày thêm hành vi cho nội dung mới:", + "LabelDateAdded": "Ngày thêm vào:", + "LabelDashboardTheme": "Chủ đề bảng điều khiển máy chủ:", + "LabelCustomRating": "Đánh giá tuỳ chọn:", + "HeaderFavoritePlaylists": "Danh Sách Phát Yêu Thích", + "ApiKeysCaption": "Danh sách các mã API đang hoạt động" } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index fd0afb77a..41eb27c9b 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1506,5 +1506,10 @@ "LabelLibraryPageSize": "媒体库分页阈值:", "LabelLibraryPageSizeHelp": "设置媒体库页面每页要显示的最多媒体个数。设置为 0 以禁用分页。", "UnsupportedPlayback": "Jellyfin无法解密被DRM保护的内容,但仍然会尝试播放包括受保护内容在内的所有内容。某些文件由于被加密或包含不受支持的特性(如互动标题),在播放时可能显示为黑屏。", - "MessageUnauthorizedUser": "您目前无权访问服务器。更多有关信息,请与服务器管理员联系。" + "MessageUnauthorizedUser": "您目前无权访问服务器。更多有关信息,请与服务器管理员联系。", + "Filter": "过滤", + "New": "新的", + "HeaderFavoritePlaylists": "收藏的播放列表", + "ButtonTogglePlaylist": "播放列表", + "ButtonToggleContextMenu": "更多" } diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index f5020837f..4c7645226 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -212,7 +212,7 @@ "OptionMissingEpisode": "缺少了的單元", "OptionMonday": "星期一", "OptionNameSort": "名字", - "OptionNew": "新增...", + "OptionNew": "新增…", "OptionOnAppStartup": "在伺服器啟動", "OptionOnInterval": "每時段", "OptionParentalRating": "家長評級", @@ -1678,5 +1678,10 @@ "DeinterlaceMethodHelp": "選擇對隔行掃描內容進行轉碼時所用的反交錯方法。", "BoxSet": "套裝", "UnsupportedPlayback": "Jellyfin 無法解密受 DRM 保護的內容,但仍然會嘗試播放所有內容。某些檔案由於被加密或包含如互動標題等不受支援的內容,在播放時可能會沒有畫面。", - "MessageUnauthorizedUser": "您目前無權存取伺服器,請與您的伺服器管理員聯繫以獲取更多訊息。" + "MessageUnauthorizedUser": "您目前無權存取伺服器,請與您的伺服器管理員聯繫以獲取更多訊息。", + "Filter": "篩選器", + "New": "新增", + "ApiKeysCaption": "目前已啟用的API金鑰列表", + "ButtonTogglePlaylist": "播放清單", + "ButtonToggleContextMenu": "更多" } diff --git a/src/tv.html b/src/tv.html index 9a47c6fa8..ceb5c51b4 100644 --- a/src/tv.html +++ b/src/tv.html @@ -3,9 +3,9 @@
- - - + + +
@@ -59,9 +59,9 @@
- - - + + +
diff --git a/src/useredit.html b/src/useredit.html index 0de3069dc..253387b4a 100644 --- a/src/useredit.html +++ b/src/useredit.html @@ -6,7 +6,7 @@ diff --git a/src/userlibraryaccess.html b/src/userlibraryaccess.html index 4653fd07e..8a6177585 100644 --- a/src/userlibraryaccess.html +++ b/src/userlibraryaccess.html @@ -6,7 +6,7 @@ diff --git a/src/usernew.html b/src/usernew.html index bca1e72fe..fac036aa8 100644 --- a/src/usernew.html +++ b/src/usernew.html @@ -5,7 +5,7 @@

${HeaderAddUser}

- ${Help} + ${Help}
diff --git a/src/userparentalcontrol.html b/src/userparentalcontrol.html index 4cb5708db..2c13ec801 100644 --- a/src/userparentalcontrol.html +++ b/src/userparentalcontrol.html @@ -4,7 +4,7 @@ @@ -31,7 +31,7 @@

${LabelBlockContentWithTags}

@@ -41,7 +41,7 @@

${HeaderAccessSchedule}

diff --git a/src/userpassword.html b/src/userpassword.html index f38e39599..119a0212d 100644 --- a/src/userpassword.html +++ b/src/userpassword.html @@ -4,7 +4,7 @@ diff --git a/src/userprofiles.html b/src/userprofiles.html index 022e06b95..98237645d 100644 --- a/src/userprofiles.html +++ b/src/userprofiles.html @@ -6,9 +6,9 @@

${HeaderUsers}

- ${Help} + ${Help}
diff --git a/src/videoosd.html b/src/videoosd.html index c200360c0..452c8a9af 100644 --- a/src/videoosd.html +++ b/src/videoosd.html @@ -8,7 +8,7 @@

- autorenew + ${FetchingData}
@@ -25,47 +25,47 @@
@@ -76,7 +76,7 @@
diff --git a/src/wizardfinish.html b/src/wizardfinish.html index d3a0c4a83..4d54a10cd 100644 --- a/src/wizardfinish.html +++ b/src/wizardfinish.html @@ -5,11 +5,11 @@

${WizardCompleted}

diff --git a/src/wizardlibrary.html b/src/wizardlibrary.html index 4fad65658..3a5ca5069 100644 --- a/src/wizardlibrary.html +++ b/src/wizardlibrary.html @@ -3,7 +3,7 @@

${HeaderSetupLibrary}

- +

@@ -11,12 +11,12 @@
diff --git a/src/wizardremoteaccess.html b/src/wizardremoteaccess.html index c7ddfb7e8..f7ce47dc9 100644 --- a/src/wizardremoteaccess.html +++ b/src/wizardremoteaccess.html @@ -21,12 +21,12 @@
diff --git a/src/wizardsettings.html b/src/wizardsettings.html index f75391947..d4f537cf9 100644 --- a/src/wizardsettings.html +++ b/src/wizardsettings.html @@ -16,12 +16,12 @@
diff --git a/src/wizardstart.html b/src/wizardstart.html index 615feb3b0..05e282bee 100644 --- a/src/wizardstart.html +++ b/src/wizardstart.html @@ -4,7 +4,7 @@

${WelcomeToProject}

- + ${ButtonQuickStartGuide}
@@ -20,7 +20,7 @@
diff --git a/src/wizarduser.html b/src/wizarduser.html index 90f492b0f..3ce0b3ba7 100644 --- a/src/wizarduser.html +++ b/src/wizarduser.html @@ -22,12 +22,12 @@
diff --git a/webpack.common.js b/webpack.common.js index 5d6345683..03beb63a7 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -1,37 +1,37 @@ -const path = require("path"); +const path = require('path'); -const CopyPlugin = require("copy-webpack-plugin"); +const CopyPlugin = require('copy-webpack-plugin'); const Assets = [ - "alameda/alameda.js", - "native-promise-only/npo.js", - "libass-wasm/dist/js/subtitles-octopus-worker.js", - "libass-wasm/dist/js/subtitles-octopus-worker.data", - "libass-wasm/dist/js/subtitles-octopus-worker.wasm", - "libass-wasm/dist/js/subtitles-octopus-worker-legacy.js", - "libass-wasm/dist/js/subtitles-octopus-worker-legacy.data", - "libass-wasm/dist/js/subtitles-octopus-worker-legacy.js.mem" + 'alameda/alameda.js', + 'native-promise-only/npo.js', + 'libass-wasm/dist/js/subtitles-octopus-worker.js', + 'libass-wasm/dist/js/subtitles-octopus-worker.data', + 'libass-wasm/dist/js/subtitles-octopus-worker.wasm', + 'libass-wasm/dist/js/subtitles-octopus-worker-legacy.js', + 'libass-wasm/dist/js/subtitles-octopus-worker-legacy.data', + 'libass-wasm/dist/js/subtitles-octopus-worker-legacy.js.mem' ]; module.exports = { - context: path.resolve(__dirname, "src"), - entry: "./bundle.js", + context: path.resolve(__dirname, 'src'), + entry: './bundle.js', resolve: { modules: [ - path.resolve(__dirname, "node_modules") + path.resolve(__dirname, 'node_modules') ] }, output: { - filename: "bundle.js", - path: path.resolve(__dirname, "dist"), - libraryTarget: "amd-require" + filename: 'bundle.js', + path: path.resolve(__dirname, 'dist'), + libraryTarget: 'amd-require' }, plugins: [ new CopyPlugin( Assets.map(asset => { return { from: path.resolve(__dirname, `./node_modules/${asset}`), - to: path.resolve(__dirname, "./dist/libraries") + to: path.resolve(__dirname, './dist/libraries') }; }) ) diff --git a/webpack.dev.js b/webpack.dev.js index 78bdb5486..716cfb2d0 100644 --- a/webpack.dev.js +++ b/webpack.dev.js @@ -1,29 +1,46 @@ -const path = require("path"); -const common = require("./webpack.common"); -const merge = require("webpack-merge"); +const path = require('path'); +const common = require('./webpack.common'); +const merge = require('webpack-merge'); +const packageConfig = require('./package.json'); module.exports = merge(common, { - mode: "development", + mode: 'development', output: { - filename: "bundle.js", - path: path.resolve(__dirname, "dist"), - libraryTarget: "amd-require" + filename: 'bundle.js', + path: path.resolve(__dirname, 'dist'), + libraryTarget: 'amd-require' }, - devtool: '#inline-source-map', + devtool: 'inline-source-map', module: { rules: [ { test: /\.js$/, - exclude: /node_modules[\\/](?!query-string)/, - loader: "babel-loader" + exclude: /node_modules[\\/](?!jellyfin-apiclient|query-string|split-on-first|strict-uri-encode)/, + use: { + loader: 'babel-loader', + options: { + presets: packageConfig.babel.presets + } + } }, { test: /\.css$/i, - use: ["style-loader", "css-loader", "postcss-loader"] + use: [ + 'style-loader', + 'css-loader', + { + loader: 'postcss-loader', + options: { + config: { + path: __dirname + } + } + } + ] }, { test: /\.(png|jpg|gif)$/i, - use: ["file-loader"] + use: ['file-loader'] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, diff --git a/webpack.prod.js b/webpack.prod.js index c2d5e9791..eb39f82cd 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -1,22 +1,39 @@ -const common = require("./webpack.common"); -const merge = require("webpack-merge"); +const common = require('./webpack.common'); +const merge = require('webpack-merge'); +const packageConfig = require('./package.json'); module.exports = merge(common, { - mode: "production", + mode: 'production', module: { rules: [ { test: /\.js$/, - exclude: /node_modules[\\/](?!query-string)/, - loader: "babel-loader" + exclude: /node_modules[\\/](?!jellyfin-apiclient|query-string|split-on-first|strict-uri-encode)/, + use: { + loader: 'babel-loader', + options: { + presets: packageConfig.babel.presets + } + } }, { test: /\.css$/i, - use: ["style-loader", "css-loader", "postcss-loader"] + use: [ + 'style-loader', + 'css-loader', + { + loader: 'postcss-loader', + options: { + config: { + path: __dirname + } + } + } + ] }, { test: /\.(png|jpg|gif)$/i, - use: ["file-loader"] + use: ['file-loader'] }, { test: /\.(woff|woff2|eot|ttf|otf)$/, diff --git a/yarn.lock b/yarn.lock index 47485dd25..28182ae1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,28 +9,28 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" - integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== +"@babel/compat-data@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b" + integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g== dependencies: - browserslist "^4.9.1" + browserslist "^4.11.1" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@>=7.2.2", "@babel/core@^7.8.6": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== +"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" + integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" + "@babel/generator" "^7.9.6" "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" + "@babel/helpers" "^7.9.6" + "@babel/parser" "^7.9.6" "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -40,12 +40,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.3.tgz#7c8b2956c6f68b3ab732bd16305916fbba521d94" - integrity sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ== +"@babel/generator@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" + integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== dependencies: - "@babel/types" "^7.9.0" + "@babel/types" "^7.9.6" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -65,13 +65,13 @@ "@babel/helper-explode-assignable-expression" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-compilation-targets@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" - integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== +"@babel/helper-compilation-targets@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a" + integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw== dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.9.1" + "@babel/compat-data" "^7.9.6" + browserslist "^4.11.1" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" @@ -102,14 +102,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== +"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== dependencies: "@babel/helper-get-function-arity" "^7.8.3" "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.9.5" "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" @@ -183,14 +183,14 @@ "@babel/types" "^7.8.3" "@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" + integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== dependencies: "@babel/helper-member-expression-to-functions" "^7.8.3" "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" "@babel/helper-simple-access@^7.8.3": version "7.8.3" @@ -207,10 +207,10 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== "@babel/helper-wrap-function@^7.8.3": version "7.8.3" @@ -222,14 +222,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== +"@babel/helpers@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" + integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw== dependencies: "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" "@babel/highlight@^7.8.3": version "7.9.0" @@ -240,10 +240,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.3.tgz#043a5fc2ad8b7ea9facddc4e802a1f0f25da7255" - integrity sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A== +"@babel/parser@^7.8.6", "@babel/parser@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" + integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.8.3" @@ -286,13 +286,14 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" - integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== +"@babel/plugin-proposal-object-rest-spread@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63" + integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-proposal-optional-catch-binding@^7.8.3": version "7.8.3" @@ -412,14 +413,14 @@ "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" - integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== +"@babel/plugin-transform-classes@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.6" @@ -433,10 +434,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" - integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -492,34 +493,34 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.8.3", "@babel/plugin-transform-modules-amd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" - integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== +"@babel/plugin-transform-modules-amd@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e" + integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw== dependencies: "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== +"@babel/plugin-transform-modules-commonjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277" + integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ== dependencies: "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" - integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== +"@babel/plugin-transform-modules-systemjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4" + integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg== dependencies: "@babel/helper-hoist-variables" "^7.8.3" "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-umd@^7.9.0": version "7.9.0" @@ -551,10 +552,10 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.3" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" - integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== +"@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== dependencies: "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -634,12 +635,12 @@ regenerator-runtime "^0.13.4" "@babel/preset-env@^7.8.6": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" - integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6" + integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ== dependencies: - "@babel/compat-data" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" + "@babel/compat-data" "^7.9.6" + "@babel/helper-compilation-targets" "^7.9.6" "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-proposal-async-generator-functions" "^7.8.3" @@ -647,7 +648,7 @@ "@babel/plugin-proposal-json-strings" "^7.8.3" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.0" + "@babel/plugin-proposal-object-rest-spread" "^7.9.6" "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining" "^7.9.0" "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" @@ -664,9 +665,9 @@ "@babel/plugin-transform-async-to-generator" "^7.8.3" "@babel/plugin-transform-block-scoped-functions" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.0" + "@babel/plugin-transform-classes" "^7.9.5" "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" "@babel/plugin-transform-dotall-regex" "^7.8.3" "@babel/plugin-transform-duplicate-keys" "^7.8.3" "@babel/plugin-transform-exponentiation-operator" "^7.8.3" @@ -674,14 +675,14 @@ "@babel/plugin-transform-function-name" "^7.8.3" "@babel/plugin-transform-literals" "^7.8.3" "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-modules-commonjs" "^7.9.0" - "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-amd" "^7.9.6" + "@babel/plugin-transform-modules-commonjs" "^7.9.6" + "@babel/plugin-transform-modules-systemjs" "^7.9.6" "@babel/plugin-transform-modules-umd" "^7.9.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" "@babel/plugin-transform-new-target" "^7.8.3" "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-transform-property-literals" "^7.8.3" "@babel/plugin-transform-regenerator" "^7.8.7" "@babel/plugin-transform-reserved-words" "^7.8.3" @@ -692,8 +693,8 @@ "@babel/plugin-transform-typeof-symbol" "^7.8.4" "@babel/plugin-transform-unicode-regex" "^7.8.3" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.0" - browserslist "^4.9.1" + "@babel/types" "^7.9.6" + browserslist "^4.11.1" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" @@ -710,10 +711,10 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" - integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== +"@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" + integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ== dependencies: regenerator-runtime "^0.13.4" @@ -726,27 +727,27 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" - integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== +"@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" + integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-function-name" "^7.8.3" + "@babel/generator" "^7.9.6" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== +"@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" + integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== dependencies: - "@babel/helper-validator-identifier" "^7.9.0" + "@babel/helper-validator-identifier" "^7.9.5" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -813,6 +814,21 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow== +"@stylelint/postcss-css-in-js@^0.37.1": + version "0.37.1" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.1.tgz#41e5e7660f73d88227610e18c6ebb262d56ac125" + integrity sha512-UMf2Rni3JGKi3ZwYRGMYJ5ipOA5ENJSKMtYA/pE1ZLURwdh7B5+z2r73RmWvub+N0UuH1Lo+TGfCgYwPvqpXNw== + dependencies: + "@babel/core" ">=7.9.0" + +"@stylelint/postcss-markdown@^0.36.1": + version "0.36.1" + resolved "https://registry.yarnpkg.com/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz#829b87e6c0f108014533d9d7b987dc9efb6632e8" + integrity sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw== + dependencies: + remark "^12.0.0" + unist-util-find-all-after "^3.0.1" + "@types/anymatch@*": version "1.3.1" resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" @@ -837,6 +853,11 @@ "@types/minimatch" "*" "@types/node" "*" +"@types/html-minifier-terser@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#551a4589b6ee2cc9c1dff08056128aec29b94880" + integrity sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -848,9 +869,9 @@ integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= "@types/node@*": - version "13.9.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.3.tgz#6356df2647de9eac569f9a52eda3480fa9e70b4d" - integrity sha512-01s+ac4qerwd6RHD+mVbOEsraDHSgUaefQlEdBbUolnQFjKwCr7luvAlEwW1RFojh67u0z4OUTjPn9LEl4zIkA== + version "13.13.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.4.tgz#1581d6c16e3d4803eb079c87d4ac893ee7501c2c" + integrity sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -872,15 +893,15 @@ resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== -"@types/tapable@*": +"@types/tapable@*", "@types/tapable@^1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.5.tgz#9adbc12950582aa65ead76bffdf39fe0c27a3c02" integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ== "@types/uglify-js@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.4.tgz#96beae23df6f561862a830b4288a49e86baac082" - integrity sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ== + version "3.9.0" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.0.tgz#4490a140ca82aa855ad68093829e7fd6ae94ea87" + integrity sha512-3ZcoyPYHVOCcLpnfZwD47KFLr8W/mpUcgjpf1M4Q78TMJIw7KMAHSjiCLJp1z3ZrBR9pTLbe191O0TldFK5zcw== dependencies: source-map "^0.6.1" @@ -914,10 +935,10 @@ "@types/source-list-map" "*" source-map "^0.6.1" -"@types/webpack@^4.4.31": - version "4.41.8" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.8.tgz#d2244f5f612ee30230a5c8c4ae678bce90d27277" - integrity sha512-mh4litLHTlDG84TGCFv1pZldndI34vkrW9Mks++Zx4KET7DRMoCXUvLbTISiuF4++fMgNnhV9cc1nCXJQyBYbQ== +"@types/webpack@^4.4.31", "@types/webpack@^4.41.8": + version "4.41.12" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.12.tgz#0386ee2a2814368e2f2397abb036c0bf173ff6c3" + integrity sha512-BpCtM4NnBen6W+KEhrL9jKuZCXVtiH6+0b6cxdvNt2EwU949Al334PjQSl2BeAyvAX9mgoNNG21wvjP3xZJJ5w== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -1104,7 +1125,7 @@ acorn@5.X, acorn@^5.0.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -acorn@^6.2.1: +acorn@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== @@ -1138,9 +1159,9 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: - version "6.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" - integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -1540,20 +1561,7 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.7.4: - version "9.7.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376" - integrity sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg== - dependencies: - browserslist "^4.11.0" - caniuse-lite "^1.0.30001036" - chalk "^2.4.2" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.27" - postcss-value-parser "^4.0.3" - -autoprefixer@^9.7.6: +autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.7.6: version "9.7.6" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4" integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ== @@ -1595,10 +1603,10 @@ babel-loader@^8.0.6: pify "^4.0.1" schema-utils "^2.6.5" -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" @@ -1973,7 +1981,7 @@ browserslist@^1.1.3: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.4, browserslist@^4.8.3, browserslist@^4.9.1: +browserslist@^4.0.0, browserslist@^4.6.4: version "4.11.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.0.tgz#aef4357b10a8abda00f97aac7cd587b2082ba1ad" integrity sha512-WqEC7Yr5wUH5sg6ruR++v2SGOQYpyUdYYd4tZoAq1F7y+QXoLoYGXVbxhtaIqWmAJjtNTRjVD3HuJc1OXTel2A== @@ -1983,7 +1991,7 @@ browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.6.4, browserslist@^4. node-releases "^1.1.52" pkg-up "^3.1.0" -browserslist@^4.11.1: +browserslist@^4.11.1, browserslist@^4.8.2, browserslist@^4.8.5: version "4.12.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== @@ -1993,16 +2001,6 @@ browserslist@^4.11.1: node-releases "^1.1.53" pkg-up "^2.0.0" -browserslist@^4.8.2: - version "4.11.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b" - integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g== - dependencies: - caniuse-lite "^1.0.30001038" - electron-to-chromium "^1.3.390" - node-releases "^1.1.53" - pkg-up "^2.0.0" - bs-recipes@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" @@ -2066,9 +2064,9 @@ buffer@^4.3.0: isarray "^1.0.0" buffer@^5.2.1: - version "5.5.0" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.5.0.tgz#9c3caa3d623c33dd1c7ef584b89b88bf9c9bc1ce" - integrity sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww== + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" @@ -2204,10 +2202,10 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" -camelcase-keys@^6.1.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.1.tgz#cd3e2d2d7db767aa3f247e4c2df93b4661008945" - integrity sha512-BPCNVH56RVIxQQIXskp5tLQXUNGQ6sXr7iCv1FHDt81xBOQ/1r6H8SPxf19InVP6DexWar4s87q9thfuk8X9HA== +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: camelcase "^5.3.1" map-obj "^4.0.0" @@ -2253,21 +2251,16 @@ caniuse-db@^1.0.30001017: resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001039.tgz#b5e8c3bb07a144341644729fa2a5eb2c0deaf47d" integrity sha512-XVk5KMAi8/DI28tQXKuq1PDyuPoD9Ypnda3ctF04TlB+LYIb+bgHq0ZDfNOn0+4cwLENJC0093Vuf0dhkjXQ7Q== -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001036: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001043: + version "1.0.30001050" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001050.tgz#11218af4b6b85dc1089536f31e10e3181e849e71" + integrity sha512-OvGZqalCwmapci76ISq5q4kuAskb1ebqF3FEQBv1LE1kWht0pojlDDqzFlmk5jgYkuZN7MNZ1n+ULwe/7MaDNQ== + +caniuse-lite@^1.0.30001035: version "1.0.30001036" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001036.tgz#930ea5272010d8bf190d859159d757c0b398caf0" integrity sha512-jU8CIFIj2oR7r4W+5AKcsvWNVIb6Q6OZE3UsrXrZBHFtreT4YgTeOJtTucp+zSedEpTi3L5wASSP0LYIE3if6w== -caniuse-lite@^1.0.30001038: - version "1.0.30001039" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz#b3814a1c38ffeb23567f8323500c09526a577bbe" - integrity sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q== - -caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001043: - version "1.0.30001046" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001046.tgz#7a06d3e8fd8aa7f4d21c9a2e313f35f2d06b013e" - integrity sha512-CsGjBRYWG6FvgbyGy+hBbaezpwiqIOLkxQPY4A4Ea49g1eNsnQuESB+n4QM0BKii1j80MyJ26Ir5ywTQkbRE4g== - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -2316,6 +2309,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + character-entities-html4@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.4.tgz#0e64b0a3753ddbf1fdc044c5fd01d0199a02e125" @@ -2341,7 +2342,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.4, chokidar@^2.1.8: +chokidar@^2.0.0, chokidar@^2.0.4, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== @@ -2422,9 +2423,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== cliui@^3.2.0: version "3.2.0" @@ -2435,15 +2436,6 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -2822,11 +2814,11 @@ copy-webpack-plugin@^5.1.1: webpack-log "^2.0.0" core-js-compat@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== dependencies: - browserslist "^4.8.3" + browserslist "^4.8.5" semver "7.0.0" core-js@^2.6.5: @@ -2834,10 +2826,10 @@ core-js@^2.6.5: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== -core-js@^3.6.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== +core-js@^3.6.5: + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2970,22 +2962,23 @@ css-has-pseudo@^0.10.0: postcss-selector-parser "^5.0.0-rc.4" css-loader@^3.4.2: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" - integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + version "3.5.3" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.3.tgz#95ac16468e1adcd95c844729e0bb167639eb0bcf" + integrity sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw== dependencies: camelcase "^5.3.1" cssesc "^3.0.0" icss-utils "^4.1.1" loader-utils "^1.2.3" normalize-path "^3.0.0" - postcss "^7.0.23" + postcss "^7.0.27" postcss-modules-extract-imports "^2.0.0" postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.1.1" + postcss-modules-scope "^2.2.0" postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.2" - schema-utils "^2.6.0" + postcss-value-parser "^4.0.3" + schema-utils "^2.6.6" + semver "^6.3.0" css-prefers-color-scheme@^3.1.1: version "3.1.1" @@ -3027,6 +3020,14 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" +css-tree@1.0.0-alpha.39: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz#2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb" + integrity sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA== + dependencies: + mdn-data "2.0.6" + source-map "^0.6.1" + css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" @@ -3131,11 +3132,11 @@ cssnano@^4.1.10: postcss "^7.0.0" csso@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.2.tgz#e5f81ab3a56b8eefb7f0092ce7279329f454de3d" - integrity sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz#0d9985dc852c7cc2b2cacfbbe1079014d1a8e903" + integrity sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ== dependencies: - css-tree "1.0.0-alpha.37" + css-tree "1.0.0-alpha.39" currently-unhandled@^0.4.1: version "0.4.1" @@ -3164,10 +3165,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-fns@^2.11.1: - version "2.11.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.1.tgz#197b8be1bbf5c5e6fe8bea817f0fe111820e7a12" - integrity sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w== +date-fns@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.13.0.tgz#d7b8a0a2d392e8d88a8024d0a46b980bbfdbd708" + integrity sha512-xm0c61mevGF7f0XpCGtDTGpzEFC/1fpLXHbmFpxZZQJuvByIK2ozm6cSYuU+nxFYOPh2EuCfzUwlTEFwKG+h5w== dateformat@^2.0.0: version "2.2.0" @@ -3276,9 +3277,9 @@ decompress-unzip@^4.0.1: yauzl "^2.4.2" decompress@^4.0.0, decompress@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.0.tgz#7aedd85427e5a92dacfe55674a7c505e96d01f9d" - integrity sha1-eu3YVCflqS2s/lVnSnxQXpbQH50= + version "4.2.1" + resolved "https://registry.yarnpkg.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118" + integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ== dependencies: decompress-tar "^4.0.0" decompress-tarbz2 "^4.0.0" @@ -3685,20 +3686,15 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.380: - version "1.3.382" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.382.tgz#cad02da655c33f7a3d6ca7525bd35c17e90f3a8f" - integrity sha512-gJfxOcgnBlXhfnUUObsq3n3ReU8CT6S8je97HndYRkKsNZMJJ38zO/pI5aqO7L3Myfq+E3pqPyKK/ynyLEQfBA== +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.413: + version "1.3.427" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.427.tgz#ea43d02908a8c71f47ebb46e09de5a3cf8236f04" + integrity sha512-/rG5G7Opcw68/Yrb4qYkz07h3bESVRJjUl4X/FrKLXzoUJleKm6D7K7rTTz8V5LUWnd+BbTOyxJX2XprRqHD8A== -electron-to-chromium@^1.3.390: - version "1.3.397" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz#db640c2e67b08d590a504c20b56904537aa2bafa" - integrity sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A== - -electron-to-chromium@^1.3.413: - version "1.3.418" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.418.tgz#840021191f466b803a873e154113620c9f53cec6" - integrity sha512-i2QrQtHes5fK/F9QGG5XacM5WKEuR322fxTYF9e8O9Gu0mc0WmjjwGpV8c7Htso6Zf2Di18lc3SIPxmMeRFBug== +electron-to-chromium@^1.3.380: + version "1.3.430" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.430.tgz#33914f7c2db771bdcf30977bd4fd6258ee8a2f37" + integrity sha512-HMDYkANGhx6vfbqpOf/hc6hWEmiOipOHGDeRDeUb3HLD3XIWpvKQxFgWf0tgHcr3aNv6I/8VPecplqmQsXoZSw== elliptic@^6.0.0: version "6.5.2" @@ -3768,9 +3764,9 @@ engine.io-client@~3.2.0: yeast "0.1.2" engine.io-client@~3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.0.tgz#82a642b42862a9b3f7a188f41776b2deab643700" - integrity sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA== + version "3.4.1" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.1.tgz#922ddb47eecdcb541136a93aeead24718fd05461" + integrity sha512-RJNmA+A9Js+8Aoq815xpGAsgWH1VoSYM//2VgIiu9lNOaHFfLpTjH4tOzktBpjIs5lvOfiNY1dwf+NuU6D38Mw== dependencies: component-emitter "1.2.1" component-inherit "0.0.3" @@ -3860,7 +3856,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: +es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: version "1.17.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== @@ -4088,11 +4084,11 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" - integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^5.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -4106,10 +4102,10 @@ estraverse@^4.1.0, estraverse@^4.1.1: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" - integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== esutils@^2.0.2: version "2.0.3" @@ -4403,14 +4399,14 @@ fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fast-text-encoding@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.1.tgz#4a428566f74fc55ebdd447555b1eb4d9cf514455" - integrity sha512-x4FEgaz3zNRtJfLFqJmHWxkMDDvXVtaznj2V9jiP8ACUJrUgist4bP9FmDL2Vew2Y9mEQI/tG4GqabaitYp9CQ== + version "1.0.2" + resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.2.tgz#ff1ad5677bde049e0f8656aa6083a7ef2c5836e2" + integrity sha512-5rQdinSsycpzvAoHga2EDn+LRX1d5xLFsuNG0Kg61JrAT/tASXcLL0nf/33v+sAxlQcfYmWbTURa1mmAf55jGw== fastq@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.1.tgz#4570c74f2ded173e71cf0beb08ac70bb85826791" - integrity sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw== + version "1.7.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801" + integrity sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ== dependencies: reusify "^1.0.4" @@ -4436,9 +4432,9 @@ fd-slicer@~1.1.0: pend "~1.2.0" figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== figures@^1.3.5: version "1.7.0" @@ -4666,9 +4662,9 @@ flat-cache@^2.0.1: write "1.0.3" flatted@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" - integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== flatten@^1.0.2: version "1.0.3" @@ -4699,9 +4695,9 @@ follow-redirects@1.5.10: debug "=3.1.0" follow-redirects@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb" - integrity sha512-4eyLK6s6lH32nOvLLwlIOnr9zrL8Sm+OvW4pVTJNoXeGzYIkHVf+pADQi+OJ0E67hiuSLezPVPyBcIZO50TmmQ== + version "1.11.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb" + integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA== dependencies: debug "^3.0.0" @@ -5143,13 +5139,20 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" -gonzales-pe@^4.2.3, gonzales-pe@^4.2.4: +gonzales-pe@^4.2.3: version "4.2.4" resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.4.tgz#356ae36a312c46fe0f1026dd6cb539039f8500d2" integrity sha512-v0Ts/8IsSbh9n1OJRnSfa7Nlxi4AkXIsWB6vPept8FDbL4bXn3FNuxjYtO/nmBGu7GDkL9MFeGebeSu6l55EPQ== dependencies: minimist "1.1.x" +gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== + dependencies: + minimist "^1.2.5" + got@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" @@ -5194,9 +5197,9 @@ got@^8.3.1: url-to-options "^1.0.1" graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== "graceful-readlink@>= 1.0.0": version "1.0.1" @@ -5334,12 +5337,12 @@ gulp-postcss@^8.0.0: vinyl-sourcemaps-apply "^0.2.1" gulp-sass@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.0.2.tgz#cfb1e3eff2bd9852431c7ce87f43880807d8d505" - integrity sha512-q8psj4+aDrblJMMtRxihNBdovfzGrXJp1l4JU0Sz4b/Mhsi2DPrKFYCGDwjIWRENs04ELVHxdOJQ7Vs98OFohg== + version "4.1.0" + resolved "https://registry.yarnpkg.com/gulp-sass/-/gulp-sass-4.1.0.tgz#486d7443c32d42bf31a6b1573ebbdaa361de7427" + integrity sha512-xIiwp9nkBLcJDpmYHbEHdoWZv+j+WtYaKD6Zil/67F3nrAaZtWYN5mDwerdo7EvcdBenSAj7Xb2hx2DqURLGdA== dependencies: chalk "^2.3.0" - lodash.clonedeep "^4.3.2" + lodash "^4.17.11" node-sass "^4.8.3" plugin-error "^1.0.1" replace-ext "^1.0.0" @@ -5416,9 +5419,9 @@ gulplog@^1.0.0: glogg "^1.0.0" handle-thing@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" - integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== har-schema@^2.0.0: version "2.0.0" @@ -5433,7 +5436,7 @@ har-validator@~5.1.3: ajv "^6.5.5" har-schema "^2.0.0" -hard-rejection@^2.0.0: +hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== @@ -5540,12 +5543,13 @@ has@^1.0.0, has@^1.0.3: function-bind "^1.1.1" hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -5629,15 +5633,15 @@ html-comment-regex@^1.1.0, html-comment-regex@^1.1.2: resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== -html-entities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= +html-entities@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== html-minifier-terser@^5.0.1: - version "5.0.5" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.5.tgz#8f12f639789f04faa9f5cf2ff9b9f65607f21f8b" - integrity sha512-cBSFFghQh/uHcfSiL42KxxIRMF7A144+3E44xdlctIjxEmkEfCvouxNyFH2wysXk1fCGBPwtcr3hDWlGTfkDew== + version "5.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#95d3df037f04835e9d1a09d1767c0e361a7de916" + integrity sha512-tiYE76O1zunboByeB/nFGwUEb263Z3nkNv6Lz2oLC1s6M36bLKfTrjQ+7ssVfaucVllE+N7hh/FbpbxvnIA+LQ== dependencies: camel-case "^4.1.1" clean-css "^4.2.3" @@ -5670,11 +5674,14 @@ html-tags@^3.1.0: resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== -html-webpack-plugin@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.2.tgz#c96a48d0ee53d33dcc909d6b65ad28f3d627efd4" - integrity sha512-dCyjg2dEBf0Azni2byDcwfk5l5XKNEnA3OU4cejovqkKGc4ZixC6Aw6+U2sAG/ellHIjoiQhyU4oKMO6fQFaYA== +html-webpack-plugin@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz#53bf8f6d696c4637d5b656d3d9863d89ce8174fd" + integrity sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w== dependencies: + "@types/html-minifier-terser" "^5.0.0" + "@types/tapable" "^1.0.5" + "@types/webpack" "^4.41.8" html-minifier-terser "^5.0.1" loader-utils "^1.2.3" lodash "^4.17.15" @@ -5972,7 +5979,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6024,10 +6031,10 @@ interpret@1.2.0, interpret@^1.1.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== -intersection-observer@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.7.0.tgz#ee16bee978db53516ead2f0a8154b09b400bbdc9" - integrity sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg== +intersection-observer@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.10.0.tgz#4d11d63c1ff67e21e62987be24d55218da1a1a69" + integrity sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ== into-stream@^3.1.0: version "3.1.0" @@ -6197,7 +6204,7 @@ is-date-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== -is-decimal@^1.0.0: +is-decimal@^1.0.0, is-decimal@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== @@ -6368,6 +6375,11 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -6380,10 +6392,10 @@ is-png@^2.0.0: resolved "https://registry.yarnpkg.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d" integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g== -is-promise@^2.1, is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= +is-promise@^2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== is-regex@^1.0.4, is-regex@^1.0.5: version "1.0.5" @@ -6542,14 +6554,19 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -"jellyfin-noto@https://github.com/jellyfin/jellyfin-noto": - version "1.0.2" - resolved "https://github.com/jellyfin/jellyfin-noto#a441b179c833288fc372cadb408d32a76c5479f1" +jellyfin-apiclient@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jellyfin-apiclient/-/jellyfin-apiclient-1.1.1.tgz#9b9e6e2f827d221ef000eb3dac09dda7623a6a06" + integrity sha512-ga+LAVxRu9LvnNI1gx53iZTvN/4VnwAdUOUX5xfq+3KJXeg8rWcPg4sdArR7efZeN9Cs60diKwDw8Y+RlnYmHA== -jquery@>=1.9.1, jquery@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.4.1.tgz#714f1f8d9dde4bdfa55764ba37ef214630d80ef2" - integrity sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw== +"jellyfin-noto@https://github.com/jellyfin/jellyfin-noto": + version "1.0.3" + resolved "https://github.com/jellyfin/jellyfin-noto#b784602db063734c721a46563ae5d6577ec2b35d" + +jquery@>=1.9.1, jquery@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== js-base64@^2.1.8, js-base64@^2.1.9: version "2.5.2" @@ -6627,9 +6644,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.2.tgz#43ef1f0af9835dd624751a6b7fa48874fb2d608e" - integrity sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== dependencies: minimist "^1.2.5" @@ -6781,9 +6798,9 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -"libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf-cordova": +"libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf-smarttv": version "4.0.0" - resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#b38056588bfaebc18a8353cb1757de0a815ac879" + resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#58e9a3f1a7f7883556ee002545f445a430120639" liftoff@^3.1.0: version "3.1.0" @@ -6960,11 +6977,6 @@ lodash.clone@^4.3.2: resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= -lodash.clonedeep@^4.3.2: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.escape@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" @@ -7088,10 +7100,10 @@ logalot@^2.0.0, logalot@^2.1.0: figures "^1.3.5" squeak "^1.0.0" -loglevel@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== +loglevel@^1.6.8: + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== longest-streak@^2.0.1: version "2.0.4" @@ -7188,9 +7200,9 @@ make-dir@^2.0.0: semver "^5.6.0" make-dir@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" @@ -7245,6 +7257,13 @@ markdown-table@^1.1.0: resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== +markdown-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== + dependencies: + repeat-string "^1.0.0" + matchdep@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" @@ -7281,10 +7300,17 @@ mdast-util-compact@^1.0.0: dependencies: unist-util-visit "^1.1.0" +mdast-util-compact@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz#cabc69a2f43103628326f35b1acf735d55c99490" + integrity sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA== + dependencies: + unist-util-visit "^2.0.0" + mdn-browser-compat-data@^1.0.3: - version "1.0.16" - resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.16.tgz#64f79c50d730108390205ed16e781e702ee1e16d" - integrity sha512-g3bkROyUKH5avfQ2Ou2ejtyfGNe7++Axv89+czZuS5EetQsvM1Cw8P/zDoq3SpE72tIrhhVJ74901q15J2Hm4A== + version "1.0.19" + resolved "https://registry.yarnpkg.com/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.19.tgz#f4542aea7bce4231c95c5bdab04f999298b58903" + integrity sha512-S1i9iILAsFi/C17NADg2cBT6D6Xcd5Ub+GSMQa5ScLhuVyUrRKjCNmFEED9mQ2G/lrKtvU9SGUrpPpXB8SXhCg== dependencies: extend "3.0.2" @@ -7293,6 +7319,11 @@ mdn-data@2.0.4: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +mdn-data@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz#852dc60fcaa5daa2e8cf6c9189c440ed3e042978" + integrity sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -7368,22 +7399,22 @@ meow@^5.0.0: trim-newlines "^2.0.0" yargs-parser "^10.0.0" -meow@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.0.tgz#4ff4641818d3502afcddc631f94cb6971a581cb3" - integrity sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg== +meow@^6.1.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-6.1.1.tgz#1ad64c4b76b2a24dfb2f635fddcadf320d251467" + integrity sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg== dependencies: "@types/minimist" "^1.2.0" - camelcase-keys "^6.1.1" + camelcase-keys "^6.2.2" decamelize-keys "^1.1.0" - hard-rejection "^2.0.0" - minimist-options "^4.0.1" + hard-rejection "^2.1.0" + minimist-options "^4.0.2" normalize-package-data "^2.5.0" - read-pkg-up "^7.0.0" + read-pkg-up "^7.0.1" redent "^3.0.0" trim-newlines "^3.0.0" - type-fest "^0.8.1" - yargs-parser "^18.1.1" + type-fest "^0.13.1" + yargs-parser "^18.1.3" merge-descriptors@1.0.1: version "1.0.1" @@ -7440,17 +7471,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.43.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@1.44.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== dependencies: - mime-db "1.43.0" + mime-db "1.44.0" mime@1.4.1: version "1.4.1" @@ -7463,9 +7494,9 @@ mime@1.6.0: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + version "2.4.5" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.5.tgz#d8de2ecb92982dedbb6541c9b6841d7f218ea009" + integrity sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w== mimic-fn@^2.0.0, mimic-fn@^2.1.0: version "2.1.0" @@ -7507,7 +7538,7 @@ minimist-options@^3.0.1: arrify "^1.0.1" is-plain-obj "^1.1.0" -minimist-options@^4.0.1: +minimist-options@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.0.2.tgz#29c4021373ded40d546186725e57761e4b1984a7" integrity sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w== @@ -7555,9 +7586,9 @@ mixin-deep@^1.2.0: is-extendable "^1.0.1" "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" - integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" @@ -7628,9 +7659,9 @@ mute-stream@0.0.8: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1, nan@^2.13.2: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== nanomatch@^1.2.9: version "1.2.13" @@ -7752,21 +7783,42 @@ node-libs-browser@^2.2.1: vm-browserify "^1.0.1" node-releases@^1.1.52: - version "1.1.52" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.52.tgz#bcffee3e0a758e92e44ecfaecd0a47554b0bcba9" - integrity sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ== - dependencies: - semver "^6.3.0" + version "1.1.55" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.55.tgz#8af23b7c561d8e2e6e36a46637bab84633b07cee" + integrity sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w== node-releases@^1.1.53: version "1.1.53" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== -node-sass@^4.13.1, node-sass@^4.8.3: - version "4.13.1" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.13.1.tgz#9db5689696bb2eec2c32b98bfea4c7a2e992d0a3" - integrity sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw== +node-sass@^4.13.1: + version "4.14.1" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" + integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g== + dependencies: + async-foreach "^0.1.3" + chalk "^1.1.1" + cross-spawn "^3.0.0" + gaze "^1.0.0" + get-stdin "^4.0.1" + glob "^7.0.3" + in-publish "^2.0.0" + lodash "^4.17.15" + meow "^3.7.0" + mkdirp "^0.5.1" + nan "^2.13.2" + node-gyp "^3.8.0" + npmlog "^4.0.0" + request "^2.88.0" + sass-graph "2.2.5" + stdout-stream "^1.4.0" + "true-case-path" "^1.0.2" + +node-sass@^4.8.3: + version "4.14.0" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.0.tgz#a8e9d7720f8e15b4a1072719dcf04006f5648eeb" + integrity sha512-AxqU+DFpk0lEz95sI6jO0hU0Rwyw7BXVEv6o9OItoXLyeygPeaSpiV4rwQb10JiTghHaa0gZeD21sz+OsQluaw== dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -7923,9 +7975,12 @@ object-inspect@^1.7.0: integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== object-is@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -8114,7 +8169,7 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" -os-locale@^3.0.0, os-locale@^3.1.0: +os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== @@ -8188,9 +8243,9 @@ p-limit@^1.1.0: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -8275,10 +8330,10 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -page@^1.11.5: - version "1.11.5" - resolved "https://registry.yarnpkg.com/page/-/page-1.11.5.tgz#0cfc8608be337f26f4377f31df0787aef0ca1af7" - integrity sha512-0JXUHc7Y8p1cPJQbhZSwaKO3p+bU3Rgny+OM5gJMKHWHvJKan/fsE5RUzEjRQolv9DzPOSVWfSOHz0lLxK19eA== +page@^1.11.6: + version "1.11.6" + resolved "https://registry.yarnpkg.com/page/-/page-1.11.6.tgz#5ef4efc7073749b8085ccdaa0dcd7c9e0de12fe3" + integrity sha512-P6e2JfzkBrPeFCIPplLP7vDDiU84RUUZMrWdsH4ZBGJ8OosnwFkcUkBHp1DTIjuipLliw9yQn/ZJsXZvarsO+g== dependencies: path-to-regexp "~1.2.1" @@ -8342,6 +8397,18 @@ parse-entities@^1.0.2, parse-entities@^1.1.0: is-decimal "^1.0.0" is-hexadecimal "^1.0.0" +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + parse-filepath@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" @@ -8622,10 +8689,10 @@ plur@^3.0.1: dependencies: irregular-plurals "^2.0.0" -portfinder@^1.0.25: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== +portfinder@^1.0.26: + version "1.0.26" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" + integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== dependencies: async "^2.6.2" debug "^3.1.1" @@ -8848,7 +8915,7 @@ postcss-initial@^3.0.0: lodash.template "^4.5.0" postcss "^7.0.2" -postcss-jsx@^0.36.0, postcss-jsx@^0.36.4: +postcss-jsx@^0.36.0: version "0.36.4" resolved "https://registry.yarnpkg.com/postcss-jsx/-/postcss-jsx-0.36.4.tgz#37a68f300a39e5748d547f19a747b3257240bd50" integrity sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA== @@ -8995,7 +9062,7 @@ postcss-modules-local-by-default@^3.0.2: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.0" -postcss-modules-scope@^2.1.1: +postcss-modules-scope@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== @@ -9233,7 +9300,7 @@ postcss-resolve-nested-selector@^0.1.1: resolved "https://registry.yarnpkg.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= -postcss-safe-parser@^4.0.0, postcss-safe-parser@^4.0.1: +postcss-safe-parser@^4.0.0, postcss-safe-parser@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== @@ -9248,12 +9315,12 @@ postcss-sass@^0.3.5: gonzales-pe "^4.2.3" postcss "^7.0.1" -postcss-sass@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.2.tgz#7d1f8ddf6960d329de28fb3ff43c9c42013646bc" - integrity sha512-hcRgnd91OQ6Ot9R90PE/khUDCJHG8Uxxd3F7Y0+9VHjBiJgNv7sK5FxyHMCBtoLmmkzVbSj3M3OlqUfLJpq0CQ== +postcss-sass@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3" + integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg== dependencies: - gonzales-pe "^4.2.4" + gonzales-pe "^4.3.0" postcss "^7.0.21" postcss-scss@^2.0.0: @@ -9361,9 +9428,9 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0: integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" - integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: version "2.0.1" @@ -9384,10 +9451,10 @@ postcss@^5.0.0, postcss@^5.0.18: source-map "^0.5.6" supports-color "^3.2.3" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: - version "7.0.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" - integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6, postcss@^7.0.7: + version "7.0.28" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.28.tgz#d349ced7743475717ba91f6810efb58c51fb5dbb" + integrity sha512-YU6nVhyWIsVtlNlnAj1fHTsUKW5qxm3KEgzq2Jj6KTEFOTK8QWR12eIDvrlWhiSTK8WIBFTBhOJV4DY6dUuEbw== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -9475,9 +9542,9 @@ pseudomap@^1.0.2: integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== public-encrypt@^4.0.0: version "4.0.3" @@ -9561,9 +9628,9 @@ query-string@^5.0.1: strict-uri-encode "^1.0.0" query-string@^6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.11.1.tgz#ab021f275d463ce1b61e88f0ce6988b3e8fe7c2c" - integrity sha512-1ZvJOUl8ifkkBxu2ByVM/8GijMIPx+cef7u3yroO3Ogm4DOdZcF5dcrWTIlSHe3Pg/mtlt6/eFjObDfJureZZA== + version "6.12.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.12.1.tgz#2ae4d272db4fba267141665374e49a1de09e8a7c" + integrity sha512-OHj+zzfRMyj3rmo/6G8a5Ifvw3AleL/EbcHMD27YA31Q+cO5lfmQxECkImuNVjcskLcvBRVHNAB3w6udMs1eAA== dependencies: decode-uri-component "^0.2.0" split-on-first "^1.0.0" @@ -9665,7 +9732,7 @@ read-pkg-up@^3.0.0: find-up "^2.0.0" read-pkg "^3.0.0" -read-pkg-up@^7.0.0: +read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== @@ -9724,7 +9791,7 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@^3.0.6, readable-stream@^3.1.1: +"readable-stream@2 || 3", readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9879,6 +9946,28 @@ remark-parse@^6.0.0: vfile-location "^2.0.0" xtend "^4.0.1" +remark-parse@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.2.tgz#5999bc0b9c2e3edc038800a64ff103d0890b318b" + integrity sha512-eMI6kMRjsAGpMXXBAywJwiwAse+KNpmt+BK55Oofy4KvBZEqUDj6mWbGLJZrujoPIPPxDXzn3T9baRlpsm2jnQ== + dependencies: + ccount "^1.0.0" + collapse-white-space "^1.0.2" + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + is-word-character "^1.0.0" + markdown-escapes "^1.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + trim "0.0.1" + trim-trailing-lines "^1.0.0" + unherit "^1.0.4" + unist-util-remove-position "^2.0.0" + vfile-location "^3.0.0" + xtend "^4.0.1" + remark-stringify@^6.0.0: version "6.0.4" resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-6.0.4.tgz#16ac229d4d1593249018663c7bddf28aafc4e088" @@ -9899,6 +9988,26 @@ remark-stringify@^6.0.0: unherit "^1.0.4" xtend "^4.0.1" +remark-stringify@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-8.0.0.tgz#33423ab8bf3076fb197f4cf582aaaf866b531625" + integrity sha512-cABVYVloFH+2ZI5bdqzoOmemcz/ZuhQSH6W6ZNYnLojAUUn3xtX7u+6BpnYp35qHoGr2NFBsERV14t4vCIeW8w== + dependencies: + ccount "^1.0.0" + is-alphanumeric "^1.0.0" + is-decimal "^1.0.0" + is-whitespace-character "^1.0.0" + longest-streak "^2.0.1" + markdown-escapes "^1.0.0" + markdown-table "^2.0.0" + mdast-util-compact "^2.0.0" + parse-entities "^2.0.0" + repeat-string "^1.5.4" + state-toggle "^1.0.0" + stringify-entities "^3.0.0" + unherit "^1.0.4" + xtend "^4.0.1" + remark@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/remark/-/remark-10.0.1.tgz#3058076dc41781bf505d8978c291485fe47667df" @@ -9908,6 +10017,15 @@ remark@^10.0.1: remark-stringify "^6.0.0" unified "^7.0.0" +remark@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/remark/-/remark-12.0.0.tgz#d1c145c07341c9232f93b2f8539d56da15a2548c" + integrity sha512-oX4lMIS0csgk8AEbzY0h2jdR0ngiCHOpwwpxjmRa5TqAkeknY+tkhjRJGZqnCmvyuWh55/0SW5WY3R3nn3PH9A== + dependencies: + remark-parse "^8.0.0" + remark-stringify "^8.0.0" + unified "^9.0.0" + remove-bom-buffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" @@ -9946,7 +10064,7 @@ repeat-element@^1.1.2: resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== -repeat-string@^1.5.4, repeat-string@^1.6.1: +repeat-string@^1.0.0, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -9963,11 +10081,16 @@ replace-ext@0.0.1: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" integrity sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ= -replace-ext@1.0.0, replace-ext@^1.0.0: +replace-ext@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= +replace-ext@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a" + integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw== + replace-homedir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" @@ -10071,9 +10194,9 @@ resolve-url@^0.2.1: integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.4.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" @@ -10155,11 +10278,9 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: inherits "^2.0.1" run-async@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== - dependencies: - is-promise "^2.1.0" + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-parallel@^1.1.9: version "1.1.9" @@ -10186,9 +10307,9 @@ rxjs@^5.5.6: symbol-observable "1.0.1" rxjs@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" - integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q== + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== dependencies: tslib "^1.9.0" @@ -10197,7 +10318,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -10214,10 +10335,20 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sass-graph@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" + integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag== + dependencies: + glob "^7.0.0" + lodash "^4.0.0" + scss-tokenizer "^0.2.3" + yargs "^13.3.2" + sass-graph@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= + version "2.2.6" + resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.6.tgz#09fda0e4287480e3e4967b72a2d133ba09b8d827" + integrity sha512-MKuEYXFSGuRSi8FZ3A7imN1CeVn9Gpw0/SFJKdL1ejXJneI9a5rwlEZrKejhEFAA3O6yr3eIyl/WuvASvlT36g== dependencies: glob "^7.0.0" lodash "^4.0.0" @@ -10246,10 +10377,10 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.6.0, schema-utils@^2.6.4, schema-utils@^2.6.5: - version "2.6.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" - integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== +schema-utils@^2.6.5, schema-utils@^2.6.6: + version "2.6.6" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c" + integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA== dependencies: ajv "^6.12.0" ajv-keywords "^3.4.1" @@ -10422,9 +10553,9 @@ set-value@^2.0.0, set-value@^2.0.1: split-string "^3.0.1" set-value@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-3.0.1.tgz#52c82af7653ba69eb1db92e81f5cdb32739b9e95" - integrity sha512-w6n3GUPYAWQj4ZyHWzD7K2FnFXHx9OTwJYbWg+6nXjG8sCLfs9DGv+KlqglKIIJx+ks7MlFuwFW2RBPb+8V+xg== + version "3.0.2" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-3.0.2.tgz#74e8ecd023c33d0f77199d415409a40f21e61b90" + integrity sha512-npjkVoz+ank0zjlV9F47Fdbjfj/PfXyVhZvGALWsyIYU/qrMzpi6avjKW3/7KeSU2Df3I46BrN1xOI1+6vW0hA== dependencies: is-plain-object "^2.0.4" @@ -10451,10 +10582,10 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" -shaka-player@^2.5.10: - version "2.5.10" - resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.10.tgz#6f4e72e2433002d11824a223b02edd5004e30e2b" - integrity sha512-kS9TQL6bWODo4XNnozERZWsEiWlLZ6huspPx4ZjmMjeOBL9gwqlULLfLyO+5gA3CYV/dk9LaAi1WAEaLWckGpA== +shaka-player@^2.5.11: + version "2.5.11" + resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-2.5.11.tgz#af550a0ee3aadf7be4e64e1a4d615c8d728e0b0f" + integrity sha512-SiZd/vCUPeKXNPnfWcBdraskdUYLtm+DITWceCZvRP4eoxxQuRI0MekVJTGqu5d7B2yW9TdQh5ojyRAjbQPFGA== dependencies: eme-encryption-scheme-polyfill "^2.0.1" @@ -10471,9 +10602,9 @@ shebang-regex@^1.0.0: integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== simple-swizzle@^0.2.2: version "0.2.2" @@ -10623,13 +10754,14 @@ sockjs-client@1.4.0: json3 "^3.3.2" url-parse "^1.4.3" -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== +sockjs@0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== dependencies: faye-websocket "^0.10.0" - uuid "^3.0.1" + uuid "^3.4.0" + websocket-driver "0.6.5" sort-keys-length@^1.0.0: version "1.0.1" @@ -10674,9 +10806,9 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: urix "^0.1.0" source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -10717,9 +10849,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: version "3.0.0" @@ -10746,10 +10878,10 @@ spdy-transport@^3.0.0: readable-stream "^3.0.6" wbuf "^1.7.3" -spdy@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2" - integrity sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA== +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== dependencies: debug "^4.1.0" handle-thing "^2.0.0" @@ -10944,7 +11076,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2": version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -10970,21 +11102,39 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.trimend@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + +string.prototype.trimleft@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" + integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trimstart "^1.0.0" string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== + version "2.1.2" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" + integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg== dependencies: define-properties "^1.1.3" - function-bind "^1.1.1" + es-abstract "^1.17.5" + string.prototype.trimend "^1.0.0" + +string.prototype.trimstart@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" @@ -11015,6 +11165,17 @@ stringify-entities@^1.0.1: is-alphanumerical "^1.0.0" is-hexadecimal "^1.0.0" +stringify-entities@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-3.0.0.tgz#455abe501f8b7859ba5726a25a8872333c65b0a7" + integrity sha512-h7NJJIssprqlyjHT2eQt2W1F+MCcNmwPGlKb0bWEdET/3N44QN3QbUF/ueKCgAssyKRZ3Br9rQ7FcXjHr0qLHw== + dependencies: + character-entities-html4 "^1.0.0" + character-entities-legacy "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.2" + is-hexadecimal "^1.0.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -11092,9 +11253,9 @@ strip-indent@^3.0.0: min-indent "^1.0.0" strip-json-comments@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" + integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== strip-outer@^1.0.0: version "1.0.1" @@ -11104,12 +11265,12 @@ strip-outer@^1.0.0: escape-string-regexp "^1.0.2" style-loader@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200" - integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== dependencies: - loader-utils "^1.2.3" - schema-utils "^2.6.4" + loader-utils "^2.0.0" + schema-utils "^2.6.6" style-search@^0.1.0: version "0.1.0" @@ -11176,14 +11337,16 @@ stylelint-order@^4.0.0: postcss "^7.0.26" postcss-sorting "^5.0.1" -stylelint@^13.1.0: - version "13.2.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.2.1.tgz#9101fcd70791856530049816ff53d980ecd561df" - integrity sha512-461ZV4KpUe7pEHHgMOsH4kkjF7qsjkCIMJYOf7QQC4cvgPUJ0z4Nj+ah5fvKl1rzqBqc5EZa6P0nna4CGoJX+A== +stylelint@^13.3.3: + version "13.3.3" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.3.3.tgz#e267a628ebfc1adad6f5a1fe818724c34171402b" + integrity sha512-j8Oio2T1YNiJc6iXDaPYd74Jg4zOa1bByNm/g9/Nvnq4tDPsIjMi46jhRZyPPktGPwjJ5FwcmCqIRlH6PVP8mA== dependencies: - autoprefixer "^9.7.4" + "@stylelint/postcss-css-in-js" "^0.37.1" + "@stylelint/postcss-markdown" "^0.36.1" + autoprefixer "^9.7.6" balanced-match "^1.0.0" - chalk "^3.0.0" + chalk "^4.0.0" cosmiconfig "^6.0.0" debug "^4.1.1" execall "^2.0.0" @@ -11201,19 +11364,17 @@ stylelint@^13.1.0: lodash "^4.17.15" log-symbols "^3.0.0" mathml-tag-names "^2.1.3" - meow "^6.0.1" + meow "^6.1.0" micromatch "^4.0.2" normalize-selector "^0.2.0" postcss "^7.0.27" postcss-html "^0.36.0" - postcss-jsx "^0.36.4" postcss-less "^3.1.4" - postcss-markdown "^0.36.0" postcss-media-query-parser "^0.2.3" postcss-reporter "^6.0.1" postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^4.0.1" - postcss-sass "^0.4.2" + postcss-safe-parser "^4.0.2" + postcss-sass "^0.4.4" postcss-scss "^2.0.0" postcss-selector-parser "^6.0.2" postcss-syntax "^0.36.2" @@ -11356,9 +11517,9 @@ svgo@^1.0.0, svgo@^1.3.2: util.promisify "~1.0.0" swiper@^5.3.7: - version "5.3.7" - resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.3.7.tgz#1349c055730e9247e4482b72631166119b83f409" - integrity sha512-BFpXllmUNj1k/Uz6FRW7ykZfUfeCpfqUZxOxeTFZKYy3gv/kOWULHjwy0xlQIJdsiVGF5nZgRG2VbVl6XWy3gw== + version "5.3.8" + resolved "https://registry.yarnpkg.com/swiper/-/swiper-5.3.8.tgz#25c555d73787d35aa56418b904cb3ed4423bade8" + integrity sha512-bCxrayTgzC2bZBRuFwAx7T4exWeHqMADBpcuTQ7PNCOIIzJRPqNh4ySIvW06LEEU3Q0KncaNre4hrn+jXcWivQ== dependencies: dom7 "^2.1.3" ssr-window "^1.0.1" @@ -11444,9 +11605,9 @@ terser-webpack-plugin@^1.4.3: worker-farm "^1.7.0" terser@^4.0.0, terser@^4.1.2, terser@^4.6.3: - version "4.6.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.7.tgz#478d7f9394ec1907f0e488c5f6a6a9a2bad55e72" - integrity sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g== + version "4.6.13" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.13.tgz#e879a7364a5e0db52ba4891ecde007422c56a916" + integrity sha512-wMvqukYgVpQlymbnNbabVZbtM6PN63AzqexpwJL8tbh/mRT9LE5o+ruVduAGL7D6Fpjl+Q+06U5I9Ul82odAhw== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -11700,6 +11861,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" @@ -11767,9 +11933,9 @@ ultron@~1.1.0: integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== unbzip2-stream@^1.0.9: - version "1.3.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a" - integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg== + version "1.4.2" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.2.tgz#84eb9e783b186d8fb397515fbb656f312f1a7dbf" + integrity sha512-pZMVAofMrrHX6Ik39hCk470kulCbmZ2SWfQLPmTWqfJV/oUm0gn1CblvHdUu4+54Je6Jq34x8kY6XjTy6dMkOg== dependencies: buffer "^5.2.1" through "^2.3.8" @@ -11844,6 +12010,18 @@ unified@^7.0.0: vfile "^3.0.0" x-is-string "^0.1.0" +unified@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.0.0.tgz#12b099f97ee8b36792dbad13d278ee2f696eed1d" + integrity sha512-ssFo33gljU3PdlWLjNp15Inqb77d6JnJSfyplGJPT/a+fNRNyCBeveBAYJdO5khKdF6WVHa/yYCC7Xl6BDwZUQ== + dependencies: + bail "^1.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^2.0.0" + trough "^1.0.0" + vfile "^4.0.0" + union-value@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" @@ -11901,11 +12079,23 @@ unist-util-find-all-after@^1.0.2: dependencies: unist-util-is "^3.0.0" +unist-util-find-all-after@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz#95cc62f48812d879b4685a0512bf1b838da50e9a" + integrity sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw== + dependencies: + unist-util-is "^4.0.0" + unist-util-is@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd" integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A== +unist-util-is@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.0.2.tgz#c7d1341188aa9ce5b3cff538958de9895f14a5de" + integrity sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ== + unist-util-remove-position@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020" @@ -11913,6 +12103,13 @@ unist-util-remove-position@^1.0.0: dependencies: unist-util-visit "^1.1.0" +unist-util-remove-position@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" + integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== + dependencies: + unist-util-visit "^2.0.0" + unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6" @@ -11932,6 +12129,14 @@ unist-util-visit-parents@^2.0.0: dependencies: unist-util-is "^3.0.0" +unist-util-visit-parents@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz#d4076af3011739c71d2ce99d05de37d545f4351d" + integrity sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3" @@ -11939,6 +12144,15 @@ unist-util-visit@^1.1.0: dependencies: unist-util-visit-parents "^2.0.0" +unist-util-visit@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.2.tgz#3843782a517de3d2357b4c193b24af2d9366afb7" + integrity sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^4.0.0" + unist-util-visit-parents "^3.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -12076,7 +12290,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -12135,6 +12349,11 @@ vfile-location@^2.0.0: resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e" integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA== +vfile-location@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.0.1.tgz#d78677c3546de0f7cd977544c367266764d31bb3" + integrity sha512-yYBO06eeN/Ki6Kh1QAkgzYpWT1d3Qln+ZCtSbJqFExPl1S3y2qqotJQXoh6qEvl/jDlgpUJolBn3PItVnnZRqQ== + vfile-message@*: version "2.0.3" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.3.tgz#0dd4f6879fb240a8099b22bd3755536c92e59ba5" @@ -12150,6 +12369,14 @@ vfile-message@^1.0.0: dependencies: unist-util-stringify-position "^1.1.1" +vfile-message@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" + integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== + dependencies: + "@types/unist" "^2.0.0" + unist-util-stringify-position "^2.0.0" + vfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/vfile/-/vfile-3.0.1.tgz#47331d2abe3282424f4a4bb6acd20a44c4121803" @@ -12160,6 +12387,17 @@ vfile@^3.0.0: unist-util-stringify-position "^1.0.0" vfile-message "^1.0.0" +vfile@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/vfile/-/vfile-4.1.0.tgz#d79248957f43225d57ff67a56effc67bef08946e" + integrity sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg== + dependencies: + "@types/unist" "^2.0.0" + is-buffer "^2.0.0" + replace-ext "1.0.0" + unist-util-stringify-position "^2.0.0" + vfile-message "^2.0.0" + vinyl-fs@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" @@ -12229,12 +12467,12 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== +watchpack@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" + integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA== dependencies: - chokidar "^2.0.2" + chokidar "^2.1.8" graceful-fs "^4.1.2" neo-async "^2.5.0" @@ -12289,10 +12527,10 @@ webpack-dev-middleware@^3.7.2: range-parser "^1.2.1" webpack-log "^2.0.0" -webpack-dev-server@^3.10.3: - version "3.10.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" - integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== +webpack-dev-server@^3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -12302,31 +12540,31 @@ webpack-dev-server@^3.10.3: debug "^4.1.1" del "^4.1.1" express "^4.17.1" - html-entities "^1.2.1" + html-entities "^1.3.1" http-proxy-middleware "0.19.1" import-local "^2.0.0" internal-ip "^4.3.0" ip "^1.1.5" is-absolute-url "^3.0.3" killable "^1.0.1" - loglevel "^1.6.6" + loglevel "^1.6.8" opn "^5.5.0" p-retry "^3.0.1" - portfinder "^1.0.25" + portfinder "^1.0.26" schema-utils "^1.0.0" selfsigned "^1.10.7" semver "^6.3.0" serve-index "^1.9.1" - sockjs "0.3.19" + sockjs "0.3.20" sockjs-client "1.4.0" - spdy "^4.0.1" + spdy "^4.0.2" strip-ansi "^3.0.1" supports-color "^6.1.0" url "^0.11.0" webpack-dev-middleware "^3.7.2" webpack-log "^2.0.0" ws "^6.2.1" - yargs "12.0.5" + yargs "^13.3.2" webpack-log@^2.0.0: version "2.0.0" @@ -12367,15 +12605,15 @@ webpack-stream@^5.2.1: webpack "^4.26.1" webpack@^4.26.1, webpack@^4.41.5: - version "4.42.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef" - integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg== + version "4.43.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" + integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0" "@webassemblyjs/wasm-edit" "1.9.0" "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.2.1" + acorn "^6.4.1" ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" @@ -12392,9 +12630,16 @@ webpack@^4.26.1, webpack@^4.41.5: schema-utils "^1.0.0" tapable "^1.1.3" terser-webpack-plugin "^1.4.3" - watchpack "^1.6.0" + watchpack "^1.6.1" webpack-sources "^1.4.1" +websocket-driver@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + dependencies: + websocket-extensions ">=0.1.1" + websocket-driver@>=0.5.1: version "0.7.3" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" @@ -12547,7 +12792,7 @@ y18n@^3.2.1: resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: +y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== @@ -12563,11 +12808,11 @@ yallist@^3.0.2: integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yaml@^1.7.2: - version "1.8.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.3.tgz#2f420fca58b68ce3a332d0ca64be1d191dd3f87a" - integrity sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw== + version "1.9.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.9.2.tgz#f0cfa865f003ab707663e4f04b3956957ea564ed" + integrity sha512-HPT7cGGI0DuRcsO51qC1j9O16Dh1mZ2bnXwsi0jrSpsLz0WxOLSLXfkABVl6bZO629py3CU+OMJtpNHDLB97kg== dependencies: - "@babel/runtime" "^7.8.7" + "@babel/runtime" "^7.9.2" yargs-parser@^10.0.0: version "10.1.0" @@ -12576,15 +12821,7 @@ yargs-parser@^10.0.0: dependencies: camelcase "^4.1.0" -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^13.1.0: +yargs-parser@^13.1.0, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -12592,10 +12829,10 @@ yargs-parser@^13.1.0: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^18.1.1: - version "18.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37" - integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA== +yargs-parser@^18.1.3: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -12614,24 +12851,6 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs@12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - yargs@13.2.4: version "13.2.4" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" @@ -12688,6 +12907,22 @@ yargs@6.6.0: y18n "^3.2.1" yargs-parser "^4.2.0" +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + yargs@^7.0.0, yargs@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
${ApiKeysCaption}
${HeaderApiKey}${HeaderApp}${HeaderDateIssued}${HeaderApiKey}${HeaderApp}${HeaderDateIssued}
'; - html += '"; - html += "'; html += item.AccessToken; - html += "'; - html += item.AppName || ""; - html += "'; var date = datetime.parseISO8601Date(item.DateCreated, true); - html += datetime.toLocaleDateString(date) + " " + datetime.getDisplayTime(date); - html += "