From 7e7613d5de732bc5b59164613252b680895fba77 Mon Sep 17 00:00:00 2001 From: Guilherme Danno Date: Fri, 8 May 2020 19:06:44 -0300 Subject: [PATCH 001/731] Update CONTRIBUTORS.md --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 2eae7e6933..65bb24e9fc 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -35,6 +35,7 @@ - [Thibault Nocchi](https://github.com/ThibaultNocchi) - [MrTimscampi](https://github.com/MrTimscampi) - [Sarab Singh](https://github.com/sarab97) + - [GuilhermeHideki](https://github.com/GuilhermeHideki) # Emby Contributors From 934797e07409e7e56cbed10f67504eaf4f0c9d41 Mon Sep 17 00:00:00 2001 From: Guilherme Danno Date: Sun, 3 May 2020 20:45:14 -0300 Subject: [PATCH 002/731] feat: add mixins file --- src/styles/_mixins.scss | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/styles/_mixins.scss diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss new file mode 100644 index 0000000000..ed23ab0833 --- /dev/null +++ b/src/styles/_mixins.scss @@ -0,0 +1,23 @@ +@mixin background-cover($position) { + background-position: $position; + background-repeat: no-repeat; + background-size: cover; +} + +@mixin circle($size) { + @include square($size); + border-radius: 100%; +} + +@mixin position($position, $top: null, $right: null, $bottom: null, $left: null) { + position: $position; + top: $top; + right: $right; + bottom: $bottom; + left: $left; +} + +@mixin square($size) { + height: $size; + width: $size; +} From 2ea2132740238f79136e7e398d78a9d25329c9fa Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Fri, 29 May 2020 23:32:45 +0200 Subject: [PATCH 003/731] Add barebones comic book reader --- package.json | 2 + src/bundle.js | 6 + src/components/comicsPlayer/plugin.js | 215 +++++++++++++++++++++ src/components/playback/playbackmanager.js | 6 +- src/components/pluginManager.js | 2 +- src/scripts/site.js | 4 +- webpack.common.js | 18 +- yarn.lock | 5 + 8 files changed, 252 insertions(+), 6 deletions(-) create mode 100644 src/components/comicsPlayer/plugin.js diff --git a/package.json b/package.json index 749c62d39c..aefec20d7a 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto", "jquery": "^3.5.1", "jstree": "^3.3.7", + "libarchive.js": "^1.3.0", "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", @@ -92,6 +93,7 @@ "src/components/autoFocuser.js", "src/components/cardbuilder/cardBuilder.js", "src/scripts/fileDownloader.js", + "src/components/comicsPlayer/plugin.js", "src/components/images/imageLoader.js", "src/components/lazyLoader/lazyLoaderIntersectionObserver.js", "src/components/playback/mediasession.js", diff --git a/src/bundle.js b/src/bundle.js index d7ba6c6a51..fd9099aaf3 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -176,3 +176,9 @@ _define('connectionManagerFactory', function () { _define('appStorage', function () { return apiclient.AppStorage; }); + +// libarchive.js +var libarchive = require('libarchive.js'); +_define('libarchive', function () { + return libarchive; +}); diff --git a/src/components/comicsPlayer/plugin.js b/src/components/comicsPlayer/plugin.js new file mode 100644 index 0000000000..43469bfed4 --- /dev/null +++ b/src/components/comicsPlayer/plugin.js @@ -0,0 +1,215 @@ +import connectionManager from 'connectionManager'; +import loading from 'loading'; +import dialogHelper from 'dialogHelper'; +import keyboardnavigation from 'keyboardnavigation'; +import appRouter from 'appRouter'; +import 'css!../slideshow/style'; +import * as libarchive from 'libarchive'; + +export class ComicsPlayer { + constructor() { + this.name = 'Comics Player'; + this.type = 'mediaplayer'; + this.id = 'comicsplayer'; + this.priority = 1; + this.imageMap = new Map(); + + this.onDialogClosed = this.onDialogClosed.bind(this); + this.onWindowKeyUp = this.onWindowKeyUp.bind(this); + } + + play(options) { + this._progress = 0; + + let elem = this.createMediaElement(); + return this.setCurrentSrc(elem, options); + } + + stop() { + this.unbindEvents(); + + let elem = this._mediaElement; + + if (elem) { + dialogHelper.close(elem); + this._mediaElement = null; + } + + // Hide loader in case player was not fully loaded yet + loading.hide(); + } + + onDialogClosed() { + this.stop(); + } + + onWindowKeyUp(e) { + let key = keyboardnavigation.getKeyName(e); + switch (key) { + case 'Escape': + this.stop(); + break; + } + } + + bindEvents() { + document.addEventListener('keyup', this.onWindowKeyUp); + } + + unbindEvents() { + document.removeEventListener('keyup', this.onWindowKeyUp); + } + + createMediaElement() { + let elem = this._mediaElement; + + if (elem) { + return elem; + } + + elem = document.getElementById('comicsPlayer'); + if (!elem) { + elem = dialogHelper.createDialog({ + exitAnimationDuration: 400, + size: 'fullscreen', + autoFocus: false, + scrollY: false, + exitAnimation: 'fadeout', + removeOnClose: true + }); + elem.id = 'bookPlayer'; + + elem.classList.add('slideshowDialog'); + + elem.innerHTML = '
'; + + this.bindEvents(); + + dialogHelper.open(elem); + } + + this._mediaElement = elem; + + return elem; + } + + setCurrentSrc(elem, options) { + let item = options.items[0]; + this._currentItem = item; + + loading.show(); + + let serverId = item.ServerId; + let apiClient = connectionManager.getApiClient(serverId); + + libarchive.Archive.init({ + workerUrl: appRouter.baseUrl() + '/libraries/worker-bundle.js' + }); + + return new Promise((resolve, reject) => { + let downloadUrl = apiClient.getItemDownloadUrl(item.Id); + const archiveSource = new ArchiveSource(downloadUrl); + var instance = this; + import('swiper').then(({default: Swiper}) => { + archiveSource.load().then(() => { + loading.hide(); + this.swiperInstance = new Swiper(elem.querySelector('.slideshowSwiperContainer'), { + direction: 'horizontal', + // Loop is disabled due to the virtual slides option not supporting it. + loop: false, + zoom: { + minRatio: 1, + toggle: true, + containerClass: 'slider-zoom-container' + }, + autoplay: false, + keyboard: { + enabled: true + }, + preloadImages: true, + slidesPerView: 1, + slidesPerColumn: 1, + initialSlide: 0, + // Virtual slides reduce memory consumption for large libraries while allowing preloading of images; + virtual: { + slides: archiveSource.urls, + cache: true, + renderSlide: instance.getImgFromUrl, + addSlidesBefore: 1, + addSlidesAfter: 1 + } + }); + }); + }); + }); + } + + getImgFromUrl(url) { + return `
+
+ +
+
`; + } + + canPlayMediaType(mediaType) { + return (mediaType || '').toLowerCase() === 'book'; + } + + canPlayItem(item) { + if (item.Path && (item.Path.endsWith('cbz') || item.Path.endsWith('cbr'))) { + return true; + } + return false; + } +} + +class ArchiveSource { + constructor(url) { + this.url = url; + this.files = []; + this.urls = []; + this.loadPromise = this.load(); + this.itemsLoaded = 0; + } + + async load() { + let res = await fetch(this.url); + if (!res.ok) { + return; + } + let blob = await res.blob(); + this.archive = await libarchive.Archive.open(blob); + this.raw = await this.archive.getFilesArray(); + this.numberOfFiles = this.raw.length; + await this.archive.extractFiles(); + + let files = await this.archive.getFilesArray(); + files.sort((a, b) => { + if (a.file.name < b.file.name) + return -1; + else + return 1; + }); + + for (let file of files) { + let url = URL.createObjectURL(file.file); + this.urls.push(url); + } + } + + getLength() { + return this.raw.length; + } + + async item(index) { + if (this.urls[index]) { + return this.urls[index]; + } + + await this.loadPromise; + return this.urls[index]; + } +} + +export default ComicsPlayer; diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 59108cf72e..053088ef2f 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2187,7 +2187,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla // Only used internally self.getCurrentTicks = getCurrentTicks; - function playPhotos(items, options, user) { + function playOther(items, options, user) { var playStartIndex = options.startIndex || 0; var player = getPlayer(items[playStartIndex], options); @@ -2216,9 +2216,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return Promise.reject(); } - if (firstItem.MediaType === 'Photo') { + if (firstItem.MediaType === 'Photo' || firstItem.MediaType === 'Book') { - return playPhotos(items, options, user); + return playOther(items, options, user); } var apiClient = connectionManager.getApiClient(firstItem.ServerId); diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index 6cb56d767b..fd35d344bf 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -58,7 +58,7 @@ define(['events', 'globalize'], function (events, globalize) { return new Promise(function (resolve, reject) { require([pluginSpec], (pluginFactory) => { - var plugin = new pluginFactory(); + var plugin = pluginFactory.default ? new pluginFactory.default() : new pluginFactory(); // See if it's already installed var existing = instance.pluginsList.filter(function (p) { diff --git a/src/scripts/site.js b/src/scripts/site.js index aeb651d888..2e83928f97 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -490,6 +490,7 @@ var AppInfo = {}; 'components/playback/experimentalwarnings', 'components/htmlAudioPlayer/plugin', 'components/htmlVideoPlayer/plugin', + 'components/comicsPlayer/plugin', 'components/photoPlayer/plugin', 'components/youtubeplayer/plugin', 'components/backdropScreensaver/plugin', @@ -701,7 +702,8 @@ var AppInfo = {}; 'events', 'credentialprovider', 'connectionManagerFactory', - 'appStorage' + 'appStorage', + 'comicReader' ] }, urlArgs: urlArgs, diff --git a/webpack.common.js b/webpack.common.js index 03beb63a73..2cc8478d86 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -1,10 +1,12 @@ const path = require('path'); const CopyPlugin = require('copy-webpack-plugin'); +const WorkerPlugin = require('worker-plugin'); const Assets = [ 'alameda/alameda.js', 'native-promise-only/npo.js', + 'libarchive.js/dist/worker-bundle.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', @@ -13,6 +15,11 @@ const Assets = [ 'libass-wasm/dist/js/subtitles-octopus-worker-legacy.js.mem' ]; +const LibarchiveWasm = [ + 'libarchive.js/dist/wasm-gen/libarchive.js', + 'libarchive.js/dist/wasm-gen/libarchive.wasm' +]; + module.exports = { context: path.resolve(__dirname, 'src'), entry: './bundle.js', @@ -34,6 +41,15 @@ module.exports = { to: path.resolve(__dirname, './dist/libraries') }; }) - ) + ), + new CopyPlugin( + LibarchiveWasm.map(asset => { + return { + from: path.resolve(__dirname, `./node_modules/${asset}`), + to: path.resolve(__dirname, './dist/libraries/wasm-gen/') + }; + }) + ), + new WorkerPlugin() ] }; diff --git a/yarn.lock b/yarn.lock index 20fdef5de1..5b8df85f45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6783,6 +6783,11 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +libarchive.js@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/libarchive.js/-/libarchive.js-1.3.0.tgz#18c42c6b4ce727a02359c90769e4e454cf3743cd" + integrity sha512-EkQfRXt9DhWwj6BnEA2TNpOf4jTnzSTUPGgE+iFxcdNqjktY8GitbDeHnx8qZA0/IukNyyBUR3oQKRdYkO+HFg== + "libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus#4.0.0-jf-smarttv": version "4.0.0" resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#58e9a3f1a7f7883556ee002545f445a430120639" From 9e92bfaae78b3bd1f1dfdc9ba02ced18729bef95 Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Sun, 14 Jun 2020 23:37:48 +0300 Subject: [PATCH 004/731] Fix subtitle line spacing --- .../subtitleappearancehelper.js | 71 ++++++------------- src/plugins/htmlVideoPlayer/plugin.js | 2 +- src/plugins/htmlVideoPlayer/style.css | 6 ++ 3 files changed, 30 insertions(+), 49 deletions(-) diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index bec8156aca..503c81472f 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -1,55 +1,30 @@ define([], function () { 'use strict'; - function getTextStyles(settings, isCue) { + function getTextStyles(settings) { var list = []; - if (isCue) { - switch (settings.textSize || '') { - - case 'smaller': - list.push({ name: 'font-size', value: '.5em' }); - break; - case 'small': - list.push({ name: 'font-size', value: '.7em' }); - break; - case 'large': - list.push({ name: 'font-size', value: '1.3em' }); - break; - case 'larger': - list.push({ name: 'font-size', value: '1.72em' }); - break; - case 'extralarge': - list.push({ name: 'font-size', value: '2em' }); - break; - default: - case 'medium': - break; - } - } else { - switch (settings.textSize || '') { - - case 'smaller': - list.push({ name: 'font-size', value: '.8em' }); - break; - case 'small': - list.push({ name: 'font-size', value: 'inherit' }); - break; - case 'larger': - list.push({ name: 'font-size', value: '2em' }); - break; - case 'extralarge': - list.push({ name: 'font-size', value: '2.2em' }); - break; - case 'large': - list.push({ name: 'font-size', value: '1.72em' }); - break; - default: - case 'medium': - list.push({ name: 'font-size', value: '1.36em' }); - break; - } + switch (settings.textSize || '') { + case 'smaller': + list.push({ name: 'font-size', value: '.8em' }); + break; + case 'small': + list.push({ name: 'font-size', value: 'inherit' }); + break; + case 'larger': + list.push({ name: 'font-size', value: '2em' }); + break; + case 'extralarge': + list.push({ name: 'font-size', value: '2.2em' }); + break; + case 'large': + list.push({ name: 'font-size', value: '1.72em' }); + break; + default: + case 'medium': + list.push({ name: 'font-size', value: '1.36em' }); + break; } switch (settings.dropShadow || '') { @@ -122,10 +97,10 @@ define([], function () { return []; } - function getStyles(settings, isCue) { + function getStyles(settings) { return { - text: getTextStyles(settings, isCue), + text: getTextStyles(settings), window: getWindowStyles(settings) }; } diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index cc312bb956..9302612539 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1178,7 +1178,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa document.getElementsByTagName('head')[0].appendChild(styleElem); } - styleElem.innerHTML = getCueCss(subtitleAppearanceHelper.getStyles(userSettings.getSubtitleAppearanceSettings(), true), '.htmlvideoplayer'); + styleElem.innerHTML = getCueCss(subtitleAppearanceHelper.getStyles(userSettings.getSubtitleAppearanceSettings()), '.htmlvideoplayer'); }); } diff --git a/src/plugins/htmlVideoPlayer/style.css b/src/plugins/htmlVideoPlayer/style.css index b83a7816f5..0f63e72d7e 100644 --- a/src/plugins/htmlVideoPlayer/style.css +++ b/src/plugins/htmlVideoPlayer/style.css @@ -33,6 +33,12 @@ video::-webkit-media-controls { text-shadow: 0.14em 0.14em 0.14em rgba(0, 0, 0, 1); -webkit-font-smoothing: antialiased; font-family: inherit; + line-height: normal; /* Restore value. See -webkit-media-text-track-container 'line-height' */ +} + +.htmlvideoplayer::-webkit-media-text-track-container { + font-size: 170% !important; /* Override element inline style */ + line-height: 50%; /* Child element cannot set line height smaller than its parent has. This allow smaller values for children */ } .htmlvideoplayer-moveupsubtitles::-webkit-media-text-track-display { From 597b4258d9eba3a663082632149511d4500264ce Mon Sep 17 00:00:00 2001 From: Dmitry Lyzo Date: Tue, 7 Jul 2020 01:06:47 +0300 Subject: [PATCH 005/731] Add subtitle position --- .../subtitleappearancehelper.js | 39 ++++++++-- .../subtitlesettings/subtitlesettings.js | 71 ++++++++++++++++++- .../subtitlesettings.template.html | 53 ++++++++++++++ src/elements/emby-slider/emby-slider.css | 15 ++++ src/elements/emby-slider/emby-slider.js | 10 +++ src/plugins/htmlVideoPlayer/plugin.js | 39 +++++----- src/plugins/htmlVideoPlayer/style.css | 9 ++- src/scripts/settings/userSettings.js | 6 +- src/strings/en-us.json | 5 +- src/strings/ru.json | 5 +- 10 files changed, 219 insertions(+), 33 deletions(-) diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index 503c81472f..e611228d9a 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -1,7 +1,7 @@ define([], function () { 'use strict'; - function getTextStyles(settings) { + function getTextStyles(settings, preview) { var list = []; @@ -89,19 +89,44 @@ define([], function () { break; } + if (!preview) { + const pos = parseInt(settings.verticalPosition); + const lineHeight = 1.35; // FIXME: It is better to read this value from element + const line = Math.abs(pos * lineHeight); + if (pos < 0) { + list.push({ name: 'min-height', value: `${line}em` }); + list.push({ name: 'margin-top', value: '' }); + } else { + list.push({ name: 'min-height', value: '' }); + list.push({ name: 'margin-top', value: `${line}em` }); + } + } + return list; } - function getWindowStyles(settings) { + function getWindowStyles(settings, preview) { + const list = []; - return []; + if (!preview) { + const pos = parseInt(settings.verticalPosition); + if (pos < 0) { + list.push({ name: 'top', value: '' }); + list.push({ name: 'bottom', value: '0' }); + } else { + list.push({ name: 'top', value: '0' }); + list.push({ name: 'bottom', value: '' }); + } + } + + return list; } - function getStyles(settings) { + function getStyles(settings, preview) { return { - text: getTextStyles(settings), - window: getWindowStyles(settings) + text: getTextStyles(settings, preview), + window: getWindowStyles(settings, preview) }; } @@ -117,7 +142,7 @@ define([], function () { function applyStyles(elements, appearanceSettings) { - var styles = getStyles(appearanceSettings); + var styles = getStyles(appearanceSettings, !!elements.preview); if (elements.text) { applyStyleList(styles.text, elements.text); diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index d728360d05..819631184c 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -1,4 +1,4 @@ -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) { +define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loading', 'connectionManager', 'subtitleAppearanceHelper', 'dom', 'events', 'layoutManager', 'listViewStyle', 'emby-select', 'emby-input', 'emby-checkbox', 'emby-slider', 'flexStyles'], function (require, globalize, appSettings, appHost, focusManager, loading, connectionManager, subtitleAppearanceHelper, dom, events, layoutManager) { 'use strict'; function populateLanguages(select, languages) { @@ -21,6 +21,7 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi appearanceSettings.font = context.querySelector('#selectFont').value; appearanceSettings.textBackground = context.querySelector('#inputTextBackground').value; appearanceSettings.textColor = context.querySelector('#inputTextColor').value; + appearanceSettings.verticalPosition = context.querySelector('#sliderVerticalPosition').value; return appearanceSettings; } @@ -47,6 +48,7 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi context.querySelector('#inputTextBackground').value = appearanceSettings.textBackground || 'transparent'; context.querySelector('#inputTextColor').value = appearanceSettings.textColor || '#ffffff'; context.querySelector('#selectFont').value = appearanceSettings.font || ''; + context.querySelector('#sliderVerticalPosition').value = appearanceSettings.verticalPosition; context.querySelector('#selectSubtitleBurnIn').value = appSettings.get('subtitleburnin') || ''; @@ -134,10 +136,45 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi var elements = { window: view.querySelector('.subtitleappearance-preview-window'), - text: view.querySelector('.subtitleappearance-preview-text') + text: view.querySelector('.subtitleappearance-preview-text'), + preview: true }; subtitleAppearanceHelper.applyStyles(elements, appearanceSettings); + + subtitleAppearanceHelper.applyStyles({ + window: view.querySelector('.subtitleappearance-fullpreview-window'), + text: view.querySelector('.subtitleappearance-fullpreview-text') + }, appearanceSettings); + } + + const subtitlePreviewDelay = 1000; + let subtitlePreviewTimer; + + function showSubtitlePreview(persistent) { + clearTimeout(subtitlePreviewTimer); + + this._fullPreview.classList.remove('subtitleappearance-fullpreview-hide'); + + if (persistent) { + this._refFullPreview++; + } + + if (this._refFullPreview === 0) { + subtitlePreviewTimer = setTimeout(hideSubtitlePreview.bind(this), subtitlePreviewDelay); + } + } + + function hideSubtitlePreview(persistent) { + clearTimeout(subtitlePreviewTimer); + + if (persistent) { + this._refFullPreview--; + } + + if (this._refFullPreview === 0) { + this._fullPreview.classList.add('subtitleappearance-fullpreview-hide'); + } } function embed(options, self) { @@ -162,6 +199,36 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi if (appHost.supports('subtitleappearancesettings')) { options.element.querySelector('.subtitleAppearanceSection').classList.remove('hide'); + + self._fullPreview = options.element.querySelector('.subtitleappearance-fullpreview'); + self._refFullPreview = 0; + + const sliderVerticalPosition = options.element.querySelector('#sliderVerticalPosition'); + sliderVerticalPosition.addEventListener('input', onAppearanceFieldChange); + sliderVerticalPosition.addEventListener('input', () => showSubtitlePreview.call(self)); + + const eventPrefix = window.PointerEvent ? 'pointer' : 'mouse'; + sliderVerticalPosition.addEventListener(`${eventPrefix}enter`, () => showSubtitlePreview.call(self, true)); + sliderVerticalPosition.addEventListener(`${eventPrefix}leave`, () => hideSubtitlePreview.call(self, true)); + + if (layoutManager.tv) { + sliderVerticalPosition.addEventListener('focus', () => showSubtitlePreview.call(self, true)); + sliderVerticalPosition.addEventListener('blur', () => hideSubtitlePreview.call(self, true)); + + // Give CustomElements time to attach + setTimeout(() => { + sliderVerticalPosition.classList.add('focusable'); + sliderVerticalPosition.enableKeyboardDragging(); + }, 0); + } + + options.element.querySelector('.chkPreview').addEventListener('change', (e) => { + if (e.target.checked) { + showSubtitlePreview.call(self, true); + } else { + hideSubtitlePreview.call(self, true); + } + }); } self.loadData(); diff --git a/src/components/subtitlesettings/subtitlesettings.template.html b/src/components/subtitlesettings/subtitlesettings.template.html index 716296a257..2f49fa4c3e 100644 --- a/src/components/subtitlesettings/subtitlesettings.template.html +++ b/src/components/subtitlesettings/subtitlesettings.template.html @@ -38,6 +38,45 @@ ${HeaderSubtitleAppearance} + + +
+
+
+ ${HeaderSubtitleAppearance} +
+ ${TheseSettingsAffectSubtitlesOnThisDevice} +
+
+
+
@@ -89,6 +128,20 @@
+ +
+
+ +
+
${SubtitleVerticalPositionHelp}
+
+ +
+ +
'; - itemHtml += ''; - } - itemHtml += '
'; - itemHtml += '
'; - itemHtml += '

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

'; - if (showHelp) { - showHelp = false; - itemHtml += ''; - itemHtml += globalize.translate('Help'); - itemHtml += ''; - } +function reload(page) { + loading.show(); + ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')).then(function (list) { + let html = ''; + let lastCategory = ''; + let showHelp = true; + html += list.map(function (notification) { + let itemHtml = ''; + if (notification.Category !== lastCategory) { + lastCategory = notification.Category; + if (lastCategory) { + itemHtml += '
'; itemHtml += '
'; - itemHtml += '
'; } - itemHtml += ''; - if (notification.Enabled) { - itemHtml += ''; - } else { - itemHtml += ''; + itemHtml += '
'; + itemHtml += '
'; + itemHtml += '

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

'; + if (showHelp) { + showHelp = false; + itemHtml += '
'; + itemHtml += globalize.translate('Help'); + itemHtml += ''; } - itemHtml += '
'; - itemHtml += '
' + notification.Name + '
'; itemHtml += '
'; - itemHtml += ''; - itemHtml += ''; - return itemHtml; - }).join(''); - - if (list.length) { - html += '
'; - html += '
'; + itemHtml += '
'; } - page.querySelector('.notificationList').innerHTML = html; - loading.hide(); - }); - } + itemHtml += ''; + if (notification.Enabled) { + itemHtml += ''; + } else { + itemHtml += ''; + } + itemHtml += '
'; + itemHtml += '
' + notification.Name + '
'; + itemHtml += '
'; + itemHtml += ''; + itemHtml += '
'; + return itemHtml; + }).join(''); - return function(view, params) { - view.addEventListener('viewshow', function() { - reload(view); - }); - }; -}); + if (list.length) { + html += '
'; + html += '
'; + } + page.querySelector('.notificationList').innerHTML = html; + loading.hide(); + }); +} + +export default function (view, params) { + view.addEventListener('viewshow', function () { + reload(view); + }); +} From 287cc06963b5935e1a7979c763d26a1cc7d3d17f Mon Sep 17 00:00:00 2001 From: Cameron Date: Sun, 26 Jul 2020 11:29:02 +0100 Subject: [PATCH 028/731] Migration of edititemmetadata to ES6 module --- package.json | 1 + src/controllers/edititemmetadata.js | 51 ++++++++++++++--------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/package.json b/package.json index dbedd2922e..ecb33b77c8 100644 --- a/package.json +++ b/package.json @@ -189,6 +189,7 @@ "src/controllers/dashboard/users/userparentalcontrol.js", "src/controllers/dashboard/users/userpasswordpage.js", "src/controllers/dashboard/users/userprofilespage.js", + "src/controllers/edititemmetadata.js", "src/controllers/playback/nowplaying.js", "src/controllers/playback/videoosd.js", "src/controllers/searchpage.js", diff --git a/src/controllers/edititemmetadata.js b/src/controllers/edititemmetadata.js index 1a3647a758..57c72dda28 100644 --- a/src/controllers/edititemmetadata.js +++ b/src/controllers/edititemmetadata.js @@ -1,31 +1,30 @@ -define(['loading', 'scripts/editorsidebar'], function (loading) { - 'use strict'; +import loading from 'loading'; +import 'scripts/editorsidebar'; - function reload(context, itemId) { - loading.show(); +function reload(context, itemId) { + loading.show(); - if (itemId) { - require(['metadataEditor'], function ({default: metadataEditor}) { - metadataEditor.embed(context.querySelector('.editPageInnerContent'), itemId, ApiClient.serverInfo().Id); - }); - } else { - context.querySelector('.editPageInnerContent').innerHTML = ''; - loading.hide(); - } + if (itemId) { + import('metadataEditor').then(({ default: metadataEditor }) => { + metadataEditor.embed(context.querySelector('.editPageInnerContent'), itemId, ApiClient.serverInfo().Id); + }); + } else { + context.querySelector('.editPageInnerContent').innerHTML = ''; + loading.hide(); } +} - return function (view, params) { - view.addEventListener('viewshow', function () { - reload(this, MetadataEditor.getCurrentItemId()); - }); - MetadataEditor.setCurrentItemId(null); - view.querySelector('.libraryTree').addEventListener('itemclicked', function (event) { - var data = event.detail; +export default function (view, params) { + view.addEventListener('viewshow', function () { + reload(this, MetadataEditor.getCurrentItemId()); + }); + MetadataEditor.setCurrentItemId(null); + view.querySelector('.libraryTree').addEventListener('itemclicked', function (event) { + var data = event.detail; - if (data.id != MetadataEditor.getCurrentItemId()) { - MetadataEditor.setCurrentItemId(data.id); - reload(view, data.id); - } - }); - }; -}); + if (data.id != MetadataEditor.getCurrentItemId()) { + MetadataEditor.setCurrentItemId(data.id); + reload(view, data.id); + } + }); +} From 3658b4471a1314d32bb84eb0cb83f6149fc5da1a Mon Sep 17 00:00:00 2001 From: Cameron Date: Sun, 26 Jul 2020 11:29:26 +0100 Subject: [PATCH 029/731] Migration of Favorites and Hometab to ES6 modules --- package.json | 2 + src/controllers/favorites.js | 108 +++++++++++++++++++---------------- src/controllers/home.js | 2 +- src/controllers/hometab.js | 67 +++++++++++----------- 4 files changed, 97 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index ecb33b77c8..de3fe62adc 100644 --- a/package.json +++ b/package.json @@ -190,6 +190,8 @@ "src/controllers/dashboard/users/userpasswordpage.js", "src/controllers/dashboard/users/userprofilespage.js", "src/controllers/edititemmetadata.js", + "src/controllers/favorites.js", + "src/controllers/hometab.js", "src/controllers/playback/nowplaying.js", "src/controllers/playback/videoosd.js", "src/controllers/searchpage.js", diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index b4c7936239..532801bfaf 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -1,5 +1,15 @@ -define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'emby-itemscontainer', 'emby-scroller'], function (appRouter, cardBuilder, dom, globalize, connectionManager, appHost, layoutManager, focusManager) { - 'use strict'; +import appRouter from 'appRouter'; +import cardBuilder from 'cardBuilder'; +import dom from 'dom'; +import globalize from 'globalize'; +import connectionManager from 'connectionManager'; +import appHost from 'apphost'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import 'emby-itemscontainer'; +import 'emby-scroller'; + +/* eslint-disable indent */ function enableScrollX() { return true; @@ -133,8 +143,8 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap function getFetchDataFn(section) { return function () { - var apiClient = this.apiClient; - var options = { + const apiClient = this.apiClient; + const options = { SortBy: (section.types, 'SeriesName,SortName'), SortOrder: 'Ascending', Filters: 'IsFavorite', @@ -145,7 +155,7 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap EnableTotalRecordCount: false }; options.Limit = 20; - var userId = apiClient.getCurrentUserId(); + const userId = apiClient.getCurrentUserId(); if ('MusicArtist' === section.types) { return apiClient.getArtists(userId, options); @@ -170,17 +180,17 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap function getItemsHtmlFn(section) { return function (items) { - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle; + const supportsImageAnalysis = appHost.supports('imageanalysis'); + let cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle; cardLayout = false; - var serverId = this.apiClient.serverId(); - var leadingButtons = layoutManager.tv ? [{ + const serverId = this.apiClient.serverId(); + const leadingButtons = layoutManager.tv ? [{ name: globalize.translate('All'), id: 'more', icon: 'favorite', routeUrl: getRouteUrl(section, serverId) }] : null; - var lines = 0; + let lines = 0; if (section.showTitle) { lines++; @@ -216,23 +226,12 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap }; } - function FavoritesTab(view, params) { - this.view = view; - this.params = params; - this.apiClient = connectionManager.currentApiClient(); - this.sectionsContainer = view.querySelector('.sections'); - createSections(this, this.sectionsContainer, this.apiClient); - } - function createSections(instance, elem, apiClient) { - var i; - var length; - var sections = getSections(); - var html = ''; + const sections = getSections(); + let html = ''; - for (i = 0, length = sections.length; i < length; i++) { - var section = sections[i]; - var sectionClass = 'verticalSection'; + for (const section of sections) { + let sectionClass = 'verticalSection'; if (!section.showTitle) { sectionClass += ' verticalSection-extrabottompadding'; @@ -258,23 +257,32 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap } elem.innerHTML = html; - var elems = elem.querySelectorAll('.itemsContainer'); + const elems = elem.querySelectorAll('.itemsContainer'); - for (i = 0, length = elems.length; i < length; i++) { - var itemsContainer = elems[i]; + for (let i = 0, length = elems.length; i < length; i++) { + const itemsContainer = elems[i]; itemsContainer.fetchData = getFetchDataFn(sections[i]).bind(instance); itemsContainer.getItemsHtml = getItemsHtmlFn(sections[i]).bind(instance); 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'); +class FavoritesTab { + constructor(view, params) { + this.view = view; + this.params = params; + this.apiClient = connectionManager.currentApiClient(); + this.sectionsContainer = view.querySelector('.sections'); + createSections(this, this.sectionsContainer, this.apiClient); + } - for (var i = 0, length = elems.length; i < length; i++) { - promises.push(elems[i].resume(options)); + onResume(options) { + const promises = (this.apiClient, []); + const view = this.view; + const elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); + + for (const elem of elems) { + promises.push(elem.resume(options)); } Promise.all(promises).then(function () { @@ -282,30 +290,32 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap focusManager.autoFocus(view); } }); - }; + } - FavoritesTab.prototype.onPause = function () { - var elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); + onPause() { + const elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); - for (var i = 0, length = elems.length; i < length; i++) { - elems[i].pause(); + for (const elem of elems) { + elem.pause(); } - }; + } - FavoritesTab.prototype.destroy = function () { + destroy() { this.view = null; this.params = null; this.apiClient = null; - var elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); + const elems = this.sectionsContainer.querySelectorAll('.itemsContainer'); - for (var i = 0, length = elems.length; i < length; i++) { - elems[i].fetchData = null; - elems[i].getItemsHtml = null; - elems[i].parentContainer = null; + for (const elem of elems) { + elem.fetchData = null; + elem.getItemsHtml = null; + elem.parentContainer = null; } this.sectionsContainer = null; - }; + } +} - return FavoritesTab; -}); +export default FavoritesTab; + +/* eslint-enable indent */ diff --git a/src/controllers/home.js b/src/controllers/home.js index 9a4cea2227..ea3fef3ce2 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -40,7 +40,7 @@ define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby- var controller = instance.tabControllers[index]; if (!controller) { - controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params); + controller = new controllerFactory.default(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params); instance.tabControllers[index] = controller; } diff --git a/src/controllers/hometab.js b/src/controllers/hometab.js index 8e2a1f92e7..4b7ddee057 100644 --- a/src/controllers/hometab.js +++ b/src/controllers/hometab.js @@ -1,27 +1,23 @@ -define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'homeSections', 'emby-itemscontainer'], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) { - 'use strict'; +import * as userSettings from 'userSettings'; +import loading from 'loading'; +import connectionManager from 'connectionManager'; +import appHost from 'apphost'; +import layoutManager from 'layoutManager'; +import focusManager from 'focusManager'; +import homeSections from 'homeSections'; +import 'emby-itemscontainer'; - function HomeTab(view, params) { +class HomeTab { + constructor(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)); } - - function onHomeScreenSettingsChanged() { - this.sectionsRendered = false; - - if (!this.paused) { - this.onResume({ - refresh: true - }); - } - } - - HomeTab.prototype.onResume = function (options) { + onResume(options) { if (this.sectionsRendered) { - var sectionsContainer = this.sectionsContainer; + const sectionsContainer = this.sectionsContainer; if (sectionsContainer) { return homeSections.resume(sectionsContainer, options); @@ -31,8 +27,8 @@ define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManage } loading.show(); - var view = this.view; - var apiClient = this.apiClient; + const view = this.view; + const apiClient = this.apiClient; this.destroyHomeSections(); this.sectionsRendered = true; return apiClient.getCurrentUser().then(function (user) { @@ -44,31 +40,38 @@ define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManage loading.hide(); }); }); - }; - - HomeTab.prototype.onPause = function () { - var sectionsContainer = this.sectionsContainer; + } + onPause() { + const sectionsContainer = this.sectionsContainer; if (sectionsContainer) { homeSections.pause(sectionsContainer); } - }; - - HomeTab.prototype.destroy = function () { + } + destroy() { this.view = null; this.params = null; this.apiClient = null; this.destroyHomeSections(); this.sectionsContainer = null; - }; - - HomeTab.prototype.destroyHomeSections = function () { - var sectionsContainer = this.sectionsContainer; + } + destroyHomeSections() { + const sectionsContainer = this.sectionsContainer; if (sectionsContainer) { homeSections.destroySections(sectionsContainer); } - }; + } +} - return HomeTab; -}); +function onHomeScreenSettingsChanged() { + this.sectionsRendered = false; + + if (!this.paused) { + this.onResume({ + refresh: true + }); + } +} + +export default HomeTab; From dfbb7dfc1600daba28f64d84644eef0ffa1f0390 Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 19 Jul 2020 16:15:11 +0200 Subject: [PATCH 030/731] Remove dead code --- .eslintrc.js | 7 +- src/components/actionSheet/actionSheet.js | 2 - src/components/activitylog.js | 1 + src/components/appRouter.js | 12 +- src/components/apphost.js | 6 - .../collectionEditor/collectionEditor.js | 1 + src/components/dialog/dialog.js | 6 +- src/components/favoriteitems.js | 3 +- src/components/filtermenu/filtermenu.js | 33 ----- src/components/focusManager.js | 8 -- src/components/guide/guide.js | 10 +- .../homeScreenSettings/homeScreenSettings.js | 7 +- src/components/homesections/homesections.js | 23 ---- src/components/htmlMediaHelper.js | 27 ----- .../imageDownloader/imageDownloader.js | 1 - src/components/listview/listview.js | 2 - src/components/maintabsmanager.js | 15 --- src/components/mediainfo/mediainfo.js | 4 - src/components/multiSelect/multiSelect.js | 7 +- src/components/notifications/notifications.js | 6 +- src/components/playback/playbackmanager.js | 8 +- .../playback/playerSelectionMenu.js | 1 - src/components/playback/playersettingsmenu.js | 17 --- src/components/playerstats/playerstats.js | 16 +-- src/components/qualityOptions.js | 1 - .../recordingcreator/recordingeditor.js | 3 - .../recordingcreator/seriesrecordingeditor.js | 2 - src/components/remotecontrol/remotecontrol.js | 3 - src/components/sanitizeFilename.js | 1 + src/components/slideshow/slideshow.js | 6 - src/components/sortmenu/sortmenu.js | 9 -- .../subtitleeditor/subtitleeditor.js | 58 +-------- src/components/tabbedview/itemstab.js | 11 +- src/components/themeMediaPlayer.js | 14 +-- .../userdatabuttons/userdatabuttons.js | 16 --- src/components/viewManager/viewManager.js | 5 +- src/controllers/auth/selectserver.js | 5 - .../dashboard/plugins/available.js | 1 - .../dashboard/users/userprofilespage.js | 98 +-------------- src/controllers/favorites.js | 3 +- src/controllers/itemDetails/index.js | 1 + src/controllers/livetv/livetvrecordings.js | 1 - src/controllers/livetv/livetvschedule.js | 7 +- src/controllers/livetv/livetvseriestimers.js | 1 - src/controllers/movies/moviegenres.js | 1 - src/controllers/movies/moviesrecommended.js | 7 +- src/controllers/music/musicrecommended.js | 30 ++--- src/controllers/shows/tvgenres.js | 2 - src/controllers/shows/tvlatest.js | 4 +- src/controllers/shows/tvrecommended.js | 5 - src/controllers/shows/tvupcoming.js | 8 +- src/controllers/user/home.js | 3 - src/controllers/user/playback.js | 3 - src/elements/emby-collapse/emby-collapse.js | 10 +- .../emby-itemscontainer.js | 1 - .../emby-progressring/emby-progressring.js | 27 ++--- src/elements/emby-radio/emby-radio.js | 1 - .../emby-ratingbutton/emby-ratingbutton.js | 3 - .../emby-scrollbuttons/emby-scrollbuttons.js | 2 +- src/elements/emby-slider/emby-slider.js | 3 +- src/elements/emby-tabs/emby-tabs.js | 10 -- src/elements/emby-textarea/emby-textarea.js | 1 - src/legacy/focusPreventScroll.js | 1 + src/libraries/scroller.js | 10 +- src/plugins/experimentalWarnings/plugin.js | 10 +- src/plugins/htmlAudioPlayer/plugin.js | 2 - src/plugins/htmlVideoPlayer/plugin.js | 114 +----------------- src/plugins/logoScreensaver/plugin.js | 19 --- src/scripts/browser.js | 4 - src/scripts/imagehelper.js | 3 +- src/scripts/libraryMenu.js | 5 - src/scripts/livetvcomponents.js | 17 ++- src/scripts/site.js | 16 +-- src/strings/ar.json | 1 - src/strings/bg-bg.json | 1 - src/strings/ca.json | 1 - src/strings/cs.json | 1 - src/strings/da.json | 1 - src/strings/de.json | 1 - src/strings/el.json | 1 - src/strings/en-gb.json | 1 - src/strings/en-us.json | 1 - src/strings/es-ar.json | 1 - src/strings/es-mx.json | 1 - src/strings/es.json | 1 - src/strings/es_419.json | 1 - src/strings/fa.json | 1 - src/strings/fi.json | 1 - src/strings/fr.json | 1 - src/strings/he.json | 1 - src/strings/hr.json | 1 - src/strings/hu.json | 1 - src/strings/it.json | 1 - src/strings/ja.json | 1 - src/strings/kk.json | 1 - src/strings/ko.json | 1 - src/strings/lt-lt.json | 1 - src/strings/lv.json | 1 - src/strings/nb.json | 1 - src/strings/nl.json | 1 - src/strings/pl.json | 1 - src/strings/pt-br.json | 1 - src/strings/pt-pt.json | 1 - src/strings/pt.json | 1 - src/strings/ro.json | 1 - src/strings/ru.json | 1 - src/strings/sk.json | 1 - src/strings/sl-si.json | 1 - src/strings/sv.json | 1 - src/strings/tr.json | 1 - src/strings/vi.json | 1 - src/strings/zh-cn.json | 1 - src/strings/zh-tw.json | 1 - src/userprofiles.html | 8 -- 114 files changed, 98 insertions(+), 741 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index baf6d0e084..d9080d1ac4 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -39,6 +39,8 @@ module.exports = { 'no-multi-spaces': ['error'], 'no-multiple-empty-lines': ['error', { 'max': 1 }], 'no-trailing-spaces': ['error'], + 'no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }], + "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }], 'one-var': ['error', 'never'], 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], 'semi': ['error'], @@ -98,9 +100,8 @@ module.exports = { }, rules: { // TODO: Fix warnings and remove these rules - 'no-redeclare': ['warn'], - 'no-unused-vars': ['warn'], - 'no-useless-escape': ['warn'], + 'no-redeclare': ['off'], + 'no-useless-escape': ['off'], // TODO: Remove after ES6 migration is complete 'import/no-unresolved': ['off'] }, diff --git a/src/components/actionSheet/actionSheet.js b/src/components/actionSheet/actionSheet.js index a68d6a6acd..3f772250e1 100644 --- a/src/components/actionSheet/actionSheet.js +++ b/src/components/actionSheet/actionSheet.js @@ -255,8 +255,6 @@ export function show(options) { }); } - // Seeing an issue in some non-chrome browsers where this is requiring a double click - //var eventName = browser.firefox ? 'mousedown' : 'click'; let selectedId; let timeout; diff --git a/src/components/activitylog.js b/src/components/activitylog.js index 2d5a21756f..623998a402 100644 --- a/src/components/activitylog.js +++ b/src/components/activitylog.js @@ -69,6 +69,7 @@ import 'listViewStyle'; const minDate = new Date(); const hasUserId = 'false' !== elem.getAttribute('data-useractivity'); + // TODO: Use date-fns if (hasUserId) { minDate.setTime(minDate.getTime() - 24 * 60 * 60 * 1000); // one day back } else { diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 8054279c92..8410e9bd67 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -153,15 +153,10 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro }; if (!isBackNav) { - // Don't force a new view for home due to the back menu - //if (route.type !== 'home') { onNewViewNeeded(); return; - //} } viewManager.tryRestoreView(currentRequest, function () { - - // done currentRouteInfo = { route: route, path: ctx.path @@ -309,8 +304,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro page({ click: options.click !== false, - hashbang: options.hashbang !== false, - enableHistory: enableHistory() + hashbang: options.hashbang !== false }); }).catch().then(function() { loading.hide(); @@ -319,10 +313,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro function enableHistory() { - //if (browser.edgeUwp) { - // return false; - //} - // shows status bar on navigation if (browser.xboxOne) { return false; diff --git a/src/components/apphost.js b/src/components/apphost.js index f200b9a642..d447c7ea45 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -257,12 +257,6 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g features.push('fullscreenchange'); } - if (browser.chrome || browser.edge && !browser.slow) { - if (!browser.noAnimation && !browser.edgeUwp && !browser.xboxOne) { - features.push('imageanalysis'); - } - } - if (browser.tv || browser.xboxOne || browser.ps4 || browser.mobile) { features.push('physicalvolumecontrol'); } diff --git a/src/components/collectionEditor/collectionEditor.js b/src/components/collectionEditor/collectionEditor.js index 18cc0d311f..42fd26fc2b 100644 --- a/src/components/collectionEditor/collectionEditor.js +++ b/src/components/collectionEditor/collectionEditor.js @@ -249,6 +249,7 @@ import 'flexStyles'; html += ''; if (appHost.supports('externallinks')) { + // TODO: Change to Jellyfin docs html += `${globalize.translate('Help')}`; } diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index 937e96d297..5dd6017d8f 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -45,9 +45,9 @@ import 'flexStyles'; dlg.classList.add('dialog-fullscreen-lowres'); } - //dlg.querySelector('.btnCancel').addEventListener('click', function (e) { - // dialogHelper.close(dlg); - //}); + dlg.querySelector('.btnCancel').addEventListener('click', function (e) { + dialogHelper.close(dlg); + }); if (options.title) { dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.title || ''; diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index 38715043e7..358bf04112 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -154,8 +154,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad html += '
'; } - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle; + var cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle; cardLayout = false; html += cardBuilder.getCardsHtml(result.Items, { preferThumb: section.preferThumb, diff --git a/src/components/filtermenu/filtermenu.js b/src/components/filtermenu/filtermenu.js index 936e2b0407..a757e3ee19 100644 --- a/src/components/filtermenu/filtermenu.js +++ b/src/components/filtermenu/filtermenu.js @@ -39,34 +39,11 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost', } function renderDynamicFilters(context, result, options) { - - // If there's a huge number of these they will be really show to render - //if (result.Tags) { - // result.Tags.length = Math.min(result.Tags.length, 50); - //} - renderOptions(context, '.genreFilters', 'chkGenreFilter', result.Genres, function (i) { - // Switching from | to , var delimeter = (options.settings.GenreIds || '').indexOf('|') === -1 ? ',' : '|'; return (delimeter + (options.settings.GenreIds || '') + delimeter).indexOf(delimeter + i.Id + 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, '.yearFilters', 'chkYearFilter', result.Years, function (i) { - - // var delimeter = ','; - // return (delimeter + (query.Years || '') + delimeter).indexOf(delimeter + i + delimeter) != -1; - //}); } function loadDynamicFilters(context, options) { @@ -81,11 +58,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost', }); apiClient.getFilters(filterMenuOptions).then(function (result) { - renderDynamicFilters(context, result, options); - }, function () { - - // older server }); } @@ -314,13 +287,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost', var submitted; dlg.querySelector('form').addEventListener('change', function () { - submitted = true; - //if (options.onChange) { - // saveValues(dlg, options.settings, options.settingsKey); - // options.onChange(); - //} - }, true); dialogHelper.open(dlg).then(function () { diff --git a/src/components/focusManager.js b/src/components/focusManager.js index f2022cc445..a5dcad38ca 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -272,14 +272,10 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) { var rect = getOffset(activeElement); // Get elements and work out x/y points - var cache = []; var point1x = parseFloat(rect.left) || 0; var point1y = parseFloat(rect.top) || 0; var point2x = parseFloat(point1x + rect.width - 1) || point1x; var point2y = parseFloat(point1y + rect.height - 1) || point1y; - // Shortcuts to help with compression - var min = Math.min; - var max = Math.max; var sourceMidX = rect.left + (rect.width / 2); var sourceMidY = rect.top + (rect.height / 2); @@ -301,10 +297,6 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) { continue; } - //if (!isCurrentlyFocusableInternal(curr)) { - // continue; - //} - var elementRect = getOffset(curr); // not currently visible diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index bb4a36497c..9fd78fdf49 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -43,11 +43,9 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', if (guideProgramName) { if (pctOfWidth > 0 && pctOfWidth <= 100) { - //guideProgramName.style.marginLeft = pctOfWidth + '%'; guideProgramName.style.transform = 'translateX(' + pctOfWidth + '%)'; caret.classList.remove('hide'); } else { - //guideProgramName.style.marginLeft = '0'; guideProgramName.style.transform = 'none'; caret.classList.add('hide'); } @@ -121,7 +119,6 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var cellCurationMinutes = 30; var cellDurationMs = cellCurationMinutes * 60 * 1000; var msPerDay = 86400000; - var totalRendererdMs = msPerDay; var currentDate; var currentStartIndex = 0; @@ -577,7 +574,6 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', html += '
'; if (program.IsHD && options.showHdIcon) { - //html += ''; if (layoutManager.tv) { html += '
HD
'; } else { @@ -866,6 +862,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var dateTabsHtml = ''; var tabIndex = 0; + // TODO: Use date-fns var date = new Date(); if (currentDate) { @@ -873,7 +870,6 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', } date.setHours(nowHours, 0, 0, 0); - //start.setHours(0, 0, 0, 0); var startTimeOfDayMs = (start.getHours() * 60 * 60 * 1000); startTimeOfDayMs += start.getMinutes() * 60 * 1000; @@ -951,8 +947,6 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var focusableElements; var newRow; - var scrollX = false; - switch (e.detail.command) { case 'up': @@ -1018,7 +1012,6 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', focusManager.moveLeft(target, { container: container }); - scrollX = true; break; case 'right': container = programCell ? dom.parentWithClass(programCell, 'channelPrograms') : null; @@ -1027,7 +1020,6 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', focusManager.moveRight(target, { container: container }); - scrollX = true; break; default: return; diff --git a/src/components/homeScreenSettings/homeScreenSettings.js b/src/components/homeScreenSettings/homeScreenSettings.js index 6d6c26fce4..0ac6f7041d 100644 --- a/src/components/homeScreenSettings/homeScreenSettings.js +++ b/src/components/homeScreenSettings/homeScreenSettings.js @@ -148,9 +148,7 @@ import 'emby-checkbox'; let html = ''; - let index = 0; - - html += result.Items.map(view => { + html += result.Items.map((view) => { let currentHtml = ''; @@ -171,7 +169,6 @@ import 'emby-checkbox'; currentHtml += ''; - index++; return currentHtml; }).join(''); @@ -305,8 +302,6 @@ import 'emby-checkbox'; const viewItem = dom.parentWithClass(target, 'viewItem'); if (viewItem) { - const ul = dom.parentWithClass(viewItem, 'paperList'); - if (target.classList.contains('btnViewItemDown')) { const next = viewItem.nextSibling; diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 010b6b1a78..333b87433e 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -1,13 +1,9 @@ import connectionManager from 'connectionManager'; import cardBuilder from 'cardBuilder'; -import appSettings from 'appSettings'; import dom from 'dom'; -import appHost from 'apphost'; import layoutManager from 'layoutManager'; import imageLoader from 'imageLoader'; import globalize from 'globalize'; -import itemShortcuts from 'itemShortcuts'; -import itemHelper from 'itemHelper'; import appRouter from 'appRouter'; import imageHelper from 'scripts/imagehelper'; import 'paper-icon-button-light'; @@ -215,14 +211,6 @@ import 'css!./homesections'; imageLoader.lazyChildren(elem); } - /** - * Returns a random integer between min (inclusive) and max (inclusive) - * Using Math.round() will give you a non-uniform distribution! - */ - function getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - } - function getFetchLatestItemsFn(serverId, parentId, collectionType) { return function () { const apiClient = connectionManager.getApiClient(serverId); @@ -347,14 +335,6 @@ import 'css!./homesections'; } } - function getRequirePromise(deps) { - return new Promise(function (resolve, reject) { - import(deps).then(() => { - return resolve; - }); - }); - } - export function loadLibraryTiles(elem, apiClient, user, userSettings, shape, userViews, allSections) { let html = ''; if (userViews.length) { @@ -549,7 +529,6 @@ import 'css!./homesections'; } function getOnNowItemsHtml(items) { - const cardLayout = false; return cardBuilder.getCardsHtml({ items: items, preferThumb: 'auto', @@ -576,7 +555,6 @@ import 'css!./homesections'; return Promise.resolve(); } - const userId = user.Id; return apiClient.getLiveTvRecommendedPrograms({ userId: apiClient.getCurrentUserId(), IsAiring: true, @@ -766,7 +744,6 @@ import 'css!./homesections'; function getLatestRecordingItemsHtml(activeRecordingsOnly) { return function (items) { - const cardLayout = false; return cardBuilder.getCardsHtml({ items: items, shape: enableScrollX() ? 'autooverflow' : 'auto', diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 062c80efa6..fd740d98e5 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -33,32 +33,6 @@ import events from 'events'; return false; } - export function enableHlsShakaPlayer(item, mediaSource, mediaType) { - /* eslint-disable-next-line compat/compat */ - if (!!window.MediaSource && !!MediaSource.isTypeSupported) { - - if (canPlayNativeHls()) { - - if (browser.edge && mediaType === 'Video') { - return true; - } - - // simple playback should use the native support - if (mediaSource.RunTimeTicks) { - //if (!browser.edge) { - //return false; - //} - } - - //return false; - } - - return true; - } - - return false; - } - export function enableHlsJsPlayer(runTimeTicks, mediaType) { if (window.MediaSource == null) { @@ -170,7 +144,6 @@ import events from 'events'; var seconds = (ticks || 0) / 10000000; if (seconds) { - var src = (instance.currentSrc() || '').toLowerCase(); // Appending #t=xxx to the query string doesn't seem to work with HLS // For plain video files, not all browsers support it either diff --git a/src/components/imageDownloader/imageDownloader.js b/src/components/imageDownloader/imageDownloader.js index fbe98c532f..6d5b370bb0 100644 --- a/src/components/imageDownloader/imageDownloader.js +++ b/src/components/imageDownloader/imageDownloader.js @@ -270,7 +270,6 @@ define(['dom', 'loading', 'apphost', 'dialogHelper', 'connectionManager', 'image // end footer html += ''; - //html += ''; html += ''; diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js index 922b6abc20..5193e6d1fb 100644 --- a/src/components/listview/listview.js +++ b/src/components/listview/listview.js @@ -270,8 +270,6 @@ import 'emby-playstatebutton'; } if (!clickEntireItem && options.dragHandle) { - //html += ''; - // Firefox and Edge are not allowing the button to be draggable html += ''; } diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index 0d31c2958a..79dd883fcd 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -16,9 +16,6 @@ import 'emby-button'; return false; } - function getTabsContainerElem() { - } - function ensureElements(enableInFooter) { if (enableInFooter) { @@ -27,7 +24,6 @@ import 'emby-button'; footerTabsContainer.classList.add('footerTabs'); footerTabsContainer.classList.add('sectionTabs'); footerTabsContainer.classList.add('hide'); - //appFooter.add(footerTabsContainer); } } @@ -75,7 +71,6 @@ import 'emby-button'; } // implement without hammer - const pageCount = getTabContainersFn().length; const onSwipeLeft = function (e, target) { if (allowSwipe(target) && view.contains(target)) { tabsElem.selectNext(); @@ -193,12 +188,6 @@ import 'emby-button'; const newPanel = tabContainers[e.detail.selectedTabIndex]; - //if (e.detail.previousIndex != null && e.detail.previousIndex != e.detail.selectedTabIndex) { - // if (newPanel.animate && (animateTabs || []).indexOf(e.detail.selectedTabIndex) != -1) { - // fadeInRight(newPanel); - // } - //} - if (newPanel) { newPanel.classList.add('is-active'); } @@ -221,10 +210,6 @@ import 'emby-button'; } } - //if (enableSwipe !== false) { - // libraryBrowser.configureSwipeTabs(ownerpage, tabs); - //} - return { tabsContainer: tabsContainerElem, tabs: tabsContainerElem.querySelector('[is="emby-tabs"]'), diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index 71acc5bbce..b55b58e63c 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -568,10 +568,6 @@ import 'emby-button'; }); } - //if (mediaSource.Container) { - // html += '
' + mediaSource.Container + '
'; - //} - const resolutionText = getResolutionText(videoStream); if (resolutionText) { list.push({ diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index 87696909af..3c0495b887 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -580,10 +580,9 @@ import 'css!./multiSelect'; 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, 'touchcancel', onTouchEnd, { + passive: true + }); dom.removeEventListener(element, 'mousedown', onMouseDown, { passive: true }); diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index c8480e4f15..556d380625 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -101,11 +101,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir body: body, vibrate: true, tag: 'newItem' + item.Id, - data: { - //options: { - // url: LibraryBrowser.getHref(item) - //} - } + data: {} }; var imageTags = item.ImageTags || {}; diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index fe3ff11250..8bedcb973e 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -777,7 +777,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla var players = []; var currentTargetInfo; - var lastLocalPlayer; var currentPairingId = null; this._playNextAfterEnded = true; @@ -1031,10 +1030,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla console.debug('Active player: ' + JSON.stringify(targetInfo)); } - if (player && player.isLocalPlayer) { - lastLocalPlayer = player; - } - if (previousPlayer) { self.endPlayerUpdates(previousPlayer); } @@ -4076,8 +4071,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla this.setSubtitleStreamIndex(parseInt(cmd.Arguments.Index), player); break; case 'SetMaxStreamingBitrate': - // todo - //this.setMaxStreamingBitrate(parseInt(cmd.Arguments.Bitrate), player); + this.setMaxStreamingBitrate(parseInt(cmd.Arguments.Bitrate), player); break; case 'ToggleFullscreen': this.toggleFullscreen(player); diff --git a/src/components/playback/playerSelectionMenu.js b/src/components/playback/playerSelectionMenu.js index 298ae0b07e..aa0bba533c 100644 --- a/src/components/playback/playerSelectionMenu.js +++ b/src/components/playback/playerSelectionMenu.js @@ -182,7 +182,6 @@ function disconnectFromPlayer(currentDeviceName) { dialog({ buttons: menuItems, - //positionTo: positionTo, text: globalize.translate('ConfirmEndPlayerSession', currentDeviceName) }).then(function (id) { diff --git a/src/components/playback/playersettingsmenu.js b/src/components/playback/playersettingsmenu.js index 33d252c52a..88147af6cd 100644 --- a/src/components/playback/playersettingsmenu.js +++ b/src/components/playback/playersettingsmenu.js @@ -88,8 +88,6 @@ function showRepeatModeMenu(player, btn) { function getQualitySecondaryText(player) { var state = playbackManager.getPlayerState(player); - var isAutoEnabled = playbackManager.enableAutomaticBitrateDetection(player); - var currentMaxBitrate = playbackManager.getMaxStreamingBitrate(player); var videoStream = playbackManager.currentMediaSource(player).MediaStreams.filter(function (stream) { return stream.Type === 'Video'; @@ -106,20 +104,6 @@ function getQualitySecondaryText(player) { enableAuto: true }); - var menuItems = options.map(function (o) { - var opt = { - name: o.name, - id: o.bitrate, - asideText: o.secondaryText - }; - - if (o.selected) { - opt.selected = true; - } - - return opt; - }); - var selectedOption = options.filter(function (o) { return o.selected; }); @@ -168,7 +152,6 @@ function showAspectRatioMenu(player, btn) { function showWithUser(options, player, user) { var supportedCommands = playbackManager.getSupportedCommands(player); - var mediaType = options.mediaType; var menuItems = []; if (supportedCommands.indexOf('SetAspectRatio') !== -1) { diff --git a/src/components/playerstats/playerstats.js b/src/components/playerstats/playerstats.js index fce37c1507..2aac91f0d9 100644 --- a/src/components/playerstats/playerstats.js +++ b/src/components/playerstats/playerstats.js @@ -132,7 +132,6 @@ import 'css!./playerstats'; let audioChannels; if (session.TranscodingInfo) { - videoCodec = session.TranscodingInfo.VideoCodec; audioCodec = session.TranscodingInfo.AudioCodec; totalBitrate = session.TranscodingInfo.Bitrate; @@ -140,7 +139,6 @@ import 'css!./playerstats'; } if (videoCodec) { - sessionStats.push({ label: globalize.translate('LabelVideoCodec'), value: session.TranscodingInfo.IsVideoDirect ? (videoCodec.toUpperCase() + ' (direct)') : videoCodec.toUpperCase() @@ -148,20 +146,18 @@ import 'css!./playerstats'; } if (audioCodec) { - sessionStats.push({ label: globalize.translate('LabelAudioCodec'), value: session.TranscodingInfo.IsAudioDirect ? (audioCodec.toUpperCase() + ' (direct)') : audioCodec.toUpperCase() }); } - //if (audioChannels) { - - // sessionStats.push({ - // label: 'Audio channels:', - // value: audioChannels - // }); - //} + if (audioChannels) { + sessionStats.push({ + label: globalize.translate('LabelAudioChannels'), + value: audioChannels + }); + } if (displayPlayMethod === 'Transcode') { if (totalBitrate) { diff --git a/src/components/qualityOptions.js b/src/components/qualityOptions.js index 221e13d4ef..c831bbe9b4 100644 --- a/src/components/qualityOptions.js +++ b/src/components/qualityOptions.js @@ -14,7 +14,6 @@ define(['globalize'], function (globalize) { } var maxAllowedWidth = videoWidth || 4096; - //var maxAllowedHeight = videoHeight || 2304; var qualityOptions = []; diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js index c3f40fcddb..02e8a61b90 100644 --- a/src/components/recordingcreator/recordingeditor.js +++ b/src/components/recordingcreator/recordingeditor.js @@ -19,9 +19,6 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c } function renderTimer(context, item, apiClient) { - - var program = item.ProgramInfo || {}; - context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js index a101ce53ec..df786df48c 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.js +++ b/src/components/recordingcreator/seriesrecordingeditor.js @@ -20,8 +20,6 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c function renderTimer(context, item, apiClient) { - var program = item.ProgramInfo || {}; - context.querySelector('#txtPrePaddingMinutes').value = item.PrePaddingSeconds / 60; context.querySelector('#txtPostPaddingMinutes').value = item.PostPaddingSeconds / 60; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 874137155c..2a025b497d 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -222,7 +222,6 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL } function setImageUrl(context, state, url) { - currentImgUrl = url; var item = state.NowPlayingItem; var imgContainer = context.querySelector('.nowPlayingPageImageContainer'); @@ -257,7 +256,6 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL } } - var currentImgUrl; return function () { function toggleRepeat() { switch (playbackManager.getRepeatMode()) { @@ -909,7 +907,6 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL } function onShow(context, tab) { - currentImgUrl = null; bindToPlayer(context, playbackManager.getCurrentPlayer()); } diff --git a/src/components/sanitizeFilename.js b/src/components/sanitizeFilename.js index de7b1a0782..ffea2a0a6c 100644 --- a/src/components/sanitizeFilename.js +++ b/src/components/sanitizeFilename.js @@ -1,3 +1,4 @@ +// TODO: Check if needed and move to external dependency // From https://github.com/parshap/node-sanitize-filename const illegalRe = /[\/\?<>\\:\*\|":]/g; diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index f7026a007e..6a9e4a4cd3 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -130,8 +130,6 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f var hideTimeout; /** Last coordinates of the mouse pointer. */ var lastMouseMoveData; - /** Visibility status of the OSD. */ - var _osdOpen = false; // Use autoplay on Chromecast since it is non-interactive. if (browser.chromecast) options.interactive = false; @@ -363,8 +361,6 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f function getSwiperSlideHtmlFromItem(item) { return getSwiperSlideHtmlFromSlide({ originalImage: getImgUrl(item, currentOptions.user), - //title: item.Name, - //description: item.Overview Id: item.Id, ServerId: item.ServerId }); @@ -545,7 +541,6 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f return; } - _osdOpen = true; element.classList.remove('hide'); var onFinish = function () { @@ -578,7 +573,6 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f var onFinish = function () { element.classList.add('hide'); - _osdOpen = false; }; if (!element.animate) { diff --git a/src/components/sortmenu/sortmenu.js b/src/components/sortmenu/sortmenu.js index dbf7ef1a7f..82e47a2cb9 100644 --- a/src/components/sortmenu/sortmenu.js +++ b/src/components/sortmenu/sortmenu.js @@ -90,13 +90,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutMana var submitted; dlg.querySelector('form').addEventListener('change', function () { - submitted = true; - //if (options.onChange) { - // saveValues(dlg, options.settings, options.settingsKey); - // options.onChange(); - //} - }, true); dialogHelper.open(dlg).then(function () { @@ -106,11 +100,8 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'layoutMana } if (submitted) { - - //if (!options.onChange) { saveValues(dlg, options.settings, options.settingsKey); resolve(); - //} return; } diff --git a/src/components/subtitleeditor/subtitleeditor.js b/src/components/subtitleeditor/subtitleeditor.js index 9c0992c53c..89b46fed2d 100644 --- a/src/components/subtitleeditor/subtitleeditor.js +++ b/src/components/subtitleeditor/subtitleeditor.js @@ -4,43 +4,6 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', var currentItem; var hasChanges; - function showLocalSubtitles(context, index) { - - loading.show(); - - var subtitleContent = context.querySelector('.subtitleContent'); - subtitleContent.innerHTML = ''; - - var apiClient = connectionManager.getApiClient(currentItem.ServerId); - var url = 'Videos/' + currentItem.Id + '/Subtitles/' + index; - - apiClient.ajax({ - - type: 'GET', - url: url - - }).then(function (result) { - - subtitleContent.innerHTML = result; - - loading.hide(); - }); - } - - function showRemoteSubtitles(context, id) { - - loading.show(); - - var url = 'Providers/Subtitles/Subtitles/' + id; - - ApiClient.get(ApiClient.getUrl(url)).then(function (result) { - - // show result - - loading.hide(); - }); - } - function downloadRemoteSubtitles(context, id) { var url = 'Items/' + currentItem.Id + '/RemoteSearch/Subtitles/' + id; @@ -170,14 +133,6 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', elem.classList.add('hide'); } elem.innerHTML = html; - - //('.btnViewSubtitles', elem).on('click', function () { - - // var index = this.getAttribute('data-index'); - - // showLocalSubtitles(context, index); - - //}); } function fillLanguages(context, apiClient, languages) { @@ -250,8 +205,6 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', html += '
'; - //html += ''; - html += '
' + (result.Name) + '
'; html += '
'; if (!layoutManager.tv) { @@ -290,12 +241,6 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', var elem = context.querySelector('.subtitleResults'); elem.innerHTML = html; - //('.btnViewSubtitle', elem).on('click', function () { - - // var id = this.getAttribute('data-subid'); - // showRemoteSubtitles(context, id); - //}); - loading.hide(); } @@ -369,11 +314,10 @@ define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', } function onSubtitleResultsClick(e) { - - var btnOptions = dom.parentWithClass(e.target, 'btnOptions'); var subtitleId; var context; + var btnOptions = dom.parentWithClass(e.target, 'btnOptions'); if (btnOptions) { subtitleId = btnOptions.getAttribute('data-subid'); context = dom.parentWithClass(btnOptions, 'subtitleEditorDialog'); diff --git a/src/components/tabbedview/itemstab.js b/src/components/tabbedview/itemstab.js index d40faef5dc..81f86d5808 100644 --- a/src/components/tabbedview/itemstab.js +++ b/src/components/tabbedview/itemstab.js @@ -286,9 +286,6 @@ define(['playbackManager', 'userSettings', 'alphaPicker', 'alphaNumericShortcuts bindAll(view.querySelectorAll('.btnShuffle'), 'click', shuffle.bind(this)); } - function getSettingValue(key, defaultValue) { - } - ItemsTab.prototype.getViewSettings = function () { var basekey = this.getSettingsKey(); @@ -507,16 +504,10 @@ define(['playbackManager', 'userSettings', 'alphaPicker', 'alphaNumericShortcuts }; ItemsTab.prototype.getFilterMenuOptions = function () { - - var params = this.params; - - return { - - }; + return {}; }; ItemsTab.prototype.getItemTypes = function () { - return []; }; diff --git a/src/components/themeMediaPlayer.js b/src/components/themeMediaPlayer.js index 94012ba823..eafe48230c 100644 --- a/src/components/themeMediaPlayer.js +++ b/src/components/themeMediaPlayer.js @@ -100,12 +100,12 @@ define(['playbackManager', 'userSettings', 'connectionManager'], function (playb }, true); - //Events.on(playbackManager, 'playbackstart', function (e, player) { - // var item = playbackManager.currentItem(player); - // // User played something manually - // if (currentThemeIds.indexOf(item.Id) == -1) { - // currentOwnerId = null; - // } - //}); + Events.on(playbackManager, 'playbackstart', function (e, player) { + var item = playbackManager.currentItem(player); + // User played something manually + if (currentThemeIds.indexOf(item.Id) == -1) { + currentOwnerId = null; + } + }); }); diff --git a/src/components/userdatabuttons/userdatabuttons.js b/src/components/userdatabuttons/userdatabuttons.js index 86b9902133..014655835b 100644 --- a/src/components/userdatabuttons/userdatabuttons.js +++ b/src/components/userdatabuttons/userdatabuttons.js @@ -112,22 +112,6 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto } } - //var tooltipLike = globalize.translate('Like'); - //var tooltipDislike = globalize.translate('Dislike'); - - //if (typeof userData.Likes == "undefined") { - // html += getUserDataButtonHtml('markDislike', itemId, serverId, btnCssClass + ' btnUserData btnDislike', 'thumb-down', tooltipDislike); - // html += getUserDataButtonHtml('markLike', itemId, serverId, btnCssClass + ' btnUserData btnLike', 'thumb-up', tooltipLike); - //} - //else if (userData.Likes) { - // html += getUserDataButtonHtml('markDislike', itemId, serverId, btnCssClass + ' btnUserData btnDislike', 'thumb-down', tooltipDislike); - // html += getUserDataButtonHtml('markLike', itemId, serverId, btnCssClass + ' btnUserData btnLike btnUserDataOn', 'thumb-up', tooltipLike); - //} - //else { - // html += getUserDataButtonHtml('markDislike', itemId, serverId, btnCssClass + ' btnUserData btnDislike btnUserDataOn', 'thumb-down', tooltipDislike); - // html += getUserDataButtonHtml('markLike', itemId, serverId, btnCssClass + ' btnUserData btnLike', 'thumb-up', tooltipLike); - //} - var tooltipFavorite = globalize.translate('Favorite'); if (userData.IsFavorite) { diff --git a/src/components/viewManager/viewManager.js b/src/components/viewManager/viewManager.js index 8e17264f9f..97aaa7ddd7 100644 --- a/src/components/viewManager/viewManager.js +++ b/src/components/viewManager/viewManager.js @@ -21,11 +21,10 @@ define(['viewContainer', 'focusManager', 'queryString', 'layoutManager'], functi if (!newView.initComplete) { newView.initComplete = true; - var controller; if (typeof options.controllerFactory === 'function') { - controller = new options.controllerFactory(newView, eventDetail.detail.params); + new options.controllerFactory(newView, eventDetail.detail.params); } else if (options.controllerFactory && typeof options.controllerFactory.default === 'function') { - controller = new options.controllerFactory.default(newView, eventDetail.detail.params); + new options.controllerFactory.default(newView, eventDetail.detail.params); } if (!options.controllerFactory || dispatchPageEvents) { diff --git a/src/controllers/auth/selectserver.js b/src/controllers/auth/selectserver.js index 3e36b74859..cd2d48372d 100644 --- a/src/controllers/auth/selectserver.js +++ b/src/controllers/auth/selectserver.js @@ -95,11 +95,6 @@ import 'emby-button'; } } - function showGeneralError() { - loading.hide(); - alertText(globalize.translate('DefaultErrorMessage')); - } - function alertText(text) { alertTextWithOptions({ text: text diff --git a/src/controllers/dashboard/plugins/available.js b/src/controllers/dashboard/plugins/available.js index 37df8801b5..1f202d6ff6 100644 --- a/src/controllers/dashboard/plugins/available.js +++ b/src/controllers/dashboard/plugins/available.js @@ -34,7 +34,6 @@ define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby var availablePlugins = options.availablePlugins; var installedPlugins = options.installedPlugins; - var categories = []; availablePlugins.forEach(function (plugin, index, array) { plugin.category = plugin.category || 'General'; plugin.categoryDisplayName = getHeaderText(plugin.category); diff --git a/src/controllers/dashboard/users/userprofilespage.js b/src/controllers/dashboard/users/userprofilespage.js index dbdec4f752..824baef4cf 100644 --- a/src/controllers/dashboard/users/userprofilespage.js +++ b/src/controllers/dashboard/users/userprofilespage.js @@ -155,102 +155,12 @@ import 'flexStyles'; page.querySelector('.localUsers').innerHTML = getUserSectionHtml(users, true); } - function showPendingUserMenu(elem) { - const menuItems = []; - menuItems.push({ - name: globalize.translate('ButtonCancel'), - id: 'delete', - icon: 'delete' - }); - - import('actionsheet').then(({default: actionsheet}) => { - const card = dom.parentWithClass(elem, 'card'); - const page = dom.parentWithClass(card, 'page'); - const id = card.getAttribute('data-id'); - actionsheet.show({ - items: menuItems, - positionTo: card, - callback: function (menuItemId) { - switch (menuItemId) { - case 'delete': - cancelAuthorization(page, id); - } - } - }); - }); - } - - function getPendingUserHtml(user) { - let html = ''; - html += "
"; - html += '
'; - html += ''; - html += '
'; - html += '
'; - html += ''; - html += '
'; - html += '
'; - html += user.UserName; - html += '
'; - html += '
'; - html += '
'; - return html + '
'; - } - - function renderPendingGuests(page, users) { - if (users.length) { - page.querySelector('.sectionPendingGuests').classList.remove('hide'); - } else { - page.querySelector('.sectionPendingGuests').classList.add('hide'); - } - - 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', { - Id: id - }) - }).then(function () { - loadData(page); - }); - } - function loadData(page) { loading.show(); ApiClient.getUsers().then(function (users) { renderUsers(page, users); loading.hide(); }); - // TODO cvium - renderPendingGuests(page, []); - // ApiClient.getJSON(ApiClient.getUrl("Connect/Pending")).then(function (pending) { - // - // }); - } - - function showInvitePopup(page) { - import('components/guestinviter/guestinviter').then(({default: guestinviter}) => { - guestinviter.show().then(function () { - loadData(page); - }); - }); } pageIdOn('pageinit', 'userProfilesPage', function () { @@ -265,14 +175,8 @@ import 'flexStyles'; showUserMenu(btnUserMenu); } }); - page.querySelector('.pending').addEventListener('click', function (e__r) { - const btnUserMenu = dom.parentWithClass(e__r.target, 'btnUserMenu'); - - if (btnUserMenu) { - showPendingUserMenu(btnUserMenu); - } - }); }); + pageIdOn('pagebeforeshow', 'userProfilesPage', function () { loadData(this); }); diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index b4c7936239..51c4301a71 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -170,8 +170,7 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap function getItemsHtmlFn(section) { return function (items) { - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = (appHost.preferVisualCards || supportsImageAnalysis) && section.autoCardLayout && section.showTitle; + var cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle; cardLayout = false; var serverId = this.apiClient.serverId(); var leadingButtons = layoutManager.tv ? [{ diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 011bc4ac92..ff65000751 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -1678,6 +1678,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti require(['alert'], function (alert) { alert.default({ text: globalize.translate('AddItemToCollectionHelp'), + // TODO: Change to Jellyfin docs html: globalize.translate('AddItemToCollectionHelp') + '

' + globalize.translate('ButtonLearnMore') + '' }); }); diff --git a/src/controllers/livetv/livetvrecordings.js b/src/controllers/livetv/livetvrecordings.js index d5cfe66672..d832ca1339 100644 --- a/src/controllers/livetv/livetvrecordings.js +++ b/src/controllers/livetv/livetvrecordings.js @@ -24,7 +24,6 @@ define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'sc recordingItems.classList.add('vertical-wrap'); } - appHost.supports('imageanalysis'); recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ items: recordings, shape: scrollX ? 'autooverflow' : 'auto', diff --git a/src/controllers/livetv/livetvschedule.js b/src/controllers/livetv/livetvschedule.js index a6f509c6f1..9668d59d9f 100644 --- a/src/controllers/livetv/livetvschedule.js +++ b/src/controllers/livetv/livetvschedule.js @@ -30,17 +30,14 @@ define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'sc recordingItems.classList.add('vertical-wrap'); } - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = appHost.preferVisualCards || supportsImageAnalysis; - cardLayout = false; recordingItems.innerHTML = cardBuilder.getCardsHtml(Object.assign({ items: recordings, shape: enableScrollX() ? 'autooverflow' : 'auto', showTitle: true, showParentTitle: true, coverImage: true, - cardLayout: cardLayout, - centerText: !cardLayout, + cardLayout: appHost.preferVisualCards, + centerText: !appHost.preferVisualCards, allowBottomPadding: !enableScrollX(), preferThumb: 'auto' }, cardOptions || {})); diff --git a/src/controllers/livetv/livetvseriestimers.js b/src/controllers/livetv/livetvseriestimers.js index 27daca1983..c5d0da60d7 100644 --- a/src/controllers/livetv/livetvseriestimers.js +++ b/src/controllers/livetv/livetvseriestimers.js @@ -3,7 +3,6 @@ define(['datetime', 'cardBuilder', 'imageLoader', 'apphost', 'loading', 'paper-i function renderTimers(context, timers) { var html = ''; - appHost.supports('imageanalysis'); html += cardBuilder.getCardsHtml({ items: timers, shape: 'auto', diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index ab410c1bd4..8c86ccf379 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -75,7 +75,6 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader ParentId: params.topParentId }; ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { - var supportsImageAnalysis = appHost.supports('imageanalysis'); if (viewStyle == 'Thumb') { cardBuilder.buildCards(result.Items, { diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index d948c1cef7..4ffe7888cf 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -346,8 +346,6 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' function loadTab(page, index) { currentTabIndex = index; getTabController(page, index, function (controller) { - initialTabIndex = null; - if (renderedTabs.indexOf(index) == -1) { renderedTabs.push(index); controller.renderTab(); @@ -370,10 +368,8 @@ define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu' } } - var isViewRestored; var self = this; var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); - var initialTabIndex = currentTabIndex; var suggestionsTabIndex = 1; self.initTab = function () { @@ -389,7 +385,8 @@ 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')) { + initTabs(); + if (!view.getAttribute('data-title')) { var parentId = params.topParentId; if (parentId) { diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index 3f025799f6..0eecef0bfb 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -41,8 +41,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' }; 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, showUnplayedIndicator: false, @@ -51,10 +50,10 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' showTitle: true, showParentTitle: true, lazy: true, - centerText: !supportsImageAnalysis, - overlayPlayButton: !supportsImageAnalysis, + centerText: true, + overlayPlayButton: true, allowBottomPadding: !enableScrollX(), - cardLayout: supportsImageAnalysis, + cardLayout: false, coverImage: true }); imageLoader.lazyChildren(elem); @@ -90,8 +89,6 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' } var itemsContainer = elem.querySelector('.itemsContainer'); - var supportsImageAnalysis = appHost.supports('imageanalysis'); - supportsImageAnalysis = false; itemsContainer.innerHTML = cardBuilder.getCardsHtml({ items: result.Items, showUnplayedIndicator: false, @@ -100,10 +97,10 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' showParentTitle: true, action: 'instantmix', lazy: true, - centerText: !supportsImageAnalysis, - overlayMoreButton: !supportsImageAnalysis, + centerText: true, + overlayMoreButton: true, allowBottomPadding: !enableScrollX(), - cardLayout: supportsImageAnalysis, + cardLayout: false, coverImage: true }); imageLoader.lazyChildren(itemsContainer); @@ -134,8 +131,6 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' } var itemsContainer = elem.querySelector('.itemsContainer'); - var supportsImageAnalysis = appHost.supports('imageanalysis'); - supportsImageAnalysis = false; itemsContainer.innerHTML = cardBuilder.getCardsHtml({ items: result.Items, showUnplayedIndicator: false, @@ -144,10 +139,10 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' showParentTitle: true, action: 'instantmix', lazy: true, - centerText: !supportsImageAnalysis, - overlayMoreButton: !supportsImageAnalysis, + centerText: true, + overlayMoreButton: true, allowBottomPadding: !enableScrollX(), - cardLayout: supportsImageAnalysis, + cardLayout: false, coverImage: true }); imageLoader.lazyChildren(itemsContainer); @@ -339,8 +334,6 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' function loadTab(page, index) { currentTabIndex = index; getTabController(page, index, function (controller) { - initialTabIndex = null; - if (renderedTabs.indexOf(index) == -1) { renderedTabs.push(index); controller.renderTab(); @@ -356,10 +349,8 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' } } - var isViewRestored; var self = this; var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); - var initialTabIndex = currentTabIndex; self.initTab = function () { var tabContent = view.querySelector(".pageTabContent[data-index='0']"); @@ -377,7 +368,6 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' var tabControllers = []; var renderedTabs = []; view.addEventListener('viewshow', function (e) { - isViewRestored = e.detail.isRestored; initTabs(); if (!view.getAttribute('data-title')) { var parentId = params.topParentId; diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index d686a62197..52906fb774 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -85,8 +85,6 @@ import 'emby-button'; ParentId: params.topParentId }; ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { - const supportsImageAnalysis = appHost.supports('imageanalysis'); - if (viewStyle == 'Thumb') { cardBuilder.buildCards(result.Items, { itemsContainer: elem, diff --git a/src/controllers/shows/tvlatest.js b/src/controllers/shows/tvlatest.js index c08f3d5a15..bcc870e366 100644 --- a/src/controllers/shows/tvlatest.js +++ b/src/controllers/shows/tvlatest.js @@ -1,7 +1,6 @@ import loading from 'loading'; import groupedcards from 'components/groupedcards'; import cardBuilder from 'cardBuilder'; -import appHost from 'apphost'; import imageLoader from 'imageLoader'; /* eslint-disable indent */ @@ -23,8 +22,7 @@ import imageLoader from 'imageLoader'; function loadLatest(context, params, promise) { promise.then(function (items) { - let html = ''; - appHost.supports('imageanalysis'); + var html = ''; html += cardBuilder.getCardsHtml({ items: items, shape: 'backdrop', diff --git a/src/controllers/shows/tvrecommended.js b/src/controllers/shows/tvrecommended.js index 7edd2ab501..4aab69e978 100644 --- a/src/controllers/shows/tvrecommended.js +++ b/src/controllers/shows/tvrecommended.js @@ -269,8 +269,6 @@ import 'emby-button'; function loadTab(page, index) { currentTabIndex = index; getTabController(page, index, function (controller) { - initialTabIndex = null; - if (renderedTabs.indexOf(index) == -1) { renderedTabs.push(index); controller.renderTab(); @@ -301,10 +299,8 @@ import 'emby-button'; } } - let isViewRestored; const self = this; let currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); - let initialTabIndex = currentTabIndex; self.initTab = function () { const tabContent = self.tabContent; @@ -319,7 +315,6 @@ import 'emby-button'; let renderedTabs = []; setScrollClasses(view.querySelector('#resumableItems'), enableScrollX()); view.addEventListener('viewshow', function (e) { - isViewRestored = e.detail.isRestored; initTabs(); if (!view.getAttribute('data-title')) { const parentId = params.topParentId; diff --git a/src/controllers/shows/tvupcoming.js b/src/controllers/shows/tvupcoming.js index a2016279b8..f9df3df343 100644 --- a/src/controllers/shows/tvupcoming.js +++ b/src/controllers/shows/tvupcoming.js @@ -1,9 +1,7 @@ import layoutManager from 'layoutManager'; import loading from 'loading'; import datetime from 'datetime'; -import libraryBrowser from 'libraryBrowser'; import cardBuilder from 'cardBuilder'; -import appHost from 'apphost'; import imageLoader from 'imageLoader'; import globalize from 'globalize'; import 'scrollStyles'; @@ -106,8 +104,6 @@ import 'emby-itemscontainer'; html += '
'; } - let supportsImageAnalysis = appHost.supports('imageanalysis'); - supportsImageAnalysis = false; html += cardBuilder.getCardsHtml({ items: group.items, showLocationTypeIndicator: false, @@ -116,11 +112,11 @@ import 'emby-itemscontainer'; preferThumb: true, lazy: true, showDetailsMenu: true, - centerText: !supportsImageAnalysis, + centerText: true, showParentTitle: true, overlayText: false, allowBottomPadding: allowBottomPadding, - cardLayout: supportsImageAnalysis, + cardLayout: false, overlayMoreButton: true, missingIndicator: false }); diff --git a/src/controllers/user/home.js b/src/controllers/user/home.js index e7058fd3ac..f811aa52b9 100644 --- a/src/controllers/user/home.js +++ b/src/controllers/user/home.js @@ -1,7 +1,4 @@ import HomescreenSettings from 'homescreenSettings'; -import dom from 'dom'; -import globalize from 'globalize'; -import loading from 'loading'; import * as userSettings from 'userSettings'; import autoFocuser from 'autoFocuser'; import 'listViewStyle'; diff --git a/src/controllers/user/playback.js b/src/controllers/user/playback.js index 5bcf055cd3..16c50a1980 100644 --- a/src/controllers/user/playback.js +++ b/src/controllers/user/playback.js @@ -1,7 +1,4 @@ import PlaybackSettings from 'playbackSettings'; -import dom from 'dom'; -import globalize from 'globalize'; -import loading from 'loading'; import * as userSettings from 'userSettings'; import autoFocuser from 'autoFocuser'; import 'listViewStyle'; diff --git a/src/elements/emby-collapse/emby-collapse.js b/src/elements/emby-collapse/emby-collapse.js index f980f19af0..733333df77 100644 --- a/src/elements/emby-collapse/emby-collapse.js +++ b/src/elements/emby-collapse/emby-collapse.js @@ -11,11 +11,7 @@ import 'emby-button'; elem.classList.remove('hide'); elem.classList.add('expanded'); elem.style.height = 'auto'; - const height = elem.offsetHeight + 'px'; - elem.style.height = '0'; - - // trigger reflow - const newHeight = elem.offsetHeight; + var height = elem.offsetHeight + 'px'; elem.style.height = height; setTimeout(function () { @@ -28,15 +24,12 @@ import 'emby-button'; }, 300); const icon = button.querySelector('.material-icons'); - //icon.innerHTML = 'expand_less'; icon.classList.add('emby-collapse-expandIconExpanded'); } function slideUpToHide(button, elem) { elem.style.height = elem.offsetHeight + 'px'; - // trigger reflow - const newHeight = elem.offsetHeight; elem.classList.remove('expanded'); elem.style.height = '0'; @@ -50,7 +43,6 @@ import 'emby-button'; }, 300); const icon = button.querySelector('.material-icons'); - //icon.innerHTML = 'expand_more'; icon.classList.remove('emby-collapse-expandIconExpanded'); } diff --git a/src/elements/emby-itemscontainer/emby-itemscontainer.js b/src/elements/emby-itemscontainer/emby-itemscontainer.js index 1d4a67717a..608449f30f 100644 --- a/src/elements/emby-itemscontainer/emby-itemscontainer.js +++ b/src/elements/emby-itemscontainer/emby-itemscontainer.js @@ -18,7 +18,6 @@ import 'webcomponents'; function onClick(e) { const itemsContainer = this; - const target = e.target; let multiSelect = itemsContainer.multiSelect; if (multiSelect) { diff --git a/src/elements/emby-progressring/emby-progressring.js b/src/elements/emby-progressring/emby-progressring.js index 062f64d78b..838816579c 100644 --- a/src/elements/emby-progressring/emby-progressring.js +++ b/src/elements/emby-progressring/emby-progressring.js @@ -13,23 +13,22 @@ import 'webcomponents'; import('text!./emby-progressring.template.html').then(({default: template}) => { instance.innerHTML = template; - //if (window.MutationObserver) { - // // create an observer instance - // var observer = new MutationObserver(function (mutations) { - // mutations.forEach(function (mutation) { + if (window.MutationObserver) { + // create an observer instance + var observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + instance.setProgress(parseFloat(instance.getAttribute('data-progress') || '0')); + }); + }); - // instance.setProgress(parseFloat(instance.getAttribute('data-progress') || '0')); - // }); - // }); + // configuration of the observer: + var config = { attributes: true, childList: false, characterData: false }; - // // configuration of the observer: - // var config = { attributes: true, childList: false, characterData: false }; + // pass in the target node, as well as the observer options + observer.observe(instance, config); - // // pass in the target node, as well as the observer options - // observer.observe(instance, config); - - // instance.observer = observer; - //} + instance.observer = observer; + } instance.setProgress(parseFloat(instance.getAttribute('data-progress') || '0')); }); diff --git a/src/elements/emby-radio/emby-radio.js b/src/elements/emby-radio/emby-radio.js index c8437d77e3..7d53eb6ad4 100644 --- a/src/elements/emby-radio/emby-radio.js +++ b/src/elements/emby-radio/emby-radio.js @@ -37,7 +37,6 @@ import 'webcomponents'; this.classList.add('mdl-radio__button'); let labelElement = this.parentNode; - //labelElement.classList.add('"mdl-radio mdl-js-radio mdl-js-ripple-effect'); labelElement.classList.add('mdl-radio'); labelElement.classList.add('mdl-js-radio'); labelElement.classList.add('mdl-js-ripple-effect'); diff --git a/src/elements/emby-ratingbutton/emby-ratingbutton.js b/src/elements/emby-ratingbutton/emby-ratingbutton.js index b455495a2e..42cd69775a 100644 --- a/src/elements/emby-ratingbutton/emby-ratingbutton.js +++ b/src/elements/emby-ratingbutton/emby-ratingbutton.js @@ -78,7 +78,6 @@ import EmbyButtonPrototype from 'emby-button'; if (icon) { icon.classList.add('favorite'); icon.classList.remove('ratingbutton-icon-withrating'); - //icon.innerHTML = 'thumb_up'; } button.classList.remove('ratingbutton-withrating'); @@ -87,7 +86,6 @@ import EmbyButtonPrototype from 'emby-button'; if (icon) { icon.classList.add('favorite'); icon.classList.remove('ratingbutton-icon-withrating'); - //icon.innerHTML = 'thumb_down'; } button.classList.remove('ratingbutton-withrating'); @@ -96,7 +94,6 @@ import EmbyButtonPrototype from 'emby-button'; if (icon) { icon.classList.add('favorite'); icon.classList.remove('ratingbutton-icon-withrating'); - //icon.innerHTML = 'thumbs_up_down'; } button.classList.remove('ratingbutton-withrating'); } diff --git a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js index 239fbcfcda..fcff587392 100644 --- a/src/elements/emby-scrollbuttons/emby-scrollbuttons.js +++ b/src/elements/emby-scrollbuttons/emby-scrollbuttons.js @@ -36,6 +36,7 @@ const EmbyScrollButtonsPrototype = Object.create(HTMLDivElement.prototype); } function updateScrollButtons(scrollButtons, scrollSize, scrollPos, scrollWidth) { + // TODO: Check if hack is really needed // hack alert add twenty for rounding errors if (scrollWidth <= scrollSize + 20) { scrollButtons.scrollButtonsLeft.classList.add('hide'); @@ -122,7 +123,6 @@ const EmbyScrollButtonsPrototype = Object.create(HTMLDivElement.prototype); const direction = this.getAttribute('data-direction'); const scrollSize = getScrollSize(scroller); const scrollPos = getScrollPosition(scroller); - const scrollWidth = getScrollWidth(scroller); let newPos; if (direction === 'left') { diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index e872f6c78b..682e99b201 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -146,8 +146,9 @@ import 'emby-input'; return; } + // TODO: Not sure what this is trying to accomplish. if (enableWidthWithTransform == null) { - //enableWidthWithTransform = browser.supportsCssAnimation(); + enableWidthWithTransform = browser.supportsCssAnimation(); } this.setAttribute('data-embyslider', 'true'); diff --git a/src/elements/emby-tabs/emby-tabs.js b/src/elements/emby-tabs/emby-tabs.js index f3cd9d38cc..ad96290498 100644 --- a/src/elements/emby-tabs/emby-tabs.js +++ b/src/elements/emby-tabs/emby-tabs.js @@ -29,13 +29,6 @@ import 'scrollStyles'; } } - function addActivePanelClass(tabs, index) { - let tabPanel = getTabPanel(tabs, index); - if (tabPanel) { - tabPanel.classList.add('is-active'); - } - } - function fadeInRight(elem) { const pct = browser.mobile ? '4%' : '0.5%'; @@ -263,7 +256,6 @@ import 'scrollStyles'; onClick.call(tabs, { target: tabButtons[selected] }); - //tabButtons[selected].click(); } }; @@ -330,8 +322,6 @@ import 'scrollStyles'; }; EmbyTabs.setTabEnabled = function (index, enabled) { - - const tabs = this; const btn = this.querySelector('.emby-tab-button[data-index="' + index + '"]'); if (enabled) { diff --git a/src/elements/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js index d98cc8c07e..9036a57f1e 100644 --- a/src/elements/emby-textarea/emby-textarea.js +++ b/src/elements/emby-textarea/emby-textarea.js @@ -47,7 +47,6 @@ import 'emby-input'; return; } let newHeight = 0; - let hasGrown = false; if ((textarea.scrollHeight - offset) > self.maxAllowedHeight) { textarea.style.overflowY = 'scroll'; diff --git a/src/legacy/focusPreventScroll.js b/src/legacy/focusPreventScroll.js index 93f53dca29..97d6b0b120 100644 --- a/src/legacy/focusPreventScroll.js +++ b/src/legacy/focusPreventScroll.js @@ -1,3 +1,4 @@ +// TODO: Move to external library (https://github.com/calvellido/focus-options-polyfill) // Polyfill to add support for preventScroll by focus function if (HTMLElement.prototype.nativeFocus === undefined) { diff --git a/src/libraries/scroller.js b/src/libraries/scroller.js index 8c67127eb3..4c4932702e 100644 --- a/src/libraries/scroller.js +++ b/src/libraries/scroller.js @@ -872,12 +872,10 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc if (item === undefined) { this.slideTo(this._pos[location], immediate); } else { - - //if (!transform) { - - // item.scrollIntoView(); - // return; - //} + if (!transform) { + item.scrollIntoView(); + return; + } var itemPos = this.getPos(item); diff --git a/src/plugins/experimentalWarnings/plugin.js b/src/plugins/experimentalWarnings/plugin.js index 632e38208c..cab4fcfada 100644 --- a/src/plugins/experimentalWarnings/plugin.js +++ b/src/plugins/experimentalWarnings/plugin.js @@ -1,14 +1,7 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function (connectionManager, globalize, userSettings, appHost) { 'use strict'; - function getRequirePromise(deps) { - - return new Promise(function (resolve, reject) { - - require(deps, resolve); - }); - } - + // TODO: Replace with date-fns // https://stackoverflow.com/questions/6117814/get-week-of-year-in-javascript-like-in-php function getWeek(date) { var d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())); @@ -26,6 +19,7 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function ( var now = new Date(); + // TODO: Use date-fns userSettingsKey += now.getFullYear() + '-w' + getWeek(now); if (userSettings.get(userSettingsKey, false) === '1') { diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index 8265987e28..a4821fa35f 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -140,8 +140,6 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp xhrSetup: function(xhr, url) { xhr.withCredentials = true; } - //appendErrorMaxRetry: 6, - //debug: true }); hls.loadSource(val); hls.attachMedia(elem); diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index cc312bb956..a9e0e9bfe6 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1,3 +1,4 @@ + 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'; /* globals cast */ @@ -17,25 +18,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } } - var _supportsTextTracks; - function supportsTextTracks() { - - if (_supportsTextTracks == null) { - _supportsTextTracks = document.createElement('video').textTracks != null; - } - - // For now, until ready - return _supportsTextTracks; - } - - function supportsCanvas() { - return !!document.createElement('canvas').getContext; - } - - function supportsWebWorkers() { - return !!window.Worker; - } - function enableNativeTrackSupport(currentSrc, track) { if (track) { @@ -129,11 +111,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return useHtml ? result.replace(/\n/gi, '
') : result; } - function setTracks(elem, tracks, item, mediaSource) { - - elem.innerHTML = getTracksHtml(tracks, item, mediaSource); - } - function getTextTrackUrl(track, item, format) { if (itemHelper.isLocalItem(item) && track.Path) { @@ -148,22 +125,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return url; } - function getTracksHtml(tracks, item, mediaSource) { - return tracks.map(function (t) { - - if (t.DeliveryMethod !== 'External') { - return ''; - } - - var defaultAttribute = mediaSource.DefaultSubtitleStreamIndex === t.Index ? ' default' : ''; - - var language = t.Language || 'und'; - var label = t.Language || 'und'; - return ''; - - }).join(''); - } - function getDefaultProfile() { return new Promise(function (resolve, reject) { @@ -191,12 +152,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var videoDialog; - var winJsPlaybackItem; - var subtitleTrackIndexToSetOnPlaying; var audioTrackIndexToSetOnPlaying; - var lastCustomTrackMs = 0; var currentClock; var currentSubtitlesOctopus; var currentAssRenderer; @@ -334,8 +292,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa xhrSetup: function(xhr, xhr_url) { xhr.withCredentials = true; } - //appendErrorMaxRetry: 6, - //debug: true }); hls.loadSource(url); hls.attachMedia(elem); @@ -350,55 +306,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }); } - function onShakaError(event) { - - var error = event.detail; - console.error('Error code', error.code, 'object', error); - } - - function setSrcWithShakaPlayer(instance, elem, options, url) { - - return new Promise(function (resolve, reject) { - - require(['shaka'], function () { - /* globals shaka */ - - var player = new shaka.Player(elem); - - //player.configure({ - // abr: { - // enabled: false - // }, - // streaming: { - - // failureCallback: function () { - // alert(2); - // } - // } - //}); - - //shaka.log.setLevel(6); - - // Listen for error events. - player.addEventListener('error', onShakaError); - - // Try to load a manifest. - // This is an asynchronous process. - player.load(url).then(function () { - - // This runs if the asynchronous load is successful. - resolve(); - - }, reject); - - self._shakaPlayer = player; - - // This is needed in setCurrentTrackElement - self._currentSrc = url; - }); - }); - } - function setCurrentSrcChromecast(instance, elem, options, url) { elem.autoplay = true; @@ -441,7 +348,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var media = event.data.media || {}; var url = media.contentId; var contentType = media.contentType.toLowerCase(); - var options = media.customData; var protocol; var ext = 'm3u8'; @@ -486,12 +392,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa mediaManager.defaultOnLoad = mediaManager.onLoad.bind(mediaManager); mediaManager.onLoad = onMediaManagerLoadMedia.bind(self); - //mediaManager.defaultOnPlay = mediaManager.onPlay.bind(mediaManager); - //mediaManager.onPlay = function (event) { - // // TODO ??? - // mediaManager.defaultOnPlay(event); - //}; - mediaManager.defaultOnStop = mediaManager.onStop.bind(mediaManager); mediaManager.onStop = function (event) { playbackManager.stop(); @@ -516,8 +416,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa htmlMediaHelper.destroyFlvPlayer(self); htmlMediaHelper.destroyCastPlayer(self); - var tracks = getMediaStreamTextTracks(options.mediaSource); - subtitleTrackIndexToSetOnPlaying = options.mediaSource.DefaultSubtitleStreamIndex == null ? -1 : options.mediaSource.DefaultSubtitleStreamIndex; if (subtitleTrackIndexToSetOnPlaying != null && subtitleTrackIndexToSetOnPlaying >= 0) { var initialSubtitleStream = options.mediaSource.MediaStreams[subtitleTrackIndexToSetOnPlaying]; @@ -535,14 +433,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa elem.crossOrigin = crossOrigin; } - /*if (htmlMediaHelper.enableHlsShakaPlayer(options.item, options.mediaSource, 'Video') && val.indexOf('.m3u8') !== -1) { - - setTracks(elem, tracks, options.item, options.mediaSource); - - return setSrcWithShakaPlayer(self, elem, options, val); - - } else*/ if (browser.chromecast && val.indexOf('.m3u8') !== -1 && options.mediaSource.RunTimeTicks) { - + if (browser.chromecast && val.indexOf('.m3u8') !== -1 && options.mediaSource.RunTimeTicks) { return setCurrentSrcChromecast(self, elem, options, val); } else if (htmlMediaHelper.enableHlsJsPlayer(options.mediaSource.RunTimeTicks, 'Video') && val.indexOf('.m3u8') !== -1) { return setSrcWithHlsJs(self, elem, options, val); @@ -1062,7 +953,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa destroyCustomTrack(videoElement); customTrackIndex = track.Index; renderTracksEvents(videoElement, track, item); - lastCustomTrackMs = 0; } function renderSsaAss(videoElement, track, item) { diff --git a/src/plugins/logoScreensaver/plugin.js b/src/plugins/logoScreensaver/plugin.js index f9dd901982..195369f9c9 100644 --- a/src/plugins/logoScreensaver/plugin.js +++ b/src/plugins/logoScreensaver/plugin.js @@ -59,23 +59,6 @@ define(['pluginManager'], function (pluginManager) { 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 }]; - var timing = { duration: 900, iterations: iterations }; - return elem.animate(keyframes, timing); - } - function swing(elem, iterations) { var keyframes = [ { transform: 'translate(0%)', offset: 0 }, @@ -118,7 +101,6 @@ define(['pluginManager'], function (pluginManager) { } 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 timing = { duration: 900, iterations: iterations }; @@ -126,7 +108,6 @@ define(['pluginManager'], function (pluginManager) { } 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 timing = { duration: 900, iterations: iterations }; diff --git a/src/scripts/browser.js b/src/scripts/browser.js index a377f08fdb..d2f5b2404a 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -101,8 +101,6 @@ define([], function () { } var animation = false; - var animationstring = 'animation'; - var keyframeprefix = ''; var domPrefixes = ['Webkit', 'O', 'Moz']; var pfx = ''; var elm = document.createElement('div'); @@ -115,8 +113,6 @@ define([], function () { for (var i = 0; i < domPrefixes.length; i++) { if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) { pfx = domPrefixes[i]; - animationstring = pfx + 'Animation'; - keyframeprefix = '-' + pfx.toLowerCase() + '-'; animation = true; break; } diff --git a/src/scripts/imagehelper.js b/src/scripts/imagehelper.js index be3fd2834e..03039e1428 100644 --- a/src/scripts/imagehelper.js +++ b/src/scripts/imagehelper.js @@ -1,6 +1,5 @@ -/* eslint-disable indent */ -import browser from 'browser'; +/* eslint-disable indent */ export function getDeviceIcon(device) { var baseUrl = 'assets/img/devices/'; diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index f228b46cec..961d89dc05 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -229,7 +229,6 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' function openMainDrawer() { navDrawerInstance.open(); - lastOpenTime = new Date().getTime(); } function onMainDrawerOpened() { @@ -575,15 +574,12 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function updateLibraryMenu(user) { - // FIXME: Potential equivalent might be - // showBySelector(".lnkSyncToOtherDevices", !!user.Policy.EnableContentDownloading); if (!user) { showBySelector('.libraryMenuDownloads', false); showBySelector('.lnkSyncToOtherDevices', false); return void showBySelector('.userMenuOptions', false); } - // FIXME: Potentially the same as above if (user.Policy.EnableContentDownloading) { showBySelector('.lnkSyncToOtherDevices', true); } else { @@ -838,7 +834,6 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' var enableLibraryNavDrawerHome = !layoutManager.tv; var skinHeader = document.querySelector('.skinHeader'); var requiresUserRefresh = true; - var lastOpenTime = new Date().getTime(); window.LibraryMenu = { getTopParentId: getTopParentId, onHardwareMenuButtonClick: function () { diff --git a/src/scripts/livetvcomponents.js b/src/scripts/livetvcomponents.js index fd4a46c0f1..fd1b48d0eb 100644 --- a/src/scripts/livetvcomponents.js +++ b/src/scripts/livetvcomponents.js @@ -64,10 +64,7 @@ define(['layoutManager', 'datetime', 'cardBuilder', 'apphost'], function (layout for (i = 0, length = groups.length; i < length; i++) { var group = groups[i]; - var supportsImageAnalysis = appHost.supports('imageanalysis'); - var cardLayout = appHost.preferVisualCards || supportsImageAnalysis; - cardLayout = true; if (group.name) { html += '
'; html += '

' + group.name + '

'; @@ -86,21 +83,21 @@ define(['layoutManager', 'datetime', 'cardBuilder', 'apphost'], function (layout html += cardBuilder.getCardsHtml({ items: group.items, - shape: cardLayout ? getBackdropShape() : enableScrollX() ? 'autoOverflow' : 'autoVertical', + shape: getBackdropShape(), showParentTitleOrTitle: true, showAirTime: true, showAirEndTime: true, - showChannelName: !cardLayout, - cardLayout: cardLayout, - centerText: !cardLayout, + showChannelName: false, + cardLayout: true, + centerText: false, action: 'edit', cardFooterAside: 'none', - preferThumb: !!cardLayout || 'auto', - defaultShape: cardLayout ? null : 'portrait', + preferThumb: true, + defaultShape: null, coverImage: true, allowBottomPadding: false, overlayText: false, - showChannelLogo: cardLayout + showChannelLogo: true }); html += '
'; diff --git a/src/scripts/site.js b/src/scripts/site.js index 6e1af0c493..f150f935c8 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -14,7 +14,7 @@ function getWindowLocationSearch(win) { return search || ''; } -function getParameterByName(name, url) { +window.getParameterByName = function (name, url) { 'use strict'; name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]'); @@ -27,7 +27,7 @@ function getParameterByName(name, url) { } return decodeURIComponent(results[1].replace(/\+/g, ' ')); -} +}; function pageClassOn(eventName, className, fn) { 'use strict'; @@ -41,7 +41,7 @@ function pageClassOn(eventName, className, fn) { }); } -function pageIdOn(eventName, id, fn) { +window.pageIdOn = function(eventName, id, fn) { 'use strict'; document.addEventListener(eventName, function (event) { @@ -51,7 +51,7 @@ function pageIdOn(eventName, id, fn) { fn.call(target, event); } }); -} +}; var Dashboard = { getCurrentUser: function () { @@ -236,9 +236,7 @@ var Dashboard = { var AppInfo = {}; -!function () { - 'use strict'; - +function initClient() { function defineConnectionManager(connectionManager) { window.ConnectionManager = connectionManager; define('connectionManager', [], function () { @@ -1127,7 +1125,9 @@ var AppInfo = {}; })(); return onWebComponentsReady(); -}(); +} + +initClient(); pageClassOn('viewshow', 'standalonePage', function () { document.querySelector('.skinHeader').classList.add('noHeaderRight'); diff --git a/src/strings/ar.json b/src/strings/ar.json index e7217b425b..b069301f92 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -227,7 +227,6 @@ "HeaderPassword": "كلمة السر", "HeaderPasswordReset": "إعادة تهيئة كلمة السر", "HeaderPaths": "مسارات", - "HeaderPendingInvitations": "الدعوات المعلقة", "HeaderPeople": "الناس", "HeaderPinCodeReset": "أعد تهيئة الرمز الشخصي", "HeaderPlayAll": "تشغيل الكل", diff --git a/src/strings/bg-bg.json b/src/strings/bg-bg.json index 71fdf80e32..619ccbe825 100644 --- a/src/strings/bg-bg.json +++ b/src/strings/bg-bg.json @@ -224,7 +224,6 @@ "HeaderParentalRatings": "Родителска оценка", "HeaderPassword": "Парола", "HeaderPaths": "Пътища", - "HeaderPendingInvitations": "Чакащи покани", "HeaderPeople": "Хора", "HeaderPlayAll": "Пускане на всичко", "HeaderPlayOn": "Пускане на", diff --git a/src/strings/ca.json b/src/strings/ca.json index 680be3ef77..8c0fa300cc 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -212,7 +212,6 @@ "HeaderPassword": "Contrasenya", "HeaderPasswordReset": "Reiniciar Contrasenya", "HeaderPaths": "Directoris", - "HeaderPendingInvitations": "Invitacions Pendents", "HeaderPeople": "Gent", "HeaderPlayAll": "Reprodueix Tot", "HeaderPlaybackError": "Error de Reproducció", diff --git a/src/strings/cs.json b/src/strings/cs.json index 5299165415..d0e8f83a98 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -341,7 +341,6 @@ "HeaderPassword": "Heslo", "HeaderPasswordReset": "Obnova hesla", "HeaderPaths": "Cesty", - "HeaderPendingInvitations": "Čekající pozvánky", "HeaderPeople": "Lidé", "HeaderPinCodeReset": "Obnovit Pin kód", "HeaderPlayAll": "Přehrát vše", diff --git a/src/strings/da.json b/src/strings/da.json index 5e29e1574c..fce7ba8551 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -296,7 +296,6 @@ "HeaderPassword": "Adgangskode", "HeaderPasswordReset": "Nulstil adgangskode", "HeaderPaths": "Stier", - "HeaderPendingInvitations": "Ventende invitationer", "HeaderPeople": "Mennesker", "HeaderPinCodeReset": "Nulstil pinkode", "HeaderPlayAll": "Afspil Alle", diff --git a/src/strings/de.json b/src/strings/de.json index eda47a1c0d..40b0b6fdb9 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -381,7 +381,6 @@ "HeaderPassword": "Passwort", "HeaderPasswordReset": "Passwort zurücksetzen", "HeaderPaths": "Pfade", - "HeaderPendingInvitations": "Ausstehende Einladungen", "HeaderPeople": "Personen", "HeaderPhotoAlbums": "Fotoalben", "HeaderPinCodeReset": "PIN Code zurücksetzen", diff --git a/src/strings/el.json b/src/strings/el.json index 24fd7c0934..43caa0975c 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -350,7 +350,6 @@ "HeaderPassword": "Κωδικός", "HeaderPasswordReset": "Επαναφορά του κωδικού πρόσβασης", "HeaderPaths": "Διαδρομή", - "HeaderPendingInvitations": "Εκκρεμείς προσκλήσεις", "HeaderPhotoAlbums": "Άλμπουμ φωτογραφιών", "HeaderPinCodeReset": "Επαναφορά Pin Code", "HeaderPlayAll": "Αναπαραγωγή Όλων", diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index a357f5c15e..7a25a5a822 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -446,7 +446,6 @@ "HeaderPassword": "Password", "HeaderPasswordReset": "Password Reset", "HeaderPaths": "Paths", - "HeaderPendingInvitations": "Pending Invitations", "CopyStreamURL": "Copy Stream URL", "CopyStreamURLSuccess": "URL copied successfully.", "XmlDocumentAttributeListHelp": "These attributes are applied to the root element of every XML response.", diff --git a/src/strings/en-us.json b/src/strings/en-us.json index c1ea50431d..6024363f05 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -438,7 +438,6 @@ "HeaderPassword": "Password", "HeaderPasswordReset": "Password Reset", "HeaderPaths": "Paths", - "HeaderPendingInvitations": "Pending Invitations", "HeaderPeople": "People", "HeaderPhotoAlbums": "Photo Albums", "HeaderPinCodeReset": "Reset Pin Code", diff --git a/src/strings/es-ar.json b/src/strings/es-ar.json index d4030f13ff..2b1dbd1a9e 100644 --- a/src/strings/es-ar.json +++ b/src/strings/es-ar.json @@ -534,7 +534,6 @@ "HeaderPinCodeReset": "Restablecer código PIN", "HeaderPhotoAlbums": "Álbumes de fotos", "HeaderPeople": "Personas", - "HeaderPendingInvitations": "Invitaciones pendientes", "HeaderPaths": "Rutas", "HeaderPasswordReset": "Restablecer contraseña", "HeaderPassword": "Contraseña", diff --git a/src/strings/es-mx.json b/src/strings/es-mx.json index ca4973bd71..68e9136aff 100644 --- a/src/strings/es-mx.json +++ b/src/strings/es-mx.json @@ -392,7 +392,6 @@ "HeaderPassword": "Contraseña", "HeaderPasswordReset": "Restablecer contraseña", "HeaderPaths": "Rutas", - "HeaderPendingInvitations": "Invitaciones pendientes", "HeaderPeople": "Personas", "HeaderPhotoAlbums": "Álbumes de fotos", "HeaderPinCodeReset": "Restablecer código PIN", diff --git a/src/strings/es.json b/src/strings/es.json index 640a51d634..038d34ea1e 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -340,7 +340,6 @@ "HeaderPassword": "Contraseña", "HeaderPasswordReset": "Reestablecer contraseña", "HeaderPaths": "Ruta", - "HeaderPendingInvitations": "Invitaciones pendientes", "HeaderPeople": "Gente", "HeaderPinCodeReset": "Restablecer código PIN", "HeaderPlayAll": "Reproducir todo", diff --git a/src/strings/es_419.json b/src/strings/es_419.json index 871f43a372..d730a75b9e 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -1096,7 +1096,6 @@ "HeaderPinCodeReset": "Restablecer código PIN", "HeaderPhotoAlbums": "Álbumes de fotos", "HeaderPeople": "Personas", - "HeaderPendingInvitations": "Invitaciones pendientes", "HeaderPaths": "Rutas", "HeaderPasswordReset": "Restablecer contraseña", "HeaderPassword": "Contraseña", diff --git a/src/strings/fa.json b/src/strings/fa.json index 877c0af490..f2719b5be4 100644 --- a/src/strings/fa.json +++ b/src/strings/fa.json @@ -329,7 +329,6 @@ "HeaderPinCodeReset": "بازنشانی پین کد", "HeaderPhotoAlbums": "آلبوم‌های عکس", "HeaderPeople": "افراد", - "HeaderPendingInvitations": "دعوت‌های در انتظار", "HeaderPasswordReset": "بازنشانی گذرواژه", "HeaderPassword": "گذرواژه", "HeaderParentalRatings": "رتبه بندی والدین", diff --git a/src/strings/fi.json b/src/strings/fi.json index b50ed369e1..a6a072ea16 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -480,7 +480,6 @@ "HeaderPreferredMetadataLanguage": "Ensisijainen metadatan kieli", "HeaderPinCodeReset": "Nollaa PIN-koodi", "HeaderPhotoAlbums": "Kuva-albumit", - "HeaderPendingInvitations": "Odottavat kutsut", "HeaderPaths": "Polut", "HeaderPasswordReset": "Salasanan nollaus", "HeaderNextVideoPlayingInValue": "Seuraava video alkaa {0}", diff --git a/src/strings/fr.json b/src/strings/fr.json index c71afef661..a7b2549108 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -387,7 +387,6 @@ "HeaderPassword": "Mot de passe", "HeaderPasswordReset": "Mot de passe réinitialisé", "HeaderPaths": "Chemins", - "HeaderPendingInvitations": "Invitations en attente", "HeaderPeople": "Personnes", "HeaderPhotoAlbums": "Albums photo", "HeaderPinCodeReset": "Réinitialiser le code PIN", diff --git a/src/strings/he.json b/src/strings/he.json index 31bc228bb2..3231737657 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -616,7 +616,6 @@ "HeaderPinCodeReset": "איפוס קוד סיכה", "HeaderPhotoAlbums": "אלבומי תמונות", "HeaderPeople": "אנשים", - "HeaderPendingInvitations": "הזמנות ממתינות", "HeaderPasswordReset": "איפוס סיסמה", "HeaderPassword": "סיסמה", "HeaderOtherItems": "פריטים אחרים", diff --git a/src/strings/hr.json b/src/strings/hr.json index 1693302c67..f7f6978d39 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -256,7 +256,6 @@ "HeaderPassword": "Lozinka", "HeaderPasswordReset": "Poništenje lozinke", "HeaderPaths": "Putanje", - "HeaderPendingInvitations": "Neriješeni pozivi", "HeaderPinCodeReset": "Poništi PIN", "HeaderPlayback": "Reprodukcija medija", "HeaderPleaseSignIn": "Molim, prijavite se", diff --git a/src/strings/hu.json b/src/strings/hu.json index 5559e2f10a..7aa44d906e 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -762,7 +762,6 @@ "HeaderNextVideoPlayingInValue": "Következő videó lejátszása {0}", "HeaderOtherItems": "Egyéb elemek", "HeaderPasswordReset": "Jelszó visszaállítása", - "HeaderPendingInvitations": "Függő meghívók", "HeaderPhotoAlbums": "Fényképalbumok", "HeaderPlaybackError": "Lejátszási hiba", "HeaderProfileInformation": "Profil információ", diff --git a/src/strings/it.json b/src/strings/it.json index 69919fbd76..854e5fa489 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -371,7 +371,6 @@ "HeaderParentalRatings": "Valutazioni genitori", "HeaderPasswordReset": "Reset della Password", "HeaderPaths": "Percorsi", - "HeaderPendingInvitations": "Inviti in sospeso", "HeaderPeople": "Persone", "HeaderPhotoAlbums": "Album foto", "HeaderPinCodeReset": "Resetta il codice PIN", diff --git a/src/strings/ja.json b/src/strings/ja.json index b93b3175e4..118bd739e6 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -412,7 +412,6 @@ "HeaderPassword": "パスワード", "HeaderPasswordReset": "パスワードリセット", "HeaderPaths": "パス", - "HeaderPendingInvitations": "保留中の招待状", "HeaderPeople": "人", "HeaderPhotoAlbums": "フォトアルバム", "HeaderPinCodeReset": "PINコードのリセット", diff --git a/src/strings/kk.json b/src/strings/kk.json index 5532af90f5..0757d71def 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -409,7 +409,6 @@ "HeaderPassword": "Paról", "HeaderPasswordReset": "Paróldi ysyrý", "HeaderPaths": "Joldar", - "HeaderPendingInvitations": "Bógelis shaqyrýlar", "HeaderPeople": "Adamdar", "HeaderPhotoAlbums": "Fotoálbomdar", "HeaderPinCodeReset": "PIN-kodty ysyrý", diff --git a/src/strings/ko.json b/src/strings/ko.json index 660b3d34a0..8e68c4fb48 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -195,7 +195,6 @@ "HeaderPassword": "비밀번호", "HeaderPasswordReset": "비밀번호 재설정", "HeaderPaths": "경로", - "HeaderPendingInvitations": "초대 보류", "HeaderPinCodeReset": "PIN 코드 초기화", "HeaderPlayAll": "모두 재생", "HeaderPlayback": "미디어 재생", diff --git a/src/strings/lt-lt.json b/src/strings/lt-lt.json index c8c2b6e448..af8962c474 100644 --- a/src/strings/lt-lt.json +++ b/src/strings/lt-lt.json @@ -985,7 +985,6 @@ "HeaderOnNow": "Gyvai dabar", "HeaderOtherItems": "Kiti elementai", "HeaderParentalRatings": "Amžiaus kategorijos", - "HeaderPendingInvitations": "Laukiantys kvietimai", "HeaderPeople": "Žmonės", "HeaderPhotoAlbums": "Nuotraukų albumai", "HeaderPinCodeReset": "Nustatyti PIN kodą iš naujo", diff --git a/src/strings/lv.json b/src/strings/lv.json index 18346bbda0..693d4e50cb 100644 --- a/src/strings/lv.json +++ b/src/strings/lv.json @@ -1112,7 +1112,6 @@ "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", diff --git a/src/strings/nb.json b/src/strings/nb.json index d729b0c025..96405b31e0 100644 --- a/src/strings/nb.json +++ b/src/strings/nb.json @@ -304,7 +304,6 @@ "HeaderPassword": "Passord", "HeaderPasswordReset": "Tilbakestill passord", "HeaderPaths": "Filbaner", - "HeaderPendingInvitations": "Ventende invitasjoner", "HeaderPeople": "Personer", "HeaderPinCodeReset": "Tilbakestill PIN-kode", "HeaderPlayAll": "Spill alle", diff --git a/src/strings/nl.json b/src/strings/nl.json index 6e3adba10f..c407f81680 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -372,7 +372,6 @@ "HeaderPassword": "Wachtwoord", "HeaderPasswordReset": "Wachtwoord resetten", "HeaderPaths": "Paden", - "HeaderPendingInvitations": "Uitstaande uitnodigingen", "HeaderPeople": "Personen", "HeaderPhotoAlbums": "Foto-albums", "HeaderPinCodeReset": "Reset Pincode", diff --git a/src/strings/pl.json b/src/strings/pl.json index 8ced01561c..9e21c5113d 100644 --- a/src/strings/pl.json +++ b/src/strings/pl.json @@ -398,7 +398,6 @@ "HeaderPassword": "Hasło", "HeaderPasswordReset": "Czyszczenie hasła", "HeaderPaths": "Foldery", - "HeaderPendingInvitations": "Oczekujące Zaproszenia", "HeaderPeople": "Osoby", "HeaderPhotoAlbums": "Albumy fotografii", "HeaderPinCodeReset": "Wyczyść kod PIN", diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index 1f3c160c12..c8690bd742 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -385,7 +385,6 @@ "HeaderPassword": "Senha", "HeaderPasswordReset": "Redefinição de Senha", "HeaderPaths": "Locais", - "HeaderPendingInvitations": "Convites pendentes", "HeaderPeople": "Pessoas", "HeaderPhotoAlbums": "Álbuns de Fotos", "HeaderPinCodeReset": "Redefinir Código Pin", diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index b482189ffb..07b1f1aceb 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -192,7 +192,6 @@ "HeaderPassword": "Palavra-passe", "HeaderPasswordReset": "Redefinição de Palavra-Passe", "HeaderPaths": "Localizações", - "HeaderPendingInvitations": "Convites Pendentes", "HeaderPeople": "Pessoas", "HeaderPinCodeReset": "Redefinir Código PIN", "HeaderPlayAll": "Reproduzir Todos", diff --git a/src/strings/pt.json b/src/strings/pt.json index 9d6f3faf37..dba5a7ab52 100644 --- a/src/strings/pt.json +++ b/src/strings/pt.json @@ -568,7 +568,6 @@ "HeaderPinCodeReset": "Redefinir Código PIN", "HeaderPhotoAlbums": "Álbuns de Fotografias", "HeaderPeople": "Pessoas", - "HeaderPendingInvitations": "Convites Pendentes", "HeaderPaths": "Localizações", "HeaderPasswordReset": "Redefinição de Palavra-Passe", "HeaderPassword": "Palavra-passe", diff --git a/src/strings/ro.json b/src/strings/ro.json index 5ed9fda846..ff443fae68 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -476,7 +476,6 @@ "HeaderParentalRatings": "Evaluări parentale", "HeaderPassword": "Parolă", "HeaderPasswordReset": "Resetare Parolă", - "HeaderPendingInvitations": "Invitații in așteptare", "HeaderPeople": "Persoane", "HeaderPhotoAlbums": "Albume Fotografii", "HeaderPinCodeReset": "Resetare cod PIN", diff --git a/src/strings/ru.json b/src/strings/ru.json index 9212ee4fb4..29fb03210a 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -402,7 +402,6 @@ "HeaderPassword": "Пароль", "HeaderPasswordReset": "Сброс пароля", "HeaderPaths": "Пути", - "HeaderPendingInvitations": "Отложенные приглашения", "HeaderPeople": "Люди", "HeaderPhotoAlbums": "Фотоальбомы", "HeaderPinCodeReset": "Сброс PIN-кода", diff --git a/src/strings/sk.json b/src/strings/sk.json index a99d686523..52c1e21bb5 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -252,7 +252,6 @@ "HeaderPassword": "Heslo", "HeaderPasswordReset": "Obnoviť heslo", "HeaderPaths": "Cesty", - "HeaderPendingInvitations": "Čakajúce pozvánky", "HeaderPeople": "Ľudia", "HeaderPhotoAlbums": "Albumy fotografií", "HeaderPinCodeReset": "Obnoviť PIN kód", diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index b6059809be..ee28cbec81 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -332,7 +332,6 @@ "HeaderPinCodeReset": "Ponastavi PIN kodo", "HeaderPhotoAlbums": "Foto albumi", "HeaderPeople": "Osebe", - "HeaderPendingInvitations": "Povabila na čakanju", "HeaderPasswordReset": "Ponastavi geslo", "HeaderPassword": "Geslo", "HeaderParentalRatings": "Ocena za starše", diff --git a/src/strings/sv.json b/src/strings/sv.json index 621172f7ea..0ca152dcc5 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -363,7 +363,6 @@ "HeaderPassword": "Lösenord", "HeaderPasswordReset": "Återställning av lösenordet", "HeaderPaths": "Sökvägar", - "HeaderPendingInvitations": "Väntande inbjudningar", "HeaderPeople": "Personer", "HeaderPhotoAlbums": "Fotoalbum", "HeaderPinCodeReset": "Återställ pinkod", diff --git a/src/strings/tr.json b/src/strings/tr.json index 3e3c94d742..169a71cea8 100644 --- a/src/strings/tr.json +++ b/src/strings/tr.json @@ -582,7 +582,6 @@ "HeaderPinCodeReset": "Pin Kodunu Sıfırla", "HeaderPhotoAlbums": "Fotoğraf Albümleri", "HeaderPeople": "Kişiler", - "HeaderPendingInvitations": "Bekleyen Davetiyeler", "HeaderPasswordReset": "Şifre Sıfırlama", "HeaderPassword": "Şifre", "HeaderParentalRatings": "Ebeveyn Derecelendirmeleri", diff --git a/src/strings/vi.json b/src/strings/vi.json index a5b319a86f..4e51ce8d2d 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -443,7 +443,6 @@ "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", diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 0b2767fda3..06acfddab5 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -367,7 +367,6 @@ "HeaderPassword": "密码", "HeaderPasswordReset": "密码重置", "HeaderPaths": "路径", - "HeaderPendingInvitations": "等待邀请", "HeaderPeople": "人物", "HeaderPhotoAlbums": "相册", "HeaderPinCodeReset": "重置PIN码", diff --git a/src/strings/zh-tw.json b/src/strings/zh-tw.json index 4c090dcf25..c58316f2ca 100644 --- a/src/strings/zh-tw.json +++ b/src/strings/zh-tw.json @@ -821,7 +821,6 @@ "ValueSpecialEpisodeName": "特典 - {0}", "AuthProviderHelp": "選擇用於驗證使用者密碼的身份驗證提供者。", "HeaderParentalRatings": "家長評級", - "HeaderPendingInvitations": "等待邀請", "HeaderProfile": "設定檔", "HeaderProfileInformation": "設定檔信息", "HeaderProfileServerSettingsHelp": "這些數值將控制 Jellyfin 伺服器如何呈現給設備。", diff --git a/src/userprofiles.html b/src/userprofiles.html index 98237645dd..0a72f40ed7 100644 --- a/src/userprofiles.html +++ b/src/userprofiles.html @@ -1,5 +1,4 @@
-
@@ -12,13 +11,6 @@
-
-
-

${HeaderPendingInvitations}

-
-
-
-
From a179291f4f3ddd87fb5747390d3cb89c2fa9ccad Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Sun, 19 Jul 2020 16:27:48 +0200 Subject: [PATCH 031/731] Fix linting --- src/elements/emby-textarea/emby-textarea.js | 1 - src/scripts/browser.js | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/elements/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js index 9036a57f1e..28147c2750 100644 --- a/src/elements/emby-textarea/emby-textarea.js +++ b/src/elements/emby-textarea/emby-textarea.js @@ -55,7 +55,6 @@ import 'emby-input'; textarea.style.overflowY = 'hidden'; textarea.style.height = 'auto'; newHeight = textarea.scrollHeight/* - offset*/; - hasGrown = true; } $('.customCssContainer').css('height', newHeight + 'px'); textarea.style.height = newHeight + 'px'; diff --git a/src/scripts/browser.js b/src/scripts/browser.js index d2f5b2404a..39292a1673 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -102,7 +102,6 @@ define([], function () { var animation = false; var domPrefixes = ['Webkit', 'O', 'Moz']; - var pfx = ''; var elm = document.createElement('div'); if (elm.style.animationName !== undefined) { @@ -112,7 +111,6 @@ define([], function () { if (animation === false && allowPrefix) { for (var i = 0; i < domPrefixes.length; i++) { if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) { - pfx = domPrefixes[i]; animation = true; break; } From a09a9e9a3a5f70cf2cfe915cd4725034aa56a06a Mon Sep 17 00:00:00 2001 From: MrTimscampi Date: Thu, 23 Jul 2020 21:12:57 +0200 Subject: [PATCH 032/731] Remove some more things --- src/components/dialog/dialog.js | 4 -- src/components/maintabsmanager.js | 31 ++------------- src/components/multiSelect/multiSelect.js | 3 -- src/components/slideshow/slideshow.js | 3 -- src/elements/emby-slider/emby-slider.js | 21 ++-------- src/plugins/htmlVideoPlayer/plugin.js | 48 +---------------------- src/scripts/browser.js | 2 - 7 files changed, 8 insertions(+), 104 deletions(-) diff --git a/src/components/dialog/dialog.js b/src/components/dialog/dialog.js index 5dd6017d8f..2250dac7da 100644 --- a/src/components/dialog/dialog.js +++ b/src/components/dialog/dialog.js @@ -45,10 +45,6 @@ import 'flexStyles'; dlg.classList.add('dialog-fullscreen-lowres'); } - dlg.querySelector('.btnCancel').addEventListener('click', function (e) { - dialogHelper.close(dlg); - }); - if (options.title) { dlg.querySelector('.formDialogHeaderTitle').innerHTML = options.title || ''; } else { diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index 79dd883fcd..8251f3ce72 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -8,25 +8,10 @@ import 'emby-button'; let tabOwnerView; const queryScope = document.querySelector('.skinHeader'); - let footerTabsContainer; let headerTabsContainer; let tabsElem; - function enableTabsInFooter() { - return false; - } - - function ensureElements(enableInFooter) { - - if (enableInFooter) { - if (!footerTabsContainer) { - footerTabsContainer = document.createElement('div'); - footerTabsContainer.classList.add('footerTabs'); - footerTabsContainer.classList.add('sectionTabs'); - footerTabsContainer.classList.add('hide'); - } - } - + function ensureElements() { if (!headerTabsContainer) { headerTabsContainer = queryScope.querySelector('.headerTabs'); } @@ -97,9 +82,6 @@ import 'emby-button'; } export function setTabs(view, selectedIndex, getTabsFn, getTabContainersFn, onBeforeTabChange, onTabChange, setSelectedIndex) { - - const enableInFooter = enableTabsInFooter(); - if (!view) { if (tabOwnerView) { @@ -107,18 +89,13 @@ import 'emby-button'; headerTabsContainer = queryScope.querySelector('.headerTabs'); } - ensureElements(enableInFooter); + ensureElements(); document.body.classList.remove('withSectionTabs'); headerTabsContainer.innerHTML = ''; headerTabsContainer.classList.add('hide'); - if (footerTabsContainer) { - footerTabsContainer.innerHTML = ''; - footerTabsContainer.classList.add('hide'); - } - tabOwnerView = null; } return { @@ -127,9 +104,9 @@ import 'emby-button'; }; } - ensureElements(enableInFooter); + ensureElements(); - const tabsContainerElem = enableInFooter ? footerTabsContainer : headerTabsContainer; + const tabsContainerElem = headerTabsContainer; if (!tabOwnerView) { tabsContainerElem.classList.remove('hide'); diff --git a/src/components/multiSelect/multiSelect.js b/src/components/multiSelect/multiSelect.js index 3c0495b887..9c408339b5 100644 --- a/src/components/multiSelect/multiSelect.js +++ b/src/components/multiSelect/multiSelect.js @@ -580,9 +580,6 @@ import 'css!./multiSelect'; dom.removeEventListener(element, 'touchend', onTouchEnd, { passive: true }); - dom.removeEventListener(element, 'touchcancel', onTouchEnd, { - passive: true - }); dom.removeEventListener(element, 'mousedown', onMouseDown, { passive: true }); diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 6a9e4a4cd3..b32c781482 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -131,9 +131,6 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f /** Last coordinates of the mouse pointer. */ var lastMouseMoveData; - // Use autoplay on Chromecast since it is non-interactive. - if (browser.chromecast) options.interactive = false; - /** * Creates the HTML markup for the dialog and the OSD. * @param {Object} options - Options used to create the dialog and slideshow. diff --git a/src/elements/emby-slider/emby-slider.js b/src/elements/emby-slider/emby-slider.js index 682e99b201..f634faf1e9 100644 --- a/src/elements/emby-slider/emby-slider.js +++ b/src/elements/emby-slider/emby-slider.js @@ -12,8 +12,6 @@ import 'emby-input'; let supportsValueSetOverride = false; - let enableWidthWithTransform; - if (Object.getOwnPropertyDescriptor && Object.defineProperty) { const descriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value'); @@ -104,12 +102,8 @@ import 'emby-input'; if (backgroundLower) { let fraction = (value - range.min) / (range.max - range.min); - if (enableWidthWithTransform) { - backgroundLower.style.transform = 'scaleX(' + (fraction) + ')'; - } else { - fraction *= 100; - backgroundLower.style.width = fraction + '%'; - } + fraction *= 100; + backgroundLower.style.width = fraction + '%'; } }); } @@ -146,11 +140,6 @@ import 'emby-input'; return; } - // TODO: Not sure what this is trying to accomplish. - if (enableWidthWithTransform == null) { - enableWidthWithTransform = browser.supportsCssAnimation(); - } - this.setAttribute('data-embyslider', 'true'); this.classList.add('mdl-slider'); @@ -178,11 +167,7 @@ import 'emby-input'; // the more of these, the more ranges we can display htmlToInsert += '
'; - if (enableWidthWithTransform) { - htmlToInsert += '
'; - } else { - htmlToInsert += '
'; - } + htmlToInsert += '
'; htmlToInsert += '
'; htmlToInsert += ''; diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index a9e0e9bfe6..30d89de3b1 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -32,13 +32,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } } - // subs getting blocked due to CORS - if (browser.chromecast) { - if ((currentSrc || '').toLowerCase().indexOf('.m3u8') !== -1) { - return false; - } - } - if (browser.ps4) { return false; } @@ -306,35 +299,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }); } - function setCurrentSrcChromecast(instance, elem, options, url) { - - elem.autoplay = true; - - var lrd = new cast.receiver.MediaManager.LoadRequestData(); - lrd.currentTime = (options.playerStartPositionTicks || 0) / 10000000; - lrd.autoplay = true; - lrd.media = new cast.receiver.media.MediaInformation(); - - lrd.media.contentId = url; - lrd.media.contentType = options.mimeType; - lrd.media.streamType = cast.receiver.media.StreamType.OTHER; - lrd.media.customData = options; - - console.debug('loading media url into media manager'); - - try { - mediaManager.load(lrd); - // This is needed in setCurrentTrackElement - self._currentSrc = url; - - return Promise.resolve(); - } catch (err) { - - console.debug('media manager error: ' + err); - return Promise.reject(); - } - } - // Adapted from : https://github.com/googlecast/CastReferencePlayer/blob/master/player.js function onMediaManagerLoadMedia(event) { @@ -433,9 +397,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa elem.crossOrigin = crossOrigin; } - if (browser.chromecast && val.indexOf('.m3u8') !== -1 && options.mediaSource.RunTimeTicks) { - return setCurrentSrcChromecast(self, elem, options, val); - } else if (htmlMediaHelper.enableHlsJsPlayer(options.mediaSource.RunTimeTicks, 'Video') && val.indexOf('.m3u8') !== -1) { + if (htmlMediaHelper.enableHlsJsPlayer(options.mediaSource.RunTimeTicks, 'Video') && val.indexOf('.m3u8') !== -1) { return setSrcWithHlsJs(self, elem, options, val); } else if (options.playMethod !== 'Transcode' && options.mediaSource.Container === 'flv') { @@ -1210,10 +1172,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var html = ''; var cssClass = 'htmlvideoplayer'; - if (!browser.chromecast) { - cssClass += ' htmlvideoplayer-moveupsubtitles'; - } - // Can't autoplay in these browsers so we need to use the full controls, at least until playback starts if (!appHost.supports('htmlvideoautoplay')) { html += '