diff --git a/.editorconfig b/.editorconfig index 92cf9dc590..84ba694073 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,5 +8,5 @@ trim_trailing_whitespace = true insert_final_newline = true end_of_line = lf -[json] +[*.json] indent_size = 2 diff --git a/.eslintrc.js b/.eslintrc.js index 765db89daa..4ab7ef075d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -46,7 +46,8 @@ module.exports = { 'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }], 'semi': ['error'], 'space-before-blocks': ['error'], - 'space-infix-ops': 'error' + 'space-infix-ops': 'error', + 'yoda': 'error' }, overrides: [ { diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 73f40aaca1..c51cd6b31f 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -36,6 +36,7 @@ - [MrTimscampi](https://github.com/MrTimscampi) - [Sarab Singh](https://github.com/sarab97) - [Andrei Oanca](https://github.com/OancaAndrei) + - [Cromefire_](https://github.com/cromefire) # Emby Contributors diff --git a/package.json b/package.json index a70bfac564..8fb92cf4f0 100644 --- a/package.json +++ b/package.json @@ -5,18 +5,18 @@ "repository": "https://github.com/jellyfin/jellyfin-web", "license": "GPL-2.0-or-later", "devDependencies": { - "@babel/core": "^7.10.5", + "@babel/core": "^7.11.0", "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-private-methods": "^7.10.1", "@babel/plugin-transform-modules-amd": "^7.10.5", "@babel/polyfill": "^7.8.7", - "@babel/preset-env": "^7.10.3", - "autoprefixer": "^9.8.5", + "@babel/preset-env": "^7.11.0", + "autoprefixer": "^9.8.6", "babel-eslint": "^11.0.0-beta.2", "babel-loader": "^8.0.6", "browser-sync": "^2.26.12", "copy-webpack-plugin": "^5.1.1", - "css-loader": "^4.0.0", + "css-loader": "^4.1.1", "cssnano": "^4.1.10", "del": "^5.1.0", "eslint": "^6.8.0", @@ -48,7 +48,7 @@ "stylelint-config-rational-order": "^0.1.2", "stylelint-no-browser-hacks": "^1.2.1", "stylelint-order": "^4.1.0", - "webpack": "^4.44.0", + "webpack": "^4.44.1", "webpack-merge": "^4.2.2", "webpack-stream": "^5.2.1" }, @@ -62,7 +62,7 @@ "fast-text-encoding": "^1.0.3", "flv.js": "^1.5.0", "headroom.js": "^0.11.0", - "hls.js": "^0.14.6", + "hls.js": "^0.14.7", "howler": "^2.2.0", "intersection-observer": "^0.11.0", "jellyfin-apiclient": "^1.4.1", @@ -140,6 +140,7 @@ "src/components/playback/playerSelectionMenu.js", "src/components/playback/playersettingsmenu.js", "src/components/playback/playmethodhelper.js", + "src/components/playback/playqueuemanager.js", "src/components/playback/remotecontrolautoplay.js", "src/components/playback/volumeosd.js", "src/components/playbackSettings/playbackSettings.js", @@ -147,8 +148,10 @@ "src/components/playlisteditor/playlisteditor.js", "src/components/playmenu.js", "src/components/prompt/prompt.js", + "src/components/refreshdialog/refreshdialog.js", "src/components/sanatizefilename.js", "src/components/scrollManager.js", + "src/plugins/htmlVideoPlayer/plugin.js", "src/components/search/searchfields.js", "src/components/search/searchresults.js", "src/components/settingshelper.js", @@ -175,6 +178,12 @@ "src/controllers/dashboard/general.js", "src/controllers/dashboard/librarydisplay.js", "src/controllers/dashboard/logs.js", + "src/controllers/music/musicalbums.js", + "src/controllers/music/musicartists.js", + "src/controllers/music/musicgenres.js", + "src/controllers/music/musicplaylists.js", + "src/controllers/music/musicrecommended.js", + "src/controllers/music/songs.js", "src/controllers/dashboard/mediaLibrary.js", "src/controllers/dashboard/metadataImages.js", "src/controllers/dashboard/metadatanfo.js", @@ -195,6 +204,7 @@ "src/controllers/playback/queue/index.js", "src/controllers/playback/video/index.js", "src/controllers/searchpage.js", + "src/controllers/livetvtuner.js", "src/controllers/shows/episodes.js", "src/controllers/shows/tvgenres.js", "src/controllers/shows/tvlatest.js", @@ -208,7 +218,6 @@ "src/controllers/user/playback/index.js", "src/controllers/user/profile/index.js", "src/controllers/user/subtitles/index.js", - "src/controllers/user/subtitles/index.js", "src/controllers/wizard/finish/index.js", "src/controllers/wizard/remote/index.js", "src/controllers/wizard/settings/index.js", diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 61815a590f..047ae0a1c6 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -646,7 +646,7 @@ .layout-desktop .detailRibbon, .layout-tv .detailRibbon { margin-top: -7.2em; - height: 7.18em; + height: 7.2em; } .layout-desktop .noBackdrop .detailRibbon, diff --git a/src/components/activitylog.js b/src/components/activitylog.js index 9834255003..ab489a3f31 100644 --- a/src/components/activitylog.js +++ b/src/components/activitylog.js @@ -16,7 +16,7 @@ import 'listViewStyle'; let color = '#00a4dc'; let icon = 'notifications'; - if ('Error' == entry.Severity || 'Fatal' == entry.Severity || 'Warn' == entry.Severity) { + if (entry.Severity == 'Error' || entry.Severity == 'Fatal' || entry.Severity == 'Warn') { color = '#cc0000'; icon = 'notification_important'; } @@ -60,13 +60,13 @@ import 'listViewStyle'; } function reloadData(instance, elem, apiClient, startIndex, limit) { - if (null == startIndex) { + if (startIndex == null) { startIndex = parseInt(elem.getAttribute('data-activitystartindex') || '0'); } limit = limit || parseInt(elem.getAttribute('data-activitylimit') || '7'); const minDate = new Date(); - const hasUserId = 'false' !== elem.getAttribute('data-useractivity'); + const hasUserId = elem.getAttribute('data-useractivity') !== 'false'; // TODO: Use date-fns if (hasUserId) { diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 138d58e5c0..4fa2a92433 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -231,8 +231,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro max /= 8; max *= 1000000; max *= 0.7; - max = parseInt(max); - return max; + return parseInt(max, 10); } } /* eslint-enable compat/compat */ diff --git a/src/components/apphost.js b/src/components/apphost.js index e7d5bbc2f4..8a5581d817 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -47,7 +47,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g profile = window.NativeShell.AppHost.getDeviceProfile(profileBuilder); } else { var builderOpts = getBaseProfileOptions(item); - builderOpts.enableSsaRender = (item && !options.isRetry && 'allcomplexformats' !== appSettings.get('subtitleburnin')); + builderOpts.enableSsaRender = (item && !options.isRetry && appSettings.get('subtitleburnin') !== 'allcomplexformats'); profile = profileBuilder(builderOpts); } @@ -370,7 +370,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g return window.NativeShell.AppHost.supports(command); } - return -1 !== supportedFeatures.indexOf(command.toLowerCase()); + return supportedFeatures.indexOf(command.toLowerCase()) !== -1; }, preferVisualCards: browser.android || browser.chrome, getSyncProfile: getSyncProfile, diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index 0215f8d8e5..1521650ed0 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -104,9 +104,7 @@ import browser from 'browser'; const cardBoxCssClass = 'cardBox'; const cardScalableClass = 'cardScalable'; - const html = ``; - - return html; + return ``; } export function buildChapterCards(item, chapters, options) { diff --git a/src/components/favoriteitems.js b/src/components/favoriteitems.js index 358bf04112..43b20dd198 100644 --- a/src/components/favoriteitems.js +++ b/src/components/favoriteitems.js @@ -120,7 +120,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad var promise; - if ('MusicArtist' === section.types) { + if (section.types === 'MusicArtist') { promise = ApiClient.getArtists(userId, options); } else { options.IncludeItemTypes = section.types; @@ -160,7 +160,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad preferThumb: section.preferThumb, shape: section.shape, centerText: section.centerText && !cardLayout, - overlayText: false !== section.overlayText, + overlayText: section.overlayText !== false, showTitle: section.showTitle, showParentTitle: section.showParentTitle, scalable: true, @@ -192,7 +192,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad if (types) { sections = sections.filter(function (s) { - return -1 !== types.indexOf(s.id); + return types.indexOf(s.id) !== -1; }); } @@ -215,7 +215,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad for (i = 0, length = sections.length; i < length; i++) { var section = sections[i]; elem = page.querySelector('.section' + section.id); - promises.push(loadSection(elem, userId, topParentId, section, 1 === sections.length)); + promises.push(loadSection(elem, userId, topParentId, section, sections.length === 1)); } Promise.all(promises).then(function () { diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js index 8ac3cc799c..3361db5f02 100644 --- a/src/components/groupedcards.js +++ b/src/components/groupedcards.js @@ -21,7 +21,7 @@ import connectionManager from 'connectionManager'; if (!actionableParent || actionableParent.classList.contains('cardContent')) { apiClient.getJSON(apiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { - if (1 === items.length) { + if (items.length === 1) { return void appRouter.showItem(items[0]); } diff --git a/src/components/imageOptionsEditor/imageOptionsEditor.js b/src/components/imageOptionsEditor/imageOptionsEditor.js index 6660ecf74c..41fe9b4c94 100644 --- a/src/components/imageOptionsEditor/imageOptionsEditor.js +++ b/src/components/imageOptionsEditor/imageOptionsEditor.js @@ -16,7 +16,7 @@ import 'emby-input'; return { Type: type, MinWidth: 0, - Limit: 'Primary' === type ? 1 : 0 + Limit: type === 'Primary' ? 1 : 0 }; } diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index a6256de24c..ab193c264e 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -219,7 +219,7 @@ import 'emby-input'; html += '
'; html += '

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

'; const supportedImageTypes = availableTypeOptions.SupportedImageTypes || []; - if (supportedImageTypes.length > 1 || 1 === supportedImageTypes.length && 'Primary' !== supportedImageTypes[0]) { + if (supportedImageTypes.length > 1 || supportedImageTypes.length === 1 && supportedImageTypes[0] !== 'Primary') { html += ''; } html += '
'; @@ -362,7 +362,7 @@ import 'emby-input'; TypeOptions: [] }; currentAvailableOptions = null; - const isNewLibrary = null === libraryOptions; + const isNewLibrary = libraryOptions === null; isNewLibrary && parent.classList.add('newlibrary'); const response = await fetch('components/libraryoptionseditor/libraryoptionseditor.template.html'); const template = await response.text(); @@ -578,7 +578,7 @@ import 'emby-input'; parent.querySelector('#chkSkipIfAudioTrackPresent').checked = options.SkipSubtitlesIfAudioTrackMatches; parent.querySelector('#chkRequirePerfectMatch').checked = options.RequirePerfectSubtitleMatch; Array.prototype.forEach.call(parent.querySelectorAll('.chkMetadataSaver'), elem => { - elem.checked = options.MetadataSavers ? options.MetadataSavers.includes(elem.getAttribute('data-pluginname')) : 'true' === elem.getAttribute('data-defaultenabled'); + elem.checked = options.MetadataSavers ? options.MetadataSavers.includes(elem.getAttribute('data-pluginname')) : elem.getAttribute('data-defaultenabled') === 'true'; }); Array.prototype.forEach.call(parent.querySelectorAll('.chkSubtitleLanguage'), elem => { elem.checked = !!options.SubtitleDownloadLanguages && options.SubtitleDownloadLanguages.includes(elem.getAttribute('data-lang')); diff --git a/src/components/mediaLibraryEditor/mediaLibraryEditor.js b/src/components/mediaLibraryEditor/mediaLibraryEditor.js index 1cee6984d9..b04f632055 100644 --- a/src/components/mediaLibraryEditor/mediaLibraryEditor.js +++ b/src/components/mediaLibraryEditor/mediaLibraryEditor.js @@ -98,8 +98,8 @@ import 'flexStyles'; if (listItem) { const index = parseInt(listItem.getAttribute('data-index')); const pathInfos = (currentOptions.library.LibraryOptions || {}).PathInfos || []; - const pathInfo = null == index ? {} : pathInfos[index] || {}; - const originalPath = pathInfo.Path || (null == index ? null : currentOptions.library.Locations[index]); + const pathInfo = index == null ? {} : pathInfos[index] || {}; + const originalPath = pathInfo.Path || (index == null ? null : currentOptions.library.Locations[index]); const btnRemovePath = dom.parentWithClass(e.target, 'btnRemovePath'); if (btnRemovePath) { @@ -171,7 +171,7 @@ import 'flexStyles'; const picker = new directoryBrowser(); picker.show({ enableNetworkSharePath: true, - pathReadOnly: null != originalPath, + pathReadOnly: originalPath != null, path: originalPath, networkSharePath: networkPath, callback: function (path, networkSharePath) { diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 829cd38f2c..1d74cd69f5 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -1,6 +1,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'playQueueManager', 'userSettings', 'globalize', 'connectionManager', 'loading', 'apphost', 'screenfull'], function (events, datetime, appSettings, itemHelper, pluginManager, PlayQueueManager, userSettings, globalize, connectionManager, loading, apphost, screenfull) { 'use strict'; + PlayQueueManager = PlayQueueManager.default || PlayQueueManager; + function enableLocalPlaylistManagement(player) { if (player.getPlaylist) { return false; @@ -18,6 +20,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla screenfull.on('change', function () { events.trigger(player, 'fullscreenchange'); }); + } else { + // iOS Safari + document.addEventListener('webkitfullscreenchange', function () { + events.trigger(player, 'fullscreenchange'); + }, false); } } @@ -882,9 +889,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla } } - targets = targets.sort(sortPlayerTargets); - - return targets; + return targets.sort(sortPlayerTargets); }); }); }; @@ -1399,6 +1404,11 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla return player.isFullscreen(); } + if (!screenfull.isEnabled) { + // iOS Safari + return document.webkitIsFullScreen; + } + return screenfull.isFullscreen; }; @@ -1410,6 +1420,16 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (screenfull.isEnabled) { screenfull.toggle(); + } else { + // iOS Safari + if (document.webkitIsFullScreen && document.webkitCancelFullscreen) { + document.webkitCancelFullscreen(); + } else { + const elem = document.querySelector('video'); + if (elem && elem.webkitEnterFullscreen) { + elem.webkitEnterFullscreen(); + } + } } }; @@ -3370,8 +3390,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla PlaybackManager.prototype.getSubtitleUrl = function (textStream, serverId) { var apiClient = connectionManager.getApiClient(serverId); - var textStreamUrl = !textStream.IsExternalUrl ? apiClient.getUrl(textStream.DeliveryUrl) : textStream.DeliveryUrl; - return textStreamUrl; + + return !textStream.IsExternalUrl ? apiClient.getUrl(textStream.DeliveryUrl) : textStream.DeliveryUrl; }; PlaybackManager.prototype.stop = function (player) { diff --git a/src/components/playback/playqueuemanager.js b/src/components/playback/playqueuemanager.js index 696075b344..fbe1ceabfe 100644 --- a/src/components/playback/playqueuemanager.js +++ b/src/components/playback/playqueuemanager.js @@ -1,56 +1,56 @@ -define([], function () { - 'use strict'; +/*eslint prefer-const: "error"*/ - var currentId = 0; - function addUniquePlaylistItemId(item) { - if (!item.PlaylistItemId) { - item.PlaylistItemId = 'playlistItem' + currentId; - currentId++; +let currentId = 0; +function addUniquePlaylistItemId(item) { + if (!item.PlaylistItemId) { + item.PlaylistItemId = 'playlistItem' + currentId; + currentId++; + } +} + +function findPlaylistIndex(playlistItemId, list) { + for (let i = 0, length = list.length; i < length; i++) { + if (list[i].PlaylistItemId === playlistItemId) { + return i; } } - function findPlaylistIndex(playlistItemId, list) { - for (var i = 0, length = list.length; i < length; i++) { - if (list[i].PlaylistItemId === playlistItemId) { - return i; - } - } + return -1; +} - return -1; - } - - function PlayQueueManager() { +class PlayQueueManager { + constructor() { this._sortedPlaylist = []; this._playlist = []; this._repeatMode = 'RepeatNone'; this._shuffleMode = 'Sorted'; } - PlayQueueManager.prototype.getPlaylist = function () { + getPlaylist() { return this._playlist.slice(0); - }; + } - PlayQueueManager.prototype.setPlaylist = function (items) { + setPlaylist(items) { items = items.slice(0); - for (var i = 0, length = items.length; i < length; i++) { + for (let i = 0, length = items.length; i < length; i++) { addUniquePlaylistItemId(items[i]); } this._currentPlaylistItemId = null; this._playlist = items; this._repeatMode = 'RepeatNone'; - }; + } - PlayQueueManager.prototype.queue = function (items) { - for (var i = 0, length = items.length; i < length; i++) { + queue(items) { + for (let i = 0, length = items.length; i < length; i++) { addUniquePlaylistItemId(items[i]); this._playlist.push(items[i]); } - }; + } - PlayQueueManager.prototype.shufflePlaylist = function () { + shufflePlaylist() { this._sortedPlaylist = []; for (const item of this._playlist) { this._sortedPlaylist.push(item); @@ -65,42 +65,31 @@ define([], function () { } this._playlist.unshift(currentPlaylistItem); this._shuffleMode = 'Shuffle'; - }; + } - PlayQueueManager.prototype.sortShuffledPlaylist = function () { + sortShuffledPlaylist() { this._playlist = []; - for (let item of this._sortedPlaylist) { + for (const item of this._sortedPlaylist) { this._playlist.push(item); } this._sortedPlaylist = []; this._shuffleMode = 'Sorted'; - }; + } - PlayQueueManager.prototype.clearPlaylist = function (clearCurrentItem = false) { + clearPlaylist(clearCurrentItem = false) { const currentPlaylistItem = this._playlist.splice(this.getCurrentPlaylistIndex(), 1)[0]; this._playlist = []; if (!clearCurrentItem) { this._playlist.push(currentPlaylistItem); } - }; - - function arrayInsertAt(destArray, pos, arrayToInsert) { - var args = []; - args.push(pos); // where to insert - args.push(0); // nothing to remove - args = args.concat(arrayToInsert); // add on array to insert - destArray.splice.apply(destArray, args); // splice it in } - PlayQueueManager.prototype.queueNext = function (items) { - var i; - var length; - - for (i = 0, length = items.length; i < length; i++) { + queueNext(items) { + for (let i = 0, length = items.length; i < length; i++) { addUniquePlaylistItemId(items[i]); } - var currentIndex = this.getCurrentPlaylistIndex(); + let currentIndex = this.getCurrentPlaylistIndex(); if (currentIndex === -1) { currentIndex = this._playlist.length; @@ -109,43 +98,43 @@ define([], function () { } arrayInsertAt(this._playlist, currentIndex, items); - }; + } - PlayQueueManager.prototype.getCurrentPlaylistIndex = function () { + getCurrentPlaylistIndex() { return findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist); - }; + } - PlayQueueManager.prototype.getCurrentItem = function () { - var index = findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist); + getCurrentItem() { + const index = findPlaylistIndex(this.getCurrentPlaylistItemId(), this._playlist); return index === -1 ? null : this._playlist[index]; - }; + } - PlayQueueManager.prototype.getCurrentPlaylistItemId = function () { + getCurrentPlaylistItemId() { return this._currentPlaylistItemId; - }; + } - PlayQueueManager.prototype.setPlaylistState = function (playlistItemId, playlistIndex) { + setPlaylistState(playlistItemId, playlistIndex) { this._currentPlaylistItemId = playlistItemId; - }; + } - PlayQueueManager.prototype.setPlaylistIndex = function (playlistIndex) { + setPlaylistIndex(playlistIndex) { if (playlistIndex < 0) { this.setPlaylistState(null); } else { this.setPlaylistState(this._playlist[playlistIndex].PlaylistItemId); } - }; + } - PlayQueueManager.prototype.removeFromPlaylist = function (playlistItemIds) { + removeFromPlaylist(playlistItemIds) { if (this._playlist.length <= playlistItemIds.length) { return { result: 'empty' }; } - var currentPlaylistItemId = this.getCurrentPlaylistItemId(); - var isCurrentIndex = playlistItemIds.indexOf(currentPlaylistItemId) !== -1; + const currentPlaylistItemId = this.getCurrentPlaylistItemId(); + const isCurrentIndex = playlistItemIds.indexOf(currentPlaylistItemId) !== -1; this._sortedPlaylist = this._sortedPlaylist.filter(function (item) { return !playlistItemIds.includes(item.PlaylistItemId); @@ -159,17 +148,13 @@ define([], function () { result: 'removed', isCurrentIndex: isCurrentIndex }; - }; - - function moveInArray(array, from, to) { - array.splice(to, 0, array.splice(from, 1)[0]); } - PlayQueueManager.prototype.movePlaylistItem = function (playlistItemId, newIndex) { - var playlist = this.getPlaylist(); + movePlaylistItem(playlistItemId, newIndex) { + const playlist = this.getPlaylist(); - var oldIndex; - for (var i = 0, length = playlist.length; i < length; i++) { + let oldIndex; + for (let i = 0, length = playlist.length; i < length; i++) { if (playlist[i].PlaylistItemId === playlistItemId) { oldIndex = i; break; @@ -195,30 +180,30 @@ define([], function () { playlistItemId: playlistItemId, newIndex: newIndex }; - }; + } - PlayQueueManager.prototype.reset = function () { + reset() { this._sortedPlaylist = []; this._playlist = []; this._currentPlaylistItemId = null; this._repeatMode = 'RepeatNone'; this._shuffleMode = 'Sorted'; - }; + } - PlayQueueManager.prototype.setRepeatMode = function (value) { + setRepeatMode(value) { const repeatModes = ['RepeatOne', 'RepeatAll', 'RepeatNone']; if (repeatModes.includes(value)) { this._repeatMode = value; } else { throw new TypeError('invalid value provided for setRepeatMode'); } - }; + } - PlayQueueManager.prototype.getRepeatMode = function () { + getRepeatMode() { return this._repeatMode; - }; + } - PlayQueueManager.prototype.setShuffleMode = function (value) { + setShuffleMode(value) { switch (value) { case 'Shuffle': this.shufflePlaylist(); @@ -229,9 +214,9 @@ define([], function () { default: throw new TypeError('invalid value provided to setShuffleMode'); } - }; + } - PlayQueueManager.prototype.toggleShuffleMode = function () { + toggleShuffleMode() { switch (this._shuffleMode) { case 'Shuffle': this.setShuffleMode('Sorted'); @@ -242,16 +227,16 @@ define([], function () { default: throw new TypeError('current value for shufflequeue is invalid'); } - }; + } - PlayQueueManager.prototype.getShuffleMode = function () { + getShuffleMode() { return this._shuffleMode; - }; + } - PlayQueueManager.prototype.getNextItemInfo = function () { - var newIndex; - var playlist = this.getPlaylist(); - var playlistLength = playlist.length; + getNextItemInfo() { + let newIndex; + const playlist = this.getPlaylist(); + const playlistLength = playlist.length; switch (this.getRepeatMode()) { case 'RepeatOne': @@ -272,7 +257,7 @@ define([], function () { return null; } - var item = playlist[newIndex]; + const item = playlist[newIndex]; if (!item) { return null; @@ -282,7 +267,19 @@ define([], function () { item: item, index: newIndex }; - }; + } +} - return PlayQueueManager; -}); +function arrayInsertAt(destArray, pos, arrayToInsert) { + let args = []; + args.push(pos); // where to insert + args.push(0); // nothing to remove + args = args.concat(arrayToInsert); // add on array to insert + destArray.splice.apply(destArray, args); // splice it in +} + +function moveInArray(array, from, to) { + array.splice(to, 0, array.splice(from, 1)[0]); +} + +export default PlayQueueManager; diff --git a/src/components/refreshdialog/refreshdialog.js b/src/components/refreshdialog/refreshdialog.js index 40e1183502..1ec0517448 100644 --- a/src/components/refreshdialog/refreshdialog.js +++ b/src/components/refreshdialog/refreshdialog.js @@ -1,94 +1,108 @@ -define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'emby-input', 'emby-checkbox', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button'], function (dom, shell, dialogHelper, loading, layoutManager, connectionManager, appRouter, globalize) { - 'use strict'; +import dom from 'dom'; +import dialogHelper from 'dialogHelper'; +import loading from 'loading'; +import layoutManager from 'layoutManager'; +import connectionManager from 'connectionManager'; +import globalize from 'globalize'; +import 'emby-input'; +import 'emby-checkbox'; +import 'paper-icon-button-light'; +import 'emby-select'; +import 'material-icons'; +import 'css!./../formdialog'; +import 'emby-button'; - function getEditorHtml() { - var html = ''; +/*eslint prefer-const: "error"*/ - html += '
'; - html += '
'; - html += '
'; +function getEditorHtml() { + let html = ''; - html += '
'; - html += ''; - html += '
'; + html += '
'; + html += '
'; + html += ''; - html += ''; + html += '
'; + html += ''; + html += '
'; - html += '
'; - html += globalize.translate('RefreshDialogHelp'); - html += '
'; + html += ''; - html += ''; + html += '
'; + html += globalize.translate('RefreshDialogHelp'); + html += '
'; - html += '
'; - html += '
'; - html += ''; - html += '
'; + html += ''; - html += ''; - html += '
'; - html += '
'; + html += '
'; + html += '
'; + html += ''; + html += '
'; - return html; - } + html += ''; + html += '
'; + html += '
'; - function centerFocus(elem, horiz, on) { - require(['scrollHelper'], function (scrollHelper) { - var fn = on ? 'on' : 'off'; - scrollHelper.centerFocus[fn](elem, horiz); + return html; +} + +function centerFocus(elem, horiz, on) { + import('scrollHelper').then(({default: scrollHelper}) => { + const fn = on ? 'on' : 'off'; + scrollHelper.centerFocus[fn](elem, horiz); + }); +} + +function onSubmit(e) { + loading.show(); + + const instance = this; + const dlg = dom.parentWithClass(e.target, 'dialog'); + const options = instance.options; + + const apiClient = connectionManager.getApiClient(options.serverId); + + const replaceAllMetadata = dlg.querySelector('#selectMetadataRefreshMode').value === 'all'; + + const mode = dlg.querySelector('#selectMetadataRefreshMode').value === 'scan' ? 'Default' : 'FullRefresh'; + const replaceAllImages = mode === 'FullRefresh' && dlg.querySelector('.chkReplaceImages').checked; + + options.itemIds.forEach(function (itemId) { + apiClient.refreshItem(itemId, { + + Recursive: true, + ImageRefreshMode: mode, + MetadataRefreshMode: mode, + ReplaceAllImages: replaceAllImages, + ReplaceAllMetadata: replaceAllMetadata }); - } + }); - function onSubmit(e) { - loading.show(); + dialogHelper.close(dlg); - var instance = this; - var dlg = dom.parentWithClass(e.target, 'dialog'); - var options = instance.options; + import('toast').then(({default: toast}) => { + toast(globalize.translate('RefreshQueued')); + }); - var apiClient = connectionManager.getApiClient(options.serverId); + loading.hide(); - var replaceAllMetadata = dlg.querySelector('#selectMetadataRefreshMode').value === 'all'; + e.preventDefault(); + return false; +} - var mode = dlg.querySelector('#selectMetadataRefreshMode').value === 'scan' ? 'Default' : 'FullRefresh'; - var replaceAllImages = mode === 'FullRefresh' && dlg.querySelector('.chkReplaceImages').checked; - - options.itemIds.forEach(function (itemId) { - apiClient.refreshItem(itemId, { - - Recursive: true, - ImageRefreshMode: mode, - MetadataRefreshMode: mode, - ReplaceAllImages: replaceAllImages, - ReplaceAllMetadata: replaceAllMetadata - }); - }); - - dialogHelper.close(dlg); - - require(['toast'], function (toast) { - toast(globalize.translate('RefreshQueued')); - }); - - loading.hide(); - - e.preventDefault(); - return false; - } - - function RefreshDialog(options) { +class RefreshDialog { + constructor(options) { this.options = options; } - RefreshDialog.prototype.show = function () { - var dialogOptions = { + show() { + const dialogOptions = { removeOnClose: true, scrollY: false }; @@ -99,12 +113,12 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionM dialogOptions.size = 'small'; } - var dlg = dialogHelper.createDialog(dialogOptions); + const dlg = dialogHelper.createDialog(dialogOptions); dlg.classList.add('formDialog'); - var html = ''; - var title = globalize.translate('RefreshMetadata'); + let html = ''; + const title = globalize.translate('RefreshMetadata'); html += '
'; html += ''; @@ -150,7 +164,7 @@ define(['dom', 'shell', 'dialogHelper', 'loading', 'layoutManager', 'connectionM dlg.addEventListener('close', resolve); dialogHelper.open(dlg); }); - }; + } +} - return RefreshDialog; -}); +export default RefreshDialog; diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index db2bed36a7..ca1657605b 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -48,7 +48,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL menuItems.unshift({ id: -1, name: globalize.translate('ButtonOff'), - selected: null == currentIndex + selected: currentIndex == null }); require(['actionsheet'], function (actionsheet) { @@ -69,18 +69,18 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL } function seriesImageUrl(item, options) { - if ('Episode' !== item.Type) { + if (item.Type !== 'Episode') { return null; } options = options || {}; options.type = options.type || 'Primary'; - if ('Primary' === options.type && item.SeriesPrimaryImageTag) { + if (options.type === 'Primary' && item.SeriesPrimaryImageTag) { options.tag = item.SeriesPrimaryImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } - if ('Thumb' === options.type) { + if (options.type === 'Thumb') { if (item.SeriesThumbImageTag) { options.tag = item.SeriesThumbImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); @@ -210,7 +210,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL backdrop.setBackdrops([item]); apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) { var userData = fullItem.UserData || {}; - var likes = null == userData.Likes ? '' : userData.Likes; + var likes = userData.Likes == null ? '' : userData.Likes; context.querySelector('.nowPlayingPageUserDataButtonsTitle').innerHTML = ''; context.querySelector('.nowPlayingPageUserDataButtons').innerHTML = ''; }); @@ -251,7 +251,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL var all = context.querySelectorAll('.btnCommand'); for (var i = 0, length = all.length; i < length; i++) { - var enableButton = -1 !== commands.indexOf(all[i].getAttribute('data-command')); + var enableButton = commands.indexOf(all[i].getAttribute('data-command')) !== -1; all[i].disabled = !enableButton; } } @@ -278,7 +278,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL currentPlayerSupportedCommands = supportedCommands; var playState = state.PlayState || {}; var isSupportedCommands = supportedCommands.includes('DisplayMessage') || supportedCommands.includes('SendString') || supportedCommands.includes('Select'); - buttonVisible(context.querySelector('.btnToggleFullscreen'), item && 'Video' == item.MediaType && supportedCommands.includes('ToggleFullscreen')); + buttonVisible(context.querySelector('.btnToggleFullscreen'), item && item.MediaType == 'Video' && supportedCommands.includes('ToggleFullscreen')); updateAudioTracksDisplay(player, context); updateSubtitleTracksDisplay(player, context); @@ -306,15 +306,15 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL context.querySelector('.remoteControlSection').classList.add('hide'); } - buttonVisible(context.querySelector('.btnStop'), null != item); - buttonVisible(context.querySelector('.btnNextTrack'), null != item); - buttonVisible(context.querySelector('.btnPreviousTrack'), null != item); + buttonVisible(context.querySelector('.btnStop'), item != null); + buttonVisible(context.querySelector('.btnNextTrack'), item != null); + buttonVisible(context.querySelector('.btnPreviousTrack'), item != null); if (layoutManager.mobile) { buttonVisible(context.querySelector('.btnRewind'), false); buttonVisible(context.querySelector('.btnFastForward'), false); } else { - buttonVisible(context.querySelector('.btnRewind'), null != item); - buttonVisible(context.querySelector('.btnFastForward'), null != item); + buttonVisible(context.querySelector('.btnRewind'), item != null); + buttonVisible(context.querySelector('.btnFastForward'), item != null); } var positionSlider = context.querySelector('.nowPlayingPositionSlider'); @@ -325,15 +325,15 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL if (positionSlider && !positionSlider.dragging) { positionSlider.disabled = !playState.CanSeek; - var isProgressClear = state.MediaSource && null == state.MediaSource.RunTimeTicks; + var isProgressClear = state.MediaSource && state.MediaSource.RunTimeTicks == null; positionSlider.setIsClear(isProgressClear); } - updatePlayPauseState(playState.IsPaused, null != item); + updatePlayPauseState(playState.IsPaused, item != null); updateTimeDisplay(playState.PositionTicks, item ? item.RunTimeTicks : null); updatePlayerVolumeState(context, playState.IsMuted, playState.VolumeLevel); - if (item && 'Video' == item.MediaType) { + if (item && item.MediaType == 'Video') { context.classList.remove('hideVideoButtons'); } else { context.classList.add('hideVideoButtons'); @@ -346,12 +346,12 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL function updateAudioTracksDisplay(player, context) { var supportedCommands = currentPlayerSupportedCommands; - buttonVisible(context.querySelector('.btnAudioTracks'), playbackManager.audioTracks(player).length > 1 && -1 != supportedCommands.indexOf('SetAudioStreamIndex')); + buttonVisible(context.querySelector('.btnAudioTracks'), playbackManager.audioTracks(player).length > 1 && supportedCommands.indexOf('SetAudioStreamIndex') != -1); } function updateSubtitleTracksDisplay(player, context) { var supportedCommands = currentPlayerSupportedCommands; - buttonVisible(context.querySelector('.btnSubtitles'), playbackManager.subtitleTracks(player).length && -1 != supportedCommands.indexOf('SetSubtitleStreamIndex')); + buttonVisible(context.querySelector('.btnSubtitles'), playbackManager.subtitleTracks(player).length && supportedCommands.indexOf('SetSubtitleStreamIndex') != -1); } function updateRepeatModeDisplay(repeatMode) { @@ -383,11 +383,11 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL var view = context; var supportedCommands = currentPlayerSupportedCommands; - if (-1 === supportedCommands.indexOf('Mute')) { + if (supportedCommands.indexOf('Mute') === -1) { showMuteButton = false; } - if (-1 === supportedCommands.indexOf('SetVolume')) { + if (supportedCommands.indexOf('SetVolume') === -1) { showVolumeSlider = false; } @@ -452,8 +452,8 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL } } - context.querySelector('.positionTime').innerHTML = null == positionTicks ? '--:--' : datetime.getDisplayRunningTime(positionTicks); - context.querySelector('.runtime').innerHTML = null != runtimeTicks ? datetime.getDisplayRunningTime(runtimeTicks) : '--:--'; + context.querySelector('.positionTime').innerHTML = positionTicks == null ? '--:--' : datetime.getDisplayRunningTime(positionTicks); + context.querySelector('.runtime').innerHTML = runtimeTicks != null ? datetime.getDisplayRunningTime(runtimeTicks) : '--:--'; } function getPlaylistItems(player) { diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js index be1cdf575b..6f89702012 100644 --- a/src/components/tvproviders/schedulesdirect.js +++ b/src/components/tvproviders/schedulesdirect.js @@ -42,7 +42,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb for (var region in result) { var countries = result[region]; - if (countries.length && 'ZZZ' !== region) { + if (countries.length && region !== 'ZZZ') { for (i = 0, length = countries.length; i < length; i++) { countryList.push({ name: countries[i].fullName, @@ -237,7 +237,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emb var device = devices[i]; html += '
'; var enabledTuners = providerInfo.EnabledTuners || []; - var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id); + var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1; var checkedAttribute = isChecked ? ' checked' : ''; html += ''; html += '
'; diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js index 054c5b640d..5c75a09cdd 100644 --- a/src/components/tvproviders/xmltv.js +++ b/src/components/tvproviders/xmltv.js @@ -84,7 +84,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi }).then(function (result) { loading.hide(); - if (false !== options.showConfirmation) { + if (options.showConfirmation !== false) { Dashboard.processServerConfigurationUpdateResult(); } @@ -118,7 +118,7 @@ define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listVi var device = devices[i]; html += '
'; var enabledTuners = providerInfo.EnabledTuners || []; - var isChecked = providerInfo.EnableAllTuners || -1 !== enabledTuners.indexOf(device.Id); + var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1; var checkedAttribute = isChecked ? ' checked' : ''; html += ''; html += '
'; diff --git a/src/components/viewContainer.js b/src/components/viewContainer.js index dbc493bc91..d1b0df6fbb 100644 --- a/src/components/viewContainer.js +++ b/src/components/viewContainer.js @@ -9,7 +9,7 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta var controllerUrl = view.getAttribute('data-controller'); if (controllerUrl) { - if (0 === controllerUrl.indexOf('__plugin/')) { + if (controllerUrl.indexOf('__plugin/') === 0) { controllerUrl = controllerUrl.substring('__plugin/'.length); } @@ -31,14 +31,14 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta function loadView(options) { if (!options.cancel) { var selected = selectedPageIndex; - var previousAnimatable = -1 === selected ? null : allPages[selected]; + var previousAnimatable = selected === -1 ? null : allPages[selected]; var pageIndex = selected + 1; if (pageIndex >= pageContainerCount) { pageIndex = 0; } - var isPluginpage = -1 !== options.url.toLowerCase().indexOf('/configurationpage'); + var isPluginpage = options.url.toLowerCase().indexOf('/configurationpage') !== -1; var newViewInfo = normalizeNewView(options, isPluginpage); var newView = newViewInfo.elem; var modulesToLoad = []; @@ -53,7 +53,7 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta var view = newView; - if ('string' == typeof view) { + if (typeof view == 'string') { view = document.createElement('div'); view.innerHTML = newView; } @@ -133,15 +133,15 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta function normalizeNewView(options, isPluginpage) { var viewHtml = options.view; - if (-1 === viewHtml.indexOf('data-role="page"')) { + if (viewHtml.indexOf('data-role="page"') === -1) { return viewHtml; } - var hasScript = -1 !== viewHtml.indexOf(''; - btnCssClass = session.ServerId && -1 !== session.SupportedCommands.indexOf('DisplayMessage') && session.DeviceId !== connectionManager.deviceId() ? '' : ' hide'; + btnCssClass = session.ServerId && session.SupportedCommands.indexOf('DisplayMessage') !== -1 && session.DeviceId !== connectionManager.deviceId() ? '' : ' hide'; html += ''; html += '
'; @@ -346,7 +346,7 @@ import 'emby-itemscontainer'; function renderRunningTasks(view, tasks) { let html = ''; tasks = tasks.filter(function (task) { - if ('Idle' != task.State) { + if (task.State != 'Idle') { return !task.IsHidden; } @@ -551,7 +551,7 @@ import 'emby-itemscontainer'; row.classList.remove('playingSession'); } - if (session.ServerId && -1 !== session.SupportedCommands.indexOf('DisplayMessage') && session.DeviceId !== connectionManager.deviceId()) { + if (session.ServerId && session.SupportedCommands.indexOf('DisplayMessage') !== -1 && session.DeviceId !== connectionManager.deviceId()) { row.querySelector('.btnSessionSendMessage').classList.remove('hide'); } else { row.querySelector('.btnSessionSendMessage').classList.add('hide'); diff --git a/src/controllers/dashboard/dlna/profile.js b/src/controllers/dashboard/dlna/profile.js index 2a4fbec37b..17dc9f78cb 100644 --- a/src/controllers/dashboard/dlna/profile.js +++ b/src/controllers/dashboard/dlna/profile.js @@ -29,7 +29,7 @@ import 'listViewStyle'; function renderProfile(page, profile, users) { $('#txtName', page).val(profile.Name); $('.chkMediaType', page).each(function () { - this.checked = -1 != (profile.SupportedMediaTypes || '').split(',').indexOf(this.getAttribute('data-value')); + this.checked = (profile.SupportedMediaTypes || '').split(',').indexOf(this.getAttribute('data-value')) != -1; }); $('#chkEnableAlbumArtInDidl', page).prop('checked', profile.EnableAlbumArtInDidl); $('#chkEnableSingleImageLimit', page).prop('checked', profile.EnableSingleAlbumArtLimit); @@ -111,7 +111,7 @@ import 'listViewStyle'; } function editIdentificationHeader(page, header) { - isSubProfileNew = null == header; + isSubProfileNew = header == null; header = header || {}; currentSubProfile = header; const popup = $('#identificationHeaderPopup', page); @@ -156,7 +156,7 @@ import 'listViewStyle'; } function editXmlDocumentAttribute(page, attribute) { - isSubProfileNew = null == attribute; + isSubProfileNew = attribute == null; attribute = attribute || {}; currentSubProfile = attribute; const popup = $('#xmlAttributePopup', page); @@ -204,7 +204,7 @@ import 'listViewStyle'; } function editSubtitleProfile(page, profile) { - isSubProfileNew = null == profile; + isSubProfileNew = profile == null; profile = profile || {}; currentSubProfile = profile; const popup = $('#subtitleProfilePopup', page); @@ -266,11 +266,11 @@ import 'listViewStyle'; html += ''; html += '

' + globalize.translate('ValueContainer', profile.Container || allText) + '

'; - if ('Video' == profile.Type) { + if (profile.Type == 'Video') { html += '

' + globalize.translate('ValueVideoCodec', profile.VideoCodec || allText) + '

'; html += '

' + globalize.translate('ValueAudioCodec', profile.AudioCodec || allText) + '

'; } else { - if ('Audio' == profile.Type) { + if (profile.Type == 'Audio') { html += '

' + globalize.translate('ValueCodec', profile.AudioCodec || allText) + '

'; } } @@ -298,7 +298,7 @@ import 'listViewStyle'; } function editDirectPlayProfile(page, directPlayProfile) { - isSubProfileNew = null == directPlayProfile; + isSubProfileNew = directPlayProfile == null; directPlayProfile = directPlayProfile || {}; currentSubProfile = directPlayProfile; const popup = $('#popupEditDirectPlayProfile', page); @@ -327,11 +327,11 @@ import 'listViewStyle'; html += '

Protocol: ' + (profile.Protocol || 'Http') + '

'; html += '

' + globalize.translate('ValueContainer', profile.Container || allText) + '

'; - if ('Video' == profile.Type) { + if (profile.Type == 'Video') { html += '

' + globalize.translate('ValueVideoCodec', profile.VideoCodec || allText) + '

'; html += '

' + globalize.translate('ValueAudioCodec', profile.AudioCodec || allText) + '

'; } else { - if ('Audio' == profile.Type) { + if (profile.Type == 'Audio') { html += '

' + globalize.translate('ValueCodec', profile.AudioCodec || allText) + '

'; } } @@ -354,7 +354,7 @@ import 'listViewStyle'; } function editTranscodingProfile(page, transcodingProfile) { - isSubProfileNew = null == transcodingProfile; + isSubProfileNew = transcodingProfile == null; transcodingProfile = transcodingProfile || {}; currentSubProfile = transcodingProfile; const popup = $('#transcodingProfilePopup', page); @@ -365,7 +365,7 @@ import 'listViewStyle'; $('#selectTranscodingProtocol', popup).val(transcodingProfile.Protocol || 'Http'); $('#chkEnableMpegtsM2TsMode', popup).prop('checked', transcodingProfile.EnableMpegtsM2TsMode || false); $('#chkEstimateContentLength', popup).prop('checked', transcodingProfile.EstimateContentLength || false); - $('#chkReportByteRangeRequests', popup).prop('checked', 'Bytes' == transcodingProfile.TranscodeSeekInfo); + $('#chkReportByteRangeRequests', popup).prop('checked', transcodingProfile.TranscodeSeekInfo == 'Bytes'); $('.radioTabButton:first', popup).trigger('click'); openPopup(popup[0]); } @@ -443,7 +443,7 @@ import 'listViewStyle'; } function editContainerProfile(page, containerProfile) { - isSubProfileNew = null == containerProfile; + isSubProfileNew = containerProfile == null; containerProfile = containerProfile || {}; currentSubProfile = containerProfile; const popup = $('#containerProfilePopup', page); @@ -515,7 +515,7 @@ import 'listViewStyle'; } function editCodecProfile(page, codecProfile) { - isSubProfileNew = null == codecProfile; + isSubProfileNew = codecProfile == null; codecProfile = codecProfile || {}; currentSubProfile = codecProfile; const popup = $('#codecProfilePopup', page); @@ -555,11 +555,11 @@ import 'listViewStyle'; html += '
'; html += '

' + globalize.translate('ValueContainer', profile.Container || allText) + '

'; - if ('Video' == profile.Type) { + if (profile.Type == 'Video') { html += '

' + globalize.translate('ValueVideoCodec', profile.VideoCodec || allText) + '

'; html += '

' + globalize.translate('ValueAudioCodec', profile.AudioCodec || allText) + '

'; } else { - if ('Audio' == profile.Type) { + if (profile.Type == 'Audio') { html += '

' + globalize.translate('ValueCodec', profile.AudioCodec || allText) + '

'; } } @@ -595,7 +595,7 @@ import 'listViewStyle'; } function editResponseProfile(page, responseProfile) { - isSubProfileNew = null == responseProfile; + isSubProfileNew = responseProfile == null; responseProfile = responseProfile || {}; currentSubProfile = responseProfile; const popup = $('#responseProfilePopup', page); @@ -703,26 +703,26 @@ import 'listViewStyle'; $('.radioTabButton', page).on('click', function () { $(this).siblings().removeClass('ui-btn-active'); $(this).addClass('ui-btn-active'); - const value = 'A' == this.tagName ? this.getAttribute('data-value') : this.value; + const value = this.tagName == 'A' ? this.getAttribute('data-value') : this.value; const elem = $('.' + value, page); elem.siblings('.tabContent').hide(); elem.show(); }); $('#selectDirectPlayProfileType', page).on('change', function () { - if ('Video' == this.value) { + if (this.value == 'Video') { $('#fldDirectPlayVideoCodec', page).show(); } else { $('#fldDirectPlayVideoCodec', page).hide(); } - if ('Photo' == this.value) { + if (this.value == 'Photo') { $('#fldDirectPlayAudioCodec', page).hide(); } else { $('#fldDirectPlayAudioCodec', page).show(); } }); $('#selectTranscodingProfileType', page).on('change', function () { - if ('Video' == this.value) { + if (this.value == 'Video') { $('#fldTranscodingVideoCodec', page).show(); $('#fldTranscodingProtocol', page).show(); $('#fldEnableMpegtsM2TsMode', page).show(); @@ -732,7 +732,7 @@ import 'listViewStyle'; $('#fldEnableMpegtsM2TsMode', page).hide(); } - if ('Photo' == this.value) { + if (this.value == 'Photo') { $('#fldTranscodingAudioCodec', page).hide(); $('#fldEstimateContentLength', page).hide(); $('#fldReportByteRangeRequests', page).hide(); @@ -743,13 +743,13 @@ import 'listViewStyle'; } }); $('#selectResponseProfileType', page).on('change', function () { - if ('Video' == this.value) { + if (this.value == 'Video') { $('#fldResponseProfileVideoCodec', page).show(); } else { $('#fldResponseProfileVideoCodec', page).hide(); } - if ('Photo' == this.value) { + if (this.value == 'Photo') { $('#fldResponseProfileAudioCodec', page).hide(); } else { $('#fldResponseProfileAudioCodec', page).show(); diff --git a/src/controllers/dashboard/dlna/profiles.js b/src/controllers/dashboard/dlna/profiles.js index 510128be4b..7fd3bdb525 100644 --- a/src/controllers/dashboard/dlna/profiles.js +++ b/src/controllers/dashboard/dlna/profiles.js @@ -18,13 +18,13 @@ import 'emby-button'; function renderUserProfiles(page, profiles) { renderProfiles(page, page.querySelector('.customProfiles'), profiles.filter(function (p) { - return 'User' == p.Type; + return p.Type == 'User'; })); } function renderSystemProfiles(page, profiles) { renderProfiles(page, page.querySelector('.systemProfiles'), profiles.filter(function (p) { - return 'System' == p.Type; + return p.Type == 'System'; })); } @@ -45,7 +45,7 @@ import 'emby-button'; html += '
'; html += '
'; - if ('User' == profile.Type) { + if (profile.Type == 'User') { html += ''; } diff --git a/src/controllers/dashboard/encodingsettings.js b/src/controllers/dashboard/encodingsettings.js index aac18360ac..9995577ba8 100644 --- a/src/controllers/dashboard/encodingsettings.js +++ b/src/controllers/dashboard/encodingsettings.js @@ -8,7 +8,7 @@ import libraryMenu from 'libraryMenu'; function loadPage(page, config, systemInfo) { Array.prototype.forEach.call(page.querySelectorAll('.chkDecodeCodec'), function (c) { - c.checked = -1 !== (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute('data-codec')); + c.checked = (config.HardwareDecodingCodecs || []).indexOf(c.getAttribute('data-codec')) !== -1; }); page.querySelector('#chkDecodingColorDepth10Hevc').checked = config.EnableDecodingColorDepth10Hevc; page.querySelector('#chkDecodingColorDepth10Vp9').checked = config.EnableDecodingColorDepth10Vp9; @@ -107,7 +107,7 @@ import libraryMenu from 'libraryMenu'; value = value || ''; let any; Array.prototype.forEach.call(context.querySelectorAll('.chkDecodeCodec'), function (c) { - if (-1 === c.getAttribute('data-types').split(',').indexOf(value)) { + if (c.getAttribute('data-types').split(',').indexOf(value) === -1) { dom.parentWithTag(c, 'LABEL').classList.add('hide'); } else { dom.parentWithTag(c, 'LABEL').classList.remove('hide'); @@ -138,7 +138,7 @@ import libraryMenu from 'libraryMenu'; $(document).on('pageinit', '#encodingSettingsPage', function () { const page = this; page.querySelector('#selectVideoDecoder').addEventListener('change', function () { - if ('vaapi' == this.value) { + if (this.value == 'vaapi') { page.querySelector('.fldVaapiDevice').classList.remove('hide'); page.querySelector('#txtVaapiDevice').setAttribute('required', 'required'); } else { diff --git a/src/controllers/dashboard/librarydisplay.js b/src/controllers/dashboard/librarydisplay.js index 2269e19c44..bbc7e633d1 100644 --- a/src/controllers/dashboard/librarydisplay.js +++ b/src/controllers/dashboard/librarydisplay.js @@ -48,7 +48,7 @@ import 'emby-button'; ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); }); ApiClient.getNamedConfiguration('metadata').then(function(config) { - config.UseFileCreationTimeForDateAdded = '1' === $('#selectDateAdded', form).val(); + config.UseFileCreationTimeForDateAdded = $('#selectDateAdded', form).val() === '1'; ApiClient.updateNamedConfiguration('metadata', config); }); @@ -61,7 +61,7 @@ import 'emby-button'; libraryMenu.setTabs('librarysetup', 1, getTabs); loadData(); ApiClient.getSystemInfo().then(function(info) { - if ('Windows' === info.OperatingSystem) { + if (info.OperatingSystem === 'Windows') { view.querySelector('.fldSaveMetadataHidden').classList.remove('hide'); } else { view.querySelector('.fldSaveMetadataHidden').classList.add('hide'); diff --git a/src/controllers/dashboard/mediaLibrary.js b/src/controllers/dashboard/mediaLibrary.js index 6694a28d0f..4fee65e674 100644 --- a/src/controllers/dashboard/mediaLibrary.js +++ b/src/controllers/dashboard/mediaLibrary.js @@ -156,7 +156,7 @@ import 'emby-itemrefreshindicator'; } function shouldRefreshLibraryAfterChanges(page) { - return 'mediaLibraryPage' === page.id; + return page.id === 'mediaLibraryPage'; } function reloadVirtualFolders(page, virtualFolders) { @@ -286,7 +286,7 @@ import 'emby-itemrefreshindicator'; if (hasCardImageContainer) { html += '
'; - html += '
'; + html += '
'; html += '
'; html += '
'; } diff --git a/src/controllers/dashboard/networking.js b/src/controllers/dashboard/networking.js index 5cae08d2fa..a7f3076056 100644 --- a/src/controllers/dashboard/networking.js +++ b/src/controllers/dashboard/networking.js @@ -30,7 +30,7 @@ import 'emby-select'; }).filter(function (s) { return s.length > 0; }); - config.IsRemoteIPFilterBlacklist = 'blacklist' === form.querySelector('#selectExternalAddressFilterMode').value; + config.IsRemoteIPFilterBlacklist = form.querySelector('#selectExternalAddressFilterMode').value === 'blacklist'; config.PublicPort = form.querySelector('#txtPublicPort').value; config.PublicHttpsPort = form.querySelector('#txtPublicHttpsPort').value; config.HttpServerPortNumber = form.querySelector('#txtPortNumber').value; @@ -110,7 +110,7 @@ import 'emby-select'; page.querySelector('#txtLanNetworks').value = (config.LocalNetworkSubnets || []).join(', '); page.querySelector('#txtExternalAddressFilter').value = (config.RemoteIPFilter || []).join(', '); page.querySelector('#selectExternalAddressFilterMode').value = config.IsRemoteIPFilterBlacklist ? 'blacklist' : 'whitelist'; - page.querySelector('#chkRemoteAccess').checked = null == config.EnableRemoteAccess || config.EnableRemoteAccess; + page.querySelector('#chkRemoteAccess').checked = config.EnableRemoteAccess == null || config.EnableRemoteAccess; page.querySelector('#txtHttpsPort').value = config.HttpsPortNumber; page.querySelector('#chkEnableHttps').checked = config.EnableHttps; page.querySelector('#chkRequireHttps').checked = config.RequireHttps; diff --git a/src/controllers/dashboard/notifications/notification/index.js b/src/controllers/dashboard/notifications/notification/index.js index af9301c13f..edecd5d853 100644 --- a/src/controllers/dashboard/notifications/notification/index.js +++ b/src/controllers/dashboard/notifications/notification/index.js @@ -106,7 +106,7 @@ define(['jQuery', 'emby-checkbox'], function ($) { $(document).on('pageinit', '#notificationSettingPage', function () { var page = this; $('#selectUsers', page).on('change', function () { - if ('Custom' == this.value) { + if (this.value == 'Custom') { $('.selectCustomUsers', page).show(); } else { $('.selectCustomUsers', page).hide(); diff --git a/src/controllers/dashboard/plugins/available/index.js b/src/controllers/dashboard/plugins/available/index.js index 1f202d6ff6..e27a3298da 100644 --- a/src/controllers/dashboard/plugins/available/index.js +++ b/src/controllers/dashboard/plugins/available/index.js @@ -17,13 +17,13 @@ define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby function getHeaderText(category) { category = category.replace(' ', ''); - if ('Channel' === category) { + if (category === 'Channel') { category = 'Channels'; - } else if ('Theme' === category) { + } else if (category === 'Theme') { category = 'Themes'; - } else if ('LiveTV' === category) { + } else if (category === 'LiveTV') { category = 'HeaderLiveTV'; - } else if ('ScreenSaver' === category) { + } else if (category === 'ScreenSaver') { category = 'HeaderScreenSavers'; } diff --git a/src/controllers/dashboard/scheduledtasks/scheduledtask.js b/src/controllers/dashboard/scheduledtasks/scheduledtask.js index 28a21eb630..7944eb8a60 100644 --- a/src/controllers/dashboard/scheduledtasks/scheduledtask.js +++ b/src/controllers/dashboard/scheduledtasks/scheduledtask.js @@ -84,16 +84,16 @@ import 'emby-select'; }, // TODO: Replace this mess with date-fns and remove datetime completely getTriggerFriendlyName: function (trigger) { - if ('DailyTrigger' == trigger.Type) { + if (trigger.Type == 'DailyTrigger') { return globalize.translate('DailyAt', ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); } - if ('WeeklyTrigger' == trigger.Type) { + if (trigger.Type == 'WeeklyTrigger') { // TODO: The day of week isn't localised as well return globalize.translate('WeeklyAt', trigger.DayOfWeek, ScheduledTaskPage.getDisplayTime(trigger.TimeOfDayTicks)); } - if ('SystemEventTrigger' == trigger.Type && 'WakeFromSleep' == trigger.SystemEvent) { + if (trigger.Type == 'SystemEventTrigger' && trigger.SystemEvent == 'WakeFromSleep') { return globalize.translate('OnWakeFromSleep'); } diff --git a/src/controllers/dashboard/users/useredit.js b/src/controllers/dashboard/users/useredit.js index 866e940e54..796b70c704 100644 --- a/src/controllers/dashboard/users/useredit.js +++ b/src/controllers/dashboard/users/useredit.js @@ -14,13 +14,13 @@ import globalize from 'globalize'; let html = ''; for (const folder of mediaFolders) { - isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id); + isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1; checkedAttribute = isChecked ? ' checked="checked"' : ''; html += ''; } for (const folder of channelsResult.Items) { - isChecked = user.Policy.EnableContentDeletion || -1 != user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id); + isChecked = user.Policy.EnableContentDeletion || user.Policy.EnableContentDeletionFromFolders.indexOf(folder.Id) != -1; checkedAttribute = isChecked ? ' checked="checked"' : ''; html += ''; } @@ -96,7 +96,7 @@ import globalize from 'globalize'; $('#chkEnableVideoPlaybackTranscoding', page).prop('checked', user.Policy.EnableVideoPlaybackTranscoding); $('#chkEnableVideoPlaybackRemuxing', page).prop('checked', user.Policy.EnablePlaybackRemuxing); $('#chkForceRemoteSourceTranscoding', page).prop('checked', user.Policy.ForceRemoteSourceTranscoding); - $('#chkRemoteAccess', page).prop('checked', null == user.Policy.EnableRemoteAccess || user.Policy.EnableRemoteAccess); + $('#chkRemoteAccess', page).prop('checked', user.Policy.EnableRemoteAccess == null || user.Policy.EnableRemoteAccess); $('#chkEnableSyncTranscoding', page).prop('checked', user.Policy.EnableSyncTranscoding); $('#chkEnableConversion', page).prop('checked', user.Policy.EnableMediaConversion || false); $('#chkEnableSharing', page).prop('checked', user.Policy.EnablePublicSharing); diff --git a/src/controllers/dashboard/users/userlibraryaccess.js b/src/controllers/dashboard/users/userlibraryaccess.js index df42733f0c..d32c7312b7 100644 --- a/src/controllers/dashboard/users/userlibraryaccess.js +++ b/src/controllers/dashboard/users/userlibraryaccess.js @@ -18,7 +18,7 @@ import globalize from 'globalize'; for (let i = 0, length = mediaFolders.length; i < length; i++) { const folder = mediaFolders[i]; - const isChecked = user.Policy.EnableAllFolders || -1 != user.Policy.EnabledFolders.indexOf(folder.Id); + const isChecked = user.Policy.EnableAllFolders || user.Policy.EnabledFolders.indexOf(folder.Id) != -1; const checkedAttribute = isChecked ? ' checked="checked"' : ''; html += ''; } @@ -37,7 +37,7 @@ import globalize from 'globalize'; for (let i = 0, length = channels.length; i < length; i++) { const folder = channels[i]; - const isChecked = user.Policy.EnableAllChannels || -1 != user.Policy.EnabledChannels.indexOf(folder.Id); + const isChecked = user.Policy.EnableAllChannels || user.Policy.EnabledChannels.indexOf(folder.Id) != -1; const checkedAttribute = isChecked ? ' checked="checked"' : ''; html += ''; } @@ -61,7 +61,7 @@ import globalize from 'globalize'; for (let i = 0, length = devices.length; i < length; i++) { const device = devices[i]; - const checkedAttribute = user.Policy.EnableAllDevices || -1 != user.Policy.EnabledDevices.indexOf(device.Id) ? ' checked="checked"' : ''; + const checkedAttribute = user.Policy.EnableAllDevices || user.Policy.EnabledDevices.indexOf(device.Id) != -1 ? ' checked="checked"' : ''; html += ''; } diff --git a/src/controllers/dashboard/users/userparentalcontrol.js b/src/controllers/dashboard/users/userparentalcontrol.js index e146aac567..0c74c2c018 100644 --- a/src/controllers/dashboard/users/userparentalcontrol.js +++ b/src/controllers/dashboard/users/userparentalcontrol.js @@ -67,7 +67,7 @@ import 'paper-icon-button-light'; for (let i = 0, length = items.length; i < length; i++) { const item = items[i]; - const checkedAttribute = -1 != user.Policy.BlockUnratedItems.indexOf(item.value) ? ' checked="checked"' : ''; + const checkedAttribute = user.Policy.BlockUnratedItems.indexOf(item.value) != -1 ? ' checked="checked"' : ''; html += ''; } @@ -201,7 +201,7 @@ import 'paper-icon-button-light'; }).then(function (updatedSchedule) { const schedules = getSchedulesFromPage(page); - if (-1 == index) { + if (index == -1) { index = schedules.length; } @@ -234,7 +234,7 @@ import 'paper-icon-button-light'; }).then(function (value) { const tags = getBlockedTagsFromPage(page); - if (-1 == tags.indexOf(value)) { + if (tags.indexOf(value) == -1) { tags.push(value); loadBlockedTags(page, tags); } diff --git a/src/controllers/dashboard/users/userpasswordpage.js b/src/controllers/dashboard/users/userpasswordpage.js index d694bb2c5d..db91c7bce7 100644 --- a/src/controllers/dashboard/users/userpasswordpage.js +++ b/src/controllers/dashboard/users/userpasswordpage.js @@ -14,7 +14,7 @@ import 'emby-button'; let showPasswordSection = true; let showLocalAccessSection = false; - if ('Guest' == user.ConnectLinkType) { + if (user.ConnectLinkType == 'Guest') { page.querySelector('.localAccessSection').classList.add('hide'); showPasswordSection = false; } else if (user.HasConfiguredPassword) { diff --git a/src/controllers/dashboard/users/userprofilespage.js b/src/controllers/dashboard/users/userprofilespage.js index 824baef4cf..add90d0a0b 100644 --- a/src/controllers/dashboard/users/userprofilespage.js +++ b/src/controllers/dashboard/users/userprofilespage.js @@ -129,7 +129,7 @@ import 'flexStyles'; html += '
'; html += '
'; const lastSeen = getLastSeenText(user.LastActivityDate); - html += '' != lastSeen ? lastSeen : ' '; + html += lastSeen != '' ? lastSeen : ' '; html += '
'; html += '
'; html += ''; diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index 51c4301a71..74cf186729 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -147,11 +147,11 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap options.Limit = 20; var userId = apiClient.getCurrentUserId(); - if ('MusicArtist' === section.types) { + if (section.types === 'MusicArtist') { return apiClient.getArtists(userId, options); } - if ('Person' === section.types) { + if (section.types === 'Person') { return apiClient.getPeople(userId, options); } @@ -198,7 +198,7 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap preferThumb: section.preferThumb, shape: section.shape, centerText: section.centerText && !cardLayout, - overlayText: false !== section.overlayText, + overlayText: section.overlayText !== false, showTitle: section.showTitle, showYear: section.showYear, showParentTitle: section.showParentTitle, diff --git a/src/controllers/home.js b/src/controllers/home.js index 9a4cea2227..3396a7336f 100644 --- a/src/controllers/home.js +++ b/src/controllers/home.js @@ -20,7 +20,7 @@ define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby- } function getTabController(index) { - if (null == index) { + if (index == null) { throw new Error('index cannot be null'); } diff --git a/src/controllers/itemDetails/index.js b/src/controllers/itemDetails/index.js index 0e5b41b658..9b9b3a51ff 100644 --- a/src/controllers/itemDetails/index.js +++ b/src/controllers/itemDetails/index.js @@ -66,7 +66,7 @@ import 'emby-select'; } function getContextMenuOptions(item, user, button) { - const options = { + return { item: item, open: false, play: false, @@ -81,8 +81,6 @@ import 'emby-select'; user: user, share: true }; - - return options; } function getProgramScheduleHtml(items) { @@ -130,7 +128,7 @@ import 'emby-select'; } function renderTimerEditor(page, item, apiClient, user) { - if ('Recording' !== item.Type || !user.Policy.EnableLiveTvManagement || !item.TimerId || 'InProgress' !== item.Status) { + if (item.Type !== 'Recording' || !user.Policy.EnableLiveTvManagement || !item.TimerId || item.Status !== 'InProgress') { return void hideAll(page, 'btnCancelTimer'); } @@ -138,7 +136,7 @@ import 'emby-select'; } function renderSeriesTimerEditor(page, item, apiClient, user) { - if ('SeriesTimer' !== item.Type) { + if (item.Type !== 'SeriesTimer') { return void hideAll(page, 'btnCancelSeriesTimer'); } @@ -161,7 +159,7 @@ import 'emby-select'; function renderTrackSelections(page, instance, item, forceReload) { const select = page.querySelector('.selectSource'); - if (!item.MediaSources || !itemHelper.supportsMediaSourceSelection(item) || -1 === playbackManager.getSupportedCommands().indexOf('PlayMediaSource') || !playbackManager.canPlay(item)) { + if (!item.MediaSources || !itemHelper.supportsMediaSourceSelection(item) || playbackManager.getSupportedCommands().indexOf('PlayMediaSource') === -1 || !playbackManager.canPlay(item)) { page.querySelector('.trackSelections').classList.add('hide'); select.innerHTML = ''; page.querySelector('.selectVideo').innerHTML = ''; @@ -240,7 +238,7 @@ import 'emby-select'; return m.Id === mediaSourceId; })[0]; const tracks = mediaSource.MediaStreams.filter(function (m) { - return 'Audio' === m.Type; + return m.Type === 'Audio'; }); const select = page.querySelector('.selectAudio'); select.setLabel(globalize.translate('LabelAudio')); @@ -269,19 +267,19 @@ import 'emby-select'; return m.Id === mediaSourceId; })[0]; const tracks = mediaSource.MediaStreams.filter(function (m) { - return 'Subtitle' === m.Type; + return m.Type === 'Subtitle'; }); const select = page.querySelector('.selectSubtitles'); select.setLabel(globalize.translate('LabelSubtitles')); - const selectedId = null == mediaSource.DefaultSubtitleStreamIndex ? -1 : mediaSource.DefaultSubtitleStreamIndex; + const selectedId = mediaSource.DefaultSubtitleStreamIndex == null ? -1 : mediaSource.DefaultSubtitleStreamIndex; const videoTracks = mediaSource.MediaStreams.filter(function (m) { - return 'Video' === m.Type; + return m.Type === 'Video'; }); // This only makes sense on Video items if (videoTracks.length) { - let selected = -1 === selectedId ? ' selected' : ''; + let selected = selectedId === -1 ? ' selected' : ''; select.innerHTML = '' + tracks.map(function (v) { selected = v.Index === selectedId ? ' selected' : ''; return ''; @@ -303,7 +301,7 @@ import 'emby-select'; function reloadPlayButtons(page, item) { let canPlay = false; - if ('Program' == item.Type) { + if (item.Type == 'Program') { const now = new Date(); if (now >= datetime.parseISO8601Date(item.StartDate, true) && now < datetime.parseISO8601Date(item.EndDate, true)) { @@ -318,9 +316,9 @@ import 'emby-select'; hideAll(page, 'btnShuffle'); } else if (playbackManager.canPlay(item)) { hideAll(page, 'btnPlay', true); - const enableInstantMix = -1 !== ['Audio', 'MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type); + const enableInstantMix = ['Audio', 'MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type) !== -1; hideAll(page, 'btnInstantMix', enableInstantMix); - const enableShuffle = item.IsFolder || -1 !== ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type); + const enableShuffle = item.IsFolder || ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type) !== -1; hideAll(page, 'btnShuffle', enableShuffle); canPlay = true; @@ -385,9 +383,8 @@ import 'emby-select'; }); html.push('' + artist.Name + ''); } - html = html.join(' / '); - return html; + return html.join(' / '); } /** @@ -404,10 +401,10 @@ import 'emby-select'; if (item.AlbumArtists) { parentNameHtml.push(getArtistLinksHtml(item.AlbumArtists, item.ServerId, context)); parentNameLast = true; - } else if (item.ArtistItems && item.ArtistItems.length && 'MusicVideo' === item.Type) { + } else if (item.ArtistItems && item.ArtistItems.length && item.Type === 'MusicVideo') { parentNameHtml.push(getArtistLinksHtml(item.ArtistItems, item.ServerId, context)); parentNameLast = true; - } else if (item.SeriesName && 'Episode' === item.Type) { + } else if (item.SeriesName && item.Type === 'Episode') { parentRoute = appRouter.getRouteUrl({ Id: item.SeriesId, Name: item.SeriesName, @@ -422,7 +419,7 @@ import 'emby-select'; parentNameHtml.push(item.Name); } - if (item.SeriesName && 'Season' === item.Type) { + if (item.SeriesName && item.Type === 'Season') { parentRoute = appRouter.getRouteUrl({ Id: item.SeriesId, Name: item.SeriesName, @@ -433,7 +430,7 @@ import 'emby-select'; context: context }); parentNameHtml.push('' + item.SeriesName + ''); - } else if (null != item.ParentIndexNumber && 'Episode' === item.Type) { + } else if (item.ParentIndexNumber != null && item.Type === 'Episode') { parentRoute = appRouter.getRouteUrl({ Id: item.SeasonId, Name: item.SeasonName, @@ -444,9 +441,9 @@ import 'emby-select'; context: context }); parentNameHtml.push('' + item.SeasonName + ''); - } else if (null != item.ParentIndexNumber && item.IsSeries) { + } else if (item.ParentIndexNumber != null && item.IsSeries) { parentNameHtml.push(item.SeasonName || 'S' + item.ParentIndexNumber); - } else if (item.Album && item.AlbumId && ('MusicVideo' === item.Type || 'Audio' === item.Type)) { + } else if (item.Album && item.AlbumId && (item.Type === 'MusicVideo' || item.Type === 'Audio')) { parentRoute = appRouter.getRouteUrl({ Id: item.AlbumId, Name: item.Album, @@ -509,7 +506,7 @@ import 'emby-select'; } function setTrailerButtonVisibility(page, item) { - if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf('PlayTrailers')) { + if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && playbackManager.getSupportedCommands().indexOf('PlayTrailers') !== -1) { hideAll(page, 'btnPlayTrailer', true); } else { hideAll(page, 'btnPlayTrailer'); @@ -551,6 +548,14 @@ import 'emby-select'; }); imageLoader.lazyImage(itemBackdropElement, imgUrl); hasbackdrop = true; + } else if (item.ImageTags && item.ImageTags.Primary) { + imgUrl = apiClient.getScaledImageUrl(item.Id, { + type: 'Primary', + maxWidth: dom.getScreenWidth(), + tag: item.ImageTags.Primary + }); + imageLoader.lazyImage(itemBackdropElement, imgUrl); + hasbackdrop = true; } else { itemBackdropElement.style.backgroundImage = ''; } @@ -580,7 +585,7 @@ import 'emby-select'; setInitialCollapsibleState(page, item, apiClient, params.context, user); const canPlay = reloadPlayButtons(page, item); - if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf('PlayTrailers')) { + if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && playbackManager.getSupportedCommands().indexOf('PlayTrailers') !== -1) { hideAll(page, 'btnPlayTrailer', true); } else { hideAll(page, 'btnPlayTrailer'); @@ -588,7 +593,7 @@ import 'emby-select'; setTrailerButtonVisibility(page, item); - if ('Program' !== item.Type || canPlay) { + if (item.Type !== 'Program' || canPlay) { hideAll(page, 'mainDetailButtons', true); } else { hideAll(page, 'mainDetailButtons'); @@ -596,7 +601,7 @@ import 'emby-select'; showRecordingFields(instance, page, item, user); const groupedVersions = (item.MediaSources || []).filter(function (g) { - return 'Grouping' == g.Type; + return g.Type == 'Grouping'; }); if (user.Policy.IsAdministrator && groupedVersions.length) { @@ -613,7 +618,7 @@ import 'emby-select'; const itemBirthday = page.querySelector('#itemBirthday'); - if ('Person' == item.Type && item.PremiereDate) { + if (item.Type == 'Person' && item.PremiereDate) { try { const birthday = datetime.parseISO8601Date(item.PremiereDate, true).toDateString(); itemBirthday.classList.remove('hide'); @@ -627,7 +632,7 @@ import 'emby-select'; const itemDeathDate = page.querySelector('#itemDeathDate'); - if ('Person' == item.Type && item.EndDate) { + if (item.Type == 'Person' && item.EndDate) { try { const deathday = datetime.parseISO8601Date(item.EndDate, true).toDateString(); itemDeathDate.classList.remove('hide'); @@ -641,7 +646,7 @@ import 'emby-select'; const itemBirthLocation = page.querySelector('#itemBirthLocation'); - if ('Person' == item.Type && item.ProductionLocations && item.ProductionLocations.length) { + if (item.Type == 'Person' && item.ProductionLocations && item.ProductionLocations.length) { const gmap = '' + item.ProductionLocations[0] + ''; itemBirthLocation.classList.remove('hide'); itemBirthLocation.innerHTML = globalize.translate('BirthPlaceValue', gmap); @@ -697,7 +702,7 @@ import 'emby-select'; if (!instance.currentRecordingFields) { const recordingFieldsElement = page.querySelector('.recordingFields'); - if ('Program' == item.Type && user.Policy.EnableLiveTvManagement) { + if (item.Type == 'Program' && user.Policy.EnableLiveTvManagement) { import('recordingFields').then(({default: recordingFields}) => { instance.currentRecordingFields = new recordingFields({ parent: recordingFieldsElement, @@ -778,7 +783,7 @@ import 'emby-select'; } function setPeopleHeader(page, item) { - if ('Audio' == item.MediaType || 'MusicAlbum' == item.Type || 'Book' == item.MediaType || 'Photo' == item.MediaType) { + if (item.MediaType == 'Audio' || item.Type == 'MusicAlbum' || item.MediaType == 'Book' || item.MediaType == 'Photo') { page.querySelector('#peopleHeader').innerHTML = globalize.translate('HeaderPeople'); } else { page.querySelector('#peopleHeader').innerHTML = globalize.translate('HeaderCastAndCrew'); @@ -788,7 +793,7 @@ import 'emby-select'; function renderNextUp(page, item, user) { const section = page.querySelector('.nextUpSection'); - if ('Series' != item.Type) { + if (item.Type != 'Series') { return void section.classList.add('hide'); } @@ -806,7 +811,7 @@ import 'emby-select'; items: result.Items, shape: 'overflowBackdrop', showTitle: true, - displayAsSpecial: 'Season' == item.Type && item.IndexNumber, + displayAsSpecial: item.Type == 'Season' && item.IndexNumber, overlayText: false, centerText: true, overlayPlayButton: true @@ -820,14 +825,14 @@ import 'emby-select'; function setInitialCollapsibleState(page, item, apiClient, context, user) { page.querySelector('.collectionItems').innerHTML = ''; - if ('Playlist' == item.Type) { + if (item.Type == 'Playlist') { page.querySelector('#childrenCollapsible').classList.remove('hide'); renderPlaylistItems(page, item); - } else if ('Studio' == item.Type || 'Person' == item.Type || 'Genre' == item.Type || 'MusicGenre' == item.Type || 'MusicArtist' == item.Type) { + } else if (item.Type == 'Studio' || item.Type == 'Person' || item.Type == 'Genre' || item.Type == 'MusicGenre' || item.Type == 'MusicArtist') { page.querySelector('#childrenCollapsible').classList.remove('hide'); renderItemsByName(page, item); } else if (item.IsFolder) { - if ('BoxSet' == item.Type) { + if (item.Type == 'BoxSet') { page.querySelector('#childrenCollapsible').classList.add('hide'); } @@ -836,7 +841,7 @@ import 'emby-select'; page.querySelector('#childrenCollapsible').classList.add('hide'); } - if ('Series' == item.Type) { + if (item.Type == 'Series') { renderSeriesSchedule(page, item); renderNextUp(page, item, user); } else { @@ -845,7 +850,7 @@ import 'emby-select'; renderScenes(page, item); - if (item.SpecialFeatureCount && 0 != item.SpecialFeatureCount && 'Series' != item.Type) { + if (item.SpecialFeatureCount && item.SpecialFeatureCount != 0 && item.Type != 'Series') { page.querySelector('#specialsCollapsible').classList.remove('hide'); renderSpecials(page, item, user); } else { @@ -861,7 +866,7 @@ import 'emby-select'; page.querySelector('#additionalPartsCollapsible').classList.add('hide'); } - if ('MusicAlbum' == item.Type) { + if (item.Type == 'MusicAlbum') { renderMusicVideos(page, item, user); } else { page.querySelector('#musicVideosCollapsible').classList.add('hide'); @@ -1009,7 +1014,7 @@ import 'emby-select'; subtitles: false }); - if (miscInfo.innerHTML && 'SeriesTimer' !== item.Type) { + if (miscInfo.innerHTML && item.Type !== 'SeriesTimer') { miscInfo.classList.remove('hide'); } else { miscInfo.classList.add('hide'); @@ -1023,7 +1028,7 @@ import 'emby-select'; interactive: true }); - if (miscInfo.innerHTML && 'SeriesTimer' !== item.Type) { + if (miscInfo.innerHTML && item.Type !== 'SeriesTimer') { miscInfo.classList.remove('hide'); } else { miscInfo.classList.add('hide'); @@ -1064,7 +1069,7 @@ import 'emby-select'; } function getPortraitShape(scrollX) { - if (null == scrollX) { + if (scrollX == null) { scrollX = enableScrollX(); } @@ -1072,7 +1077,7 @@ import 'emby-select'; } function getSquareShape(scrollX) { - if (null == scrollX) { + if (scrollX == null) { scrollX = enableScrollX(); } @@ -1083,7 +1088,7 @@ import 'emby-select'; const section = view.querySelector('.moreFromSeasonSection'); if (section) { - if ('Episode' !== item.Type || !item.SeasonId || !item.SeriesId) { + if (item.Type !== 'Episode' || !item.SeasonId || !item.SeriesId) { return void section.classList.add('hide'); } @@ -1127,11 +1132,11 @@ import 'emby-select'; const section = view.querySelector('.moreFromArtistSection'); if (section) { - if ('MusicArtist' === item.Type) { + if (item.Type === 'MusicArtist') { if (!apiClient.isMinServerVersion('3.4.1.19')) { return void section.classList.add('hide'); } - } else if ('MusicAlbum' !== item.Type || !item.AlbumArtists || !item.AlbumArtists.length) { + } else if (item.Type !== 'MusicAlbum' || !item.AlbumArtists || !item.AlbumArtists.length) { return void section.classList.add('hide'); } @@ -1143,7 +1148,7 @@ import 'emby-select'; SortOrder: 'Descending' }; - if ('MusicArtist' === item.Type) { + if (item.Type === 'MusicArtist') { query.ContributingArtistIds = item.Id; } else if (apiClient.isMinServerVersion('3.4.1.18')) { query.AlbumArtistIds = item.AlbumArtists[0].Id; @@ -1158,7 +1163,7 @@ import 'emby-select'; section.classList.remove('hide'); - if ('MusicArtist' === item.Type) { + if (item.Type === 'MusicArtist') { section.querySelector('h2').innerHTML = globalize.translate('HeaderAppearsOn'); } else { section.querySelector('h2').innerHTML = globalize.translate('MoreFromValue', item.AlbumArtists[0].Name); @@ -1170,7 +1175,7 @@ import 'emby-select'; shape: 'autooverflow', sectionTitleTagName: 'h2', scalable: true, - coverImage: 'MusicArtist' === item.Type || 'MusicAlbum' === item.Type, + coverImage: item.Type === 'MusicArtist' || item.Type === 'MusicAlbum', showTitle: true, showParentTitle: false, centerText: true, @@ -1186,7 +1191,7 @@ import 'emby-select'; const similarCollapsible = page.querySelector('#similarCollapsible'); if (similarCollapsible) { - if ('Movie' != item.Type && 'Trailer' != item.Type && 'Series' != item.Type && 'Program' != item.Type && 'Recording' != item.Type && 'MusicAlbum' != item.Type && 'MusicArtist' != item.Type && 'Playlist' != item.Type) { + if (item.Type != 'Movie' && item.Type != 'Trailer' && item.Type != 'Series' && item.Type != 'Program' && item.Type != 'Recording' && item.Type != 'MusicAlbum' && item.Type != 'MusicArtist' && item.Type != 'Playlist') { return void similarCollapsible.classList.add('hide'); } @@ -1198,7 +1203,7 @@ import 'emby-select'; fields: 'PrimaryImageAspectRatio,UserData,CanDelete' }; - if ('MusicAlbum' == item.Type && item.AlbumArtists && item.AlbumArtists.length) { + if (item.Type == 'MusicAlbum' && item.AlbumArtists && item.AlbumArtists.length) { options.ExcludeArtistIds = item.AlbumArtists[0].Id; } @@ -1212,16 +1217,16 @@ import 'emby-select'; html += cardBuilder.getCardsHtml({ items: result.Items, shape: 'autooverflow', - showParentTitle: 'MusicAlbum' == item.Type, + showParentTitle: item.Type == 'MusicAlbum', centerText: true, showTitle: true, context: context, lazy: true, showDetailsMenu: true, - coverImage: 'MusicAlbum' == item.Type || 'MusicArtist' == item.Type, + coverImage: item.Type == 'MusicAlbum' || item.Type == 'MusicArtist', overlayPlayButton: true, overlayText: false, - showYear: 'Movie' === item.Type || 'Trailer' === item.Type || 'Series' === item.Type + showYear: item.Type === 'Movie' || item.Type === 'Trailer' || item.Type === 'Series' }); const similarContent = similarCollapsible.querySelector('.similarContent'); similarContent.innerHTML = html; @@ -1232,13 +1237,13 @@ import 'emby-select'; function renderSeriesAirTime(page, item, isStatic) { const seriesAirTime = page.querySelector('#seriesAirTime'); - if ('Series' != item.Type) { + if (item.Type != 'Series') { seriesAirTime.classList.add('hide'); return; } let html = ''; if (item.AirDays && item.AirDays.length) { - if (7 == item.AirDays.length) { + if (item.AirDays.length == 7) { html += 'daily'; } else { html += item.AirDays.map(function (a) { @@ -1263,7 +1268,7 @@ import 'emby-select'; } } if (html) { - html = ('Ended' == item.Status ? 'Aired ' : 'Airs ') + html; + html = (item.Status == 'Ended' ? 'Aired ' : 'Airs ') + html; seriesAirTime.innerHTML = html; seriesAirTime.classList.remove('hide'); } else { @@ -1276,7 +1281,7 @@ import 'emby-select'; const tagElements = []; let tags = item.Tags || []; - if ('Program' === item.Type) { + if (item.Type === 'Program') { tags = []; } @@ -1300,7 +1305,7 @@ import 'emby-select'; Fields: fields }; - if ('BoxSet' !== item.Type) { + if (item.Type !== 'BoxSet') { query.SortBy = 'SortName'; } @@ -1308,19 +1313,19 @@ import 'emby-select'; const apiClient = connectionManager.getApiClient(item.ServerId); const userId = apiClient.getCurrentUserId(); - if ('Series' == item.Type) { + if (item.Type == 'Series') { promise = apiClient.getSeasons(item.Id, { userId: userId, Fields: fields }); - } else if ('Season' == item.Type) { + } else if (item.Type == 'Season') { fields += ',Overview'; promise = apiClient.getEpisodes(item.SeriesId, { seasonId: item.Id, userId: userId, Fields: fields }); - } else if ('MusicArtist' == item.Type) { + } else if (item.Type == 'MusicArtist') { query.SortBy = 'ProductionYear,SortName'; } @@ -1331,7 +1336,7 @@ import 'emby-select'; let isList = false; const childrenItemsContainer = page.querySelector('.childrenItemsContainer'); - if ('MusicAlbum' == item.Type) { + if (item.Type == 'MusicAlbum') { html = listView.getListViewHtml({ items: result.Items, smallIcon: true, @@ -1345,7 +1350,7 @@ import 'emby-select'; containerAlbumArtists: item.AlbumArtists }); isList = true; - } else if ('Series' == item.Type) { + } else if (item.Type == 'Series') { scrollX = enableScrollX(); html = cardBuilder.getCardsHtml({ items: result.Items, @@ -1356,21 +1361,21 @@ import 'emby-select'; overlayPlayButton: true, allowBottomPadding: !scrollX }); - } else if ('Season' == item.Type || 'Episode' == item.Type) { - if ('Episode' !== item.Type) { + } else if (item.Type == 'Season' || item.Type == 'Episode') { + if (item.Type !== 'Episode') { isList = true; } - scrollX = 'Episode' == item.Type; - if (result.Items.length < 2 && 'Episode' === item.Type) { + scrollX = item.Type == 'Episode'; + if (result.Items.length < 2 && item.Type === 'Episode') { return; } - if ('Episode' === item.Type) { + if (item.Type === 'Episode') { html = cardBuilder.getCardsHtml({ items: result.Items, shape: 'overflowBackdrop', showTitle: true, - displayAsSpecial: 'Season' == item.Type && item.IndexNumber, + displayAsSpecial: item.Type == 'Season' && item.IndexNumber, playFromHere: true, overlayText: true, lazy: true, @@ -1379,7 +1384,7 @@ import 'emby-select'; allowBottomPadding: !scrollX, includeParentInfoInTitle: false }); - } else if ('Season' === item.Type) { + } else if (item.Type === 'Season') { html = listView.getListViewHtml({ items: result.Items, showIndexNumber: false, @@ -1396,7 +1401,7 @@ import 'emby-select'; } } - if ('BoxSet' !== item.Type) { + if (item.Type !== 'BoxSet') { page.querySelector('#childrenCollapsible').classList.remove('hide'); } if (scrollX) { @@ -1421,7 +1426,7 @@ import 'emby-select'; } childrenItemsContainer.innerHTML = html; imageLoader.lazyChildren(childrenItemsContainer); - if ('BoxSet' == item.Type) { + if (item.Type == 'BoxSet') { const collectionItemTypes = [{ name: globalize.translate('HeaderVideos'), mediaType: 'Video' @@ -1439,17 +1444,17 @@ import 'emby-select'; } }); - if ('Season' == item.Type) { + if (item.Type == 'Season') { page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderEpisodes'); - } else if ('Series' == item.Type) { + } else if (item.Type == 'Series') { page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderSeasons'); - } else if ('MusicAlbum' == item.Type) { + } else if (item.Type == 'MusicAlbum') { page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderTracks'); } else { page.querySelector('#childrenTitle').innerHTML = globalize.translate('HeaderItems'); } - if ('MusicAlbum' == item.Type || 'Season' == item.Type) { + if (item.Type == 'MusicAlbum' || item.Type == 'Season') { page.querySelector('.childrenSectionHeader').classList.add('hide'); page.querySelector('#childrenCollapsible').classList.add('verticalSection-extrabottompadding'); } else { @@ -1526,7 +1531,7 @@ import 'emby-select'; } function renderChannelGuide(page, apiClient, item) { - if ('TvChannel' === item.Type) { + if (item.Type === 'TvChannel') { page.querySelector('.programGuideSection').classList.remove('hide'); apiClient.getLiveTvPrograms({ ChannelIds: item.Id, @@ -1578,19 +1583,19 @@ import 'emby-select'; } function inferContext(item) { - if ('Movie' === item.Type || 'BoxSet' === item.Type) { + if (item.Type === 'Movie' || item.Type === 'BoxSet') { return 'movies'; } - if ('Series' === item.Type || 'Season' === item.Type || 'Episode' === item.Type) { + if (item.Type === 'Series' || item.Type === 'Season' || item.Type === 'Episode') { return 'tvshows'; } - if ('MusicArtist' === item.Type || 'MusicAlbum' === item.Type || 'Audio' === item.Type || 'AudioBook' === item.Type) { + if (item.Type === 'MusicArtist' || item.Type === 'MusicAlbum' || item.Type === 'Audio' || item.Type === 'AudioBook') { return 'music'; } - if ('Program' === item.Type) { + if (item.Type === 'Program') { return 'livetv'; } @@ -1682,12 +1687,12 @@ import 'emby-select'; html += ''; html += ''; html += '
'; - const shape = 'MusicAlbum' == type.type ? getSquareShape(false) : getPortraitShape(false); + const shape = type.type == 'MusicAlbum' ? getSquareShape(false) : getPortraitShape(false); html += cardBuilder.getCardsHtml({ items: items, shape: shape, showTitle: true, - showYear: 'Video' === type.mediaType || 'Series' === type.type, + showYear: type.mediaType === 'Video' || type.type === 'Series', centerText: true, lazy: true, showDetailsMenu: true, @@ -1757,7 +1762,7 @@ import 'emby-select'; } function getVideosHtml(items) { - const html = cardBuilder.getCardsHtml({ + return cardBuilder.getCardsHtml({ items: items, shape: 'autooverflow', showTitle: true, @@ -1766,8 +1771,6 @@ import 'emby-select'; centerText: true, showRuntime: true }); - - return html; } function renderSpecials(page, item, user) { @@ -1875,7 +1878,7 @@ import 'emby-select'; function playCurrentItem(button, mode) { const item = currentItem; - if ('Program' === item.Type) { + if (item.Type === 'Program') { const apiClient = connectionManager.getApiClient(item.ServerId); return void apiClient.getLiveTvChannel(item.ChannelId, apiClient.getCurrentUserId()).then(function (channel) { playbackManager.play({ @@ -1951,7 +1954,7 @@ import 'emby-select'; function onWebSocketMessage(e, data) { const msg = data; - if ('UserDataChanged' === msg.MessageType && currentItem && msg.Data.UserId == apiClient.getCurrentUserId()) { + if (msg.MessageType === 'UserDataChanged' && currentItem && msg.Data.UserId == apiClient.getCurrentUserId()) { const key = currentItem.UserData.Key; const userData = msg.Data.UserDataList.filter(function (u) { return u.Key == key; diff --git a/src/controllers/list.js b/src/controllers/list.js index e550b535f4..01ef35a26a 100644 --- a/src/controllers/list.js +++ b/src/controllers/list.js @@ -9,7 +9,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' Limit: 300 }; - if ('Recordings' === params.type) { + if (params.type === 'Recordings') { query.IsInProgress = false; } else { query.HasAired = false; @@ -19,39 +19,39 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' query.GenreIds = params.genreId; } - if ('true' === params.IsMovie) { + if (params.IsMovie === 'true') { query.IsMovie = true; - } else if ('false' === params.IsMovie) { + } else if (params.IsMovie === 'false') { query.IsMovie = false; } - if ('true' === params.IsSeries) { + if (params.IsSeries === 'true') { query.IsSeries = true; - } else if ('false' === params.IsSeries) { + } else if (params.IsSeries === 'false') { query.IsSeries = false; } - if ('true' === params.IsNews) { + if (params.IsNews === 'true') { query.IsNews = true; - } else if ('false' === params.IsNews) { + } else if (params.IsNews === 'false') { query.IsNews = false; } - if ('true' === params.IsSports) { + if (params.IsSports === 'true') { query.IsSports = true; - } else if ('false' === params.IsSports) { + } else if (params.IsSports === 'false') { query.IsSports = false; } - if ('true' === params.IsKids) { + if (params.IsKids === 'true') { query.IsKids = true; - } else if ('false' === params.IsKids) { + } else if (params.IsKids === 'false') { query.IsKids = false; } - if ('true' === params.IsAiring) { + if (params.IsAiring === 'true') { query.IsAiring = true; - } else if ('false' === params.IsAiring) { + } else if (params.IsAiring === 'false') { query.IsAiring = false; } @@ -181,13 +181,13 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var btnSortIcon = instance.btnSortIcon; if (btnSortIcon) { - setSortButtonIcon(btnSortIcon, 'Descending' === values.sortOrder ? 'arrow_downward' : 'arrow_upward'); + setSortButtonIcon(btnSortIcon, values.sortOrder === 'Descending' ? 'arrow_downward' : 'arrow_upward'); } } } function updateItemsContainerForViewType(instance) { - if ('list' === instance.getViewSettings().imageType) { + if (instance.getViewSettings().imageType === 'list') { instance.itemsContainer.classList.remove('vertical-wrap'); instance.itemsContainer.classList.add('vertical-list'); } else { @@ -203,11 +203,11 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' if (alphaPicker) { var values = instance.getSortValues(); - if (null == numItems) { + if (numItems == null) { numItems = 100; } - if ('SortName' === values.sortBy && 'Ascending' === values.sortOrder && numItems > 40) { + if (values.sortBy === 'SortName' && values.sortOrder === 'Ascending' && numItems > 40) { alphaPicker.classList.remove('hide'); instance.itemsContainer.parentNode.classList.add('padded-right-withalphapicker'); } else { @@ -222,19 +222,19 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var apiClient = connectionManager.getApiClient(params.serverId); instance.queryRecursive = false; - if ('Recordings' === params.type) { + if (params.type === 'Recordings') { return apiClient.getLiveTvRecordings(getInitialLiveTvQuery(instance, params)); } - if ('Programs' === params.type) { - if ('true' === params.IsAiring) { + if (params.type === 'Programs') { + if (params.IsAiring === 'true') { return apiClient.getLiveTvRecommendedPrograms(getInitialLiveTvQuery(instance, params)); } return apiClient.getLiveTvPrograms(getInitialLiveTvQuery(instance, params)); } - if ('nextup' === params.type) { + if (params.type === 'nextup') { return apiClient.getNextUpEpisodes(modifyQueryWithFilters(instance, { Limit: limit, Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo', @@ -250,9 +250,9 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' instance.queryRecursive = true; var method = 'getItems'; - if ('MusicArtist' === params.type) { + if (params.type === 'MusicArtist') { method = 'getArtists'; - } else if ('Person' === params.type) { + } else if (params.type === 'Person') { method = 'getPeople'; } @@ -261,15 +261,15 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' Limit: limit, Fields: 'PrimaryImageAspectRatio,SortName', ImageTypeLimit: 1, - IncludeItemTypes: 'MusicArtist' === params.type || 'Person' === params.type ? null : params.type, + IncludeItemTypes: params.type === 'MusicArtist' || params.type === 'Person' ? null : params.type, Recursive: true, - IsFavorite: 'true' === params.IsFavorite || null, + IsFavorite: params.IsFavorite === 'true' || null, ArtistIds: params.artistId || null, SortBy: sortBy })); } - if ('Genre' === item.Type || 'MusicGenre' === item.Type || 'Studio' === item.Type || 'Person' === item.Type) { + if (item.Type === 'Genre' || item.Type === 'MusicGenre' || item.Type === 'Studio' || item.Type === 'Person') { instance.queryRecursive = true; var query = { StartIndex: startIndex, @@ -280,25 +280,25 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' SortBy: sortBy }; - if ('Studio' === item.Type) { + if (item.Type === 'Studio') { query.StudioIds = item.Id; - } else if ('Genre' === item.Type || 'MusicGenre' === item.Type) { + } else if (item.Type === 'Genre' || item.Type === 'MusicGenre') { query.GenreIds = item.Id; - } else if ('Person' === item.Type) { + } else if (item.Type === 'Person') { query.PersonIds = item.Id; } - if ('MusicGenre' === item.Type) { + if (item.Type === 'MusicGenre') { query.IncludeItemTypes = 'MusicAlbum'; - } else if ('GameGenre' === item.Type) { + } else if (item.Type === 'GameGenre') { query.IncludeItemTypes = 'Game'; - } else if ('movies' === item.CollectionType) { + } else if (item.CollectionType === 'movies') { query.IncludeItemTypes = 'Movie'; - } else if ('tvshows' === item.CollectionType) { + } else if (item.CollectionType === 'tvshows') { query.IncludeItemTypes = 'Series'; - } else if ('Genre' === item.Type) { + } else if (item.Type === 'Genre') { query.IncludeItemTypes = 'Movie,Series,Video'; - } else if ('Person' === item.Type) { + } else if (item.Type === 'Person') { query.IncludeItemTypes = params.type; } @@ -316,7 +316,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function getItem(params) { - if ('Recordings' === params.type || 'Programs' === params.type || 'nextup' === params.type) { + if (params.type === 'Recordings' || params.type === 'Programs' || params.type === 'nextup') { return Promise.resolve(null); } @@ -412,7 +412,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' function ItemsView(view, params) { function fetchData() { return getItems(self, params, self.currentItem).then(function (result) { - if (null == self.totalItemCount) { + if (self.totalItemCount == null) { self.totalItemCount = result.Items ? result.Items.length : result.length; } @@ -424,7 +424,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' function getItemsHtml(items) { var settings = self.getViewSettings(); - if ('list' === settings.imageType) { + if (settings.imageType === 'list') { return listView.getListViewHtml({ items: items }); @@ -438,24 +438,24 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var item = self.currentItem; var lines = settings.showTitle ? 2 : 0; - if ('banner' === settings.imageType) { + if (settings.imageType === 'banner') { shape = 'banner'; - } else if ('disc' === settings.imageType) { + } else if (settings.imageType === 'disc') { shape = 'square'; preferDisc = true; - } else if ('logo' === settings.imageType) { + } else if (settings.imageType === 'logo') { shape = 'backdrop'; preferLogo = true; - } else if ('thumb' === settings.imageType) { + } else if (settings.imageType === 'thumb') { shape = 'backdrop'; preferThumb = true; - } else if ('nextup' === params.type) { + } else if (params.type === 'nextup') { shape = 'backdrop'; - preferThumb = 'thumb' === settings.imageType; - } else if ('Programs' === params.type || 'Recordings' === params.type) { - shape = 'true' === params.IsMovie ? 'portrait' : 'autoVertical'; - preferThumb = 'true' !== params.IsMovie ? 'auto' : false; - defaultShape = 'true' === params.IsMovie ? 'portrait' : 'backdrop'; + preferThumb = settings.imageType === 'thumb'; + } else if (params.type === 'Programs' || params.type === 'Recordings') { + shape = params.IsMovie === 'true' ? 'portrait' : 'autoVertical'; + preferThumb = params.IsMovie !== 'true' ? 'auto' : false; + defaultShape = params.IsMovie === 'true' ? 'portrait' : 'backdrop'; } else { shape = 'autoVertical'; } @@ -473,46 +473,46 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' overlayMoreButton: true, overlayText: !settings.showTitle, defaultShape: defaultShape, - action: 'Audio' === params.type ? 'playallfromhere' : null + action: params.type === 'Audio' ? 'playallfromhere' : null }; - if ('nextup' === params.type) { + if (params.type === 'nextup') { posterOptions.showParentTitle = settings.showTitle; - } else if ('Person' === params.type) { + } else if (params.type === 'Person') { posterOptions.showYear = false; posterOptions.showParentTitle = false; lines = 1; - } else if ('Audio' === params.type) { + } else if (params.type === 'Audio') { posterOptions.showParentTitle = settings.showTitle; - } else if ('MusicAlbum' === params.type) { + } else if (params.type === 'MusicAlbum') { posterOptions.showParentTitle = settings.showTitle; - } else if ('Episode' === params.type) { + } else if (params.type === 'Episode') { posterOptions.showParentTitle = settings.showTitle; - } else if ('MusicArtist' === params.type) { + } else if (params.type === 'MusicArtist') { posterOptions.showYear = false; lines = 1; - } else if ('Programs' === params.type) { + } else if (params.type === 'Programs') { lines = settings.showTitle ? 1 : 0; - var showParentTitle = settings.showTitle && 'true' !== params.IsMovie; + var showParentTitle = settings.showTitle && params.IsMovie !== 'true'; if (showParentTitle) { lines++; } - var showAirTime = settings.showTitle && 'Recordings' !== params.type; + var showAirTime = settings.showTitle && params.type !== 'Recordings'; if (showAirTime) { lines++; } - var showYear = settings.showTitle && 'true' === params.IsMovie && 'Recordings' === params.type; + var showYear = settings.showTitle && params.IsMovie === 'true' && params.type === 'Recordings'; if (showYear) { lines++; } posterOptions = Object.assign(posterOptions, { - inheritThumb: 'Recordings' === params.type, + inheritThumb: params.type === 'Recordings', context: 'livetv', showParentTitle: showParentTitle, showAirTime: showAirTime, @@ -529,7 +529,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' posterOptions.lines = lines; posterOptions.items = items; - if (item && 'folders' === item.CollectionType) { + if (item && item.CollectionType === 'folders') { posterOptions.context = 'folders'; } @@ -561,7 +561,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' function setTitle(item) { Emby.Page.setTitle(getTitle(item) || ''); - if (item && 'playlists' === item.CollectionType) { + if (item && item.CollectionType === 'playlists') { hideOrShowAll(view.querySelectorAll('.btnNewItem'), false); } else { hideOrShowAll(view.querySelectorAll('.btnNewItem'), true); @@ -569,43 +569,43 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } function getTitle(item) { - if ('Recordings' === params.type) { + if (params.type === 'Recordings') { return globalize.translate('Recordings'); } - if ('Programs' === params.type) { - if ('true' === params.IsMovie) { + if (params.type === 'Programs') { + if (params.IsMovie === 'true') { return globalize.translate('Movies'); } - if ('true' === params.IsSports) { + if (params.IsSports === 'true') { return globalize.translate('Sports'); } - if ('true' === params.IsKids) { + if (params.IsKids === 'true') { return globalize.translate('HeaderForKids'); } - if ('true' === params.IsAiring) { + if (params.IsAiring === 'true') { return globalize.translate('HeaderOnNow'); } - if ('true' === params.IsSeries) { + if (params.IsSeries === 'true') { return globalize.translate('Shows'); } - if ('true' === params.IsNews) { + if (params.IsNews === 'true') { return globalize.translate('News'); } return globalize.translate('Programs'); } - if ('nextup' === params.type) { + if (params.type === 'nextup') { return globalize.translate('NextUp'); } - if ('favoritemovies' === params.type) { + if (params.type === 'favoritemovies') { return globalize.translate('FavoriteMovies'); } @@ -613,35 +613,35 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' return item.Name; } - if ('Movie' === params.type) { + if (params.type === 'Movie') { return globalize.translate('Movies'); } - if ('Series' === params.type) { + if (params.type === 'Series') { return globalize.translate('Shows'); } - if ('Season' === params.type) { + if (params.type === 'Season') { return globalize.translate('Seasons'); } - if ('Episode' === params.type) { + if (params.type === 'Episode') { return globalize.translate('Episodes'); } - if ('MusicArtist' === params.type) { + if (params.type === 'MusicArtist') { return globalize.translate('Artists'); } - if ('MusicAlbum' === params.type) { + if (params.type === 'MusicAlbum') { return globalize.translate('Albums'); } - if ('Audio' === params.type) { + if (params.type === 'Audio') { return globalize.translate('Songs'); } - if ('Video' === params.type) { + if (params.type === 'Video') { return globalize.translate('Videos'); } @@ -700,11 +700,11 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' if (params.parentId) { this.itemsContainer.setAttribute('data-parentid', params.parentId); - } else if ('nextup' === params.type) { + } else if (params.type === 'nextup') { this.itemsContainer.setAttribute('data-monitor', 'videoplayback'); - } else if ('favoritemovies' === params.type) { + } else if (params.type === 'favoritemovies') { this.itemsContainer.setAttribute('data-monitor', 'markfavorite'); - } else if ('Programs' === params.type) { + } else if (params.type === 'Programs') { this.itemsContainer.setAttribute('data-refreshinterval', '300000'); } @@ -737,7 +737,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var sortButton = sortButtons[i]; sortButton.addEventListener('click', showSortMenu.bind(this)); - if ('nextup' !== params.type) { + if (params.type !== 'nextup') { sortButton.classList.remove('hide'); } } @@ -772,19 +772,19 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' } }); - if (!isRestored && item && 'PhotoAlbum' !== item.Type) { + if (!isRestored && item && item.Type !== 'PhotoAlbum') { initAlphaPicker(); } var itemType = item ? item.Type : null; - if ('MusicGenre' === itemType || 'Programs' !== params.type && 'Channel' !== itemType) { + if (itemType === 'MusicGenre' || params.type !== 'Programs' && itemType !== 'Channel') { hideOrShowAll(view.querySelectorAll('.btnPlay'), false); } else { hideOrShowAll(view.querySelectorAll('.btnPlay'), true); } - if ('MusicGenre' === itemType || 'Programs' !== params.type && 'nextup' !== params.type && 'Channel' !== itemType) { + if (itemType === 'MusicGenre' || params.type !== 'Programs' && params.type !== 'nextup' && itemType !== 'Channel') { hideOrShowAll(view.querySelectorAll('.btnShuffle'), false); } else { hideOrShowAll(view.querySelectorAll('.btnShuffle'), true); @@ -845,14 +845,14 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' ItemsView.prototype.getFilters = function () { var basekey = this.getSettingsKey(); return { - IsPlayed: 'true' === userSettings.getFilter(basekey + '-filter-IsPlayed'), - IsUnplayed: 'true' === userSettings.getFilter(basekey + '-filter-IsUnplayed'), - IsFavorite: 'true' === userSettings.getFilter(basekey + '-filter-IsFavorite'), - IsResumable: 'true' === userSettings.getFilter(basekey + '-filter-IsResumable'), - Is4K: 'true' === userSettings.getFilter(basekey + '-filter-Is4K'), - IsHD: 'true' === userSettings.getFilter(basekey + '-filter-IsHD'), - IsSD: 'true' === userSettings.getFilter(basekey + '-filter-IsSD'), - Is3D: 'true' === userSettings.getFilter(basekey + '-filter-Is3D'), + IsPlayed: userSettings.getFilter(basekey + '-filter-IsPlayed') === 'true', + IsUnplayed: userSettings.getFilter(basekey + '-filter-IsUnplayed') === 'true', + IsFavorite: userSettings.getFilter(basekey + '-filter-IsFavorite') === 'true', + IsResumable: userSettings.getFilter(basekey + '-filter-IsResumable') === 'true', + Is4K: userSettings.getFilter(basekey + '-filter-Is4K') === 'true', + IsHD: userSettings.getFilter(basekey + '-filter-IsHD') === 'true', + IsSD: userSettings.getFilter(basekey + '-filter-IsSD') === 'true', + Is3D: userSettings.getFilter(basekey + '-filter-Is3D') === 'true', VideoTypes: userSettings.getFilter(basekey + '-filter-VideoTypes'), SeriesStatus: userSettings.getFilter(basekey + '-filter-SeriesStatus'), HasSubtitles: userSettings.getFilter(basekey + '-filter-HasSubtitles'), @@ -868,7 +868,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var basekey = this.getSettingsKey(); return { sortBy: userSettings.getFilter(basekey + '-sortby') || this.getDefaultSortBy(), - sortOrder: 'Descending' === userSettings.getFilter(basekey + '-sortorder') ? 'Descending' : 'Ascending' + sortOrder: userSettings.getFilter(basekey + '-sortorder') === 'Descending' ? 'Descending' : 'Ascending' }; }; @@ -887,7 +887,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var sortBy = []; var params = this.params; - if ('Programs' === params.type) { + if (params.type === 'Programs') { sortBy.push({ name: globalize.translate('AirDate'), value: 'StartDate,SortName' @@ -912,7 +912,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' sortBy.push(option); } - if ('Programs' !== params.type) { + if (params.type !== 'Programs') { sortBy.push({ name: globalize.translate('DateAdded'), value: 'DateCreated,SortName' @@ -955,7 +955,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' }; ItemsView.prototype.getNameSortOption = function (params) { - if ('Episode' === params.type) { + if (params.type === 'Episode') { return { name: globalize.translate('Name'), value: 'SeriesName,SortName' @@ -969,7 +969,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' }; ItemsView.prototype.getPlayCountSortOption = function () { - if ('Programs' === this.params.type) { + if (this.params.type === 'Programs') { return null; } @@ -980,7 +980,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' }; ItemsView.prototype.getDatePlayedSortOption = function () { - if ('Programs' === this.params.type) { + if (this.params.type === 'Programs') { return null; } @@ -991,7 +991,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' }; ItemsView.prototype.getCriticRatingSortOption = function () { - if ('Programs' === this.params.type) { + if (this.params.type === 'Programs') { return null; } @@ -1012,8 +1012,8 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var filters = []; var params = this.params; - if (!('nextup' === params.type)) { - if ('Programs' === params.type) { + if (!(params.type === 'nextup')) { + if (params.type === 'Programs') { filters.push('Genres'); } else { filters.push('IsUnplayed'); @@ -1081,7 +1081,7 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var item = (this.params, this.currentItem); var fields = ['showTitle']; - if (!item || 'PhotoAlbum' !== item.Type && 'ChannelFolderItem' !== item.Type) { + if (!item || item.Type !== 'PhotoAlbum' && item.Type !== 'ChannelFolderItem') { fields.push('imageType'); } @@ -1095,25 +1095,25 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' var item = this.currentItem; var showTitle = userSettings.get(basekey + '-showTitle'); - if ('true' === showTitle) { + if (showTitle === 'true') { showTitle = true; - } else if ('false' === showTitle) { + } else if (showTitle === 'false') { showTitle = false; - } else if ('Programs' === params.type || 'Recordings' === params.type || 'Person' === params.type || 'nextup' === params.type || 'Audio' === params.type || 'MusicAlbum' === params.type || 'MusicArtist' === params.type) { + } else if (params.type === 'Programs' || params.type === 'Recordings' || params.type === 'Person' || params.type === 'nextup' || params.type === 'Audio' || params.type === 'MusicAlbum' || params.type === 'MusicArtist') { showTitle = true; - } else if (item && 'PhotoAlbum' !== item.Type) { + } else if (item && item.Type !== 'PhotoAlbum') { showTitle = true; } var imageType = userSettings.get(basekey + '-imageType'); - if (!imageType && 'nextup' === params.type) { + if (!imageType && params.type === 'nextup') { imageType = 'thumb'; } return { showTitle: showTitle, - showYear: 'false' !== userSettings.get(basekey + '-showYear'), + showYear: userSettings.get(basekey + '-showYear') !== 'false', imageType: imageType || 'primary', viewType: userSettings.get(basekey + '-viewType') || 'images' }; @@ -1122,11 +1122,11 @@ define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager' ItemsView.prototype.getItemTypes = function () { var params = this.params; - if ('nextup' === params.type) { + if (params.type === 'nextup') { return ['Episode']; } - if ('Programs' === params.type) { + if (params.type === 'Programs') { return ['Program']; } diff --git a/src/controllers/livetv/livetvsuggested.js b/src/controllers/livetv/livetvsuggested.js index 036eee9fc6..36ba825a34 100644 --- a/src/controllers/livetv/livetvsuggested.js +++ b/src/controllers/livetv/livetvsuggested.js @@ -142,9 +142,9 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', coverImage: true, overlayText: false, lazy: true, - overlayPlayButton: 'play' === overlayButton, - overlayMoreButton: 'more' === overlayButton, - overlayInfoButton: 'info' === overlayButton, + overlayPlayButton: overlayButton === 'play', + overlayMoreButton: overlayButton === 'more', + overlayInfoButton: overlayButton === 'info', allowBottomPadding: !enableScrollX(), showAirTime: true, showAirDateTime: true @@ -261,7 +261,7 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', require(depends, function (controllerFactory) { var tabContent; - if (0 == index) { + if (index == 0) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); self.tabContent = tabContent; } @@ -271,9 +271,9 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', if (!controller) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); - if (0 === index) { + if (index === 0) { controller = self; - } else if (6 === index) { + } else if (index === 6) { controller = new controllerFactory(view, tabContent, { collectionType: 'livetv' }); @@ -305,8 +305,8 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', getTabController(page, index, function (controller) { initialTabIndex = null; - if (-1 == renderedTabs.indexOf(index)) { - if (1 === index) { + if (renderedTabs.indexOf(index) == -1) { + if (index === 1) { renderedTabs.push(index); } diff --git a/src/controllers/livetvtuner.js b/src/controllers/livetvtuner.js index 92f705c02f..0e3b2b689e 100644 --- a/src/controllers/livetvtuner.js +++ b/src/controllers/livetvtuner.js @@ -1,232 +1,228 @@ -define(['globalize', 'loading', 'libraryMenu', 'dom', 'emby-input', 'emby-button', 'emby-checkbox', 'emby-select'], function (globalize, loading, libraryMenu, dom) { - 'use strict'; +import globalize from 'globalize'; +import loading from 'loading'; +import dom from 'dom'; +import 'emby-input'; +import 'emby-button'; +import 'emby-checkbox'; +import 'emby-select'; - function isM3uVariant(type) { - return ['nextpvr'].indexOf(type || '') !== -1; - } +function isM3uVariant(type) { + return ['nextpvr'].indexOf(type || '') !== -1; +} - function fillTypes(view, currentId) { - return ApiClient.getJSON(ApiClient.getUrl('LiveTv/TunerHosts/Types')).then(function (types) { - var selectType = view.querySelector('.selectType'); - var html = ''; - html += types.map(function (tuner) { - return ''; - }).join(''); - html += ''; - selectType.innerHTML = html; - selectType.disabled = null != currentId; - selectType.value = ''; - onTypeChange.call(selectType); - }); - } - - function reload(view, providerId) { - view.querySelector('.txtDevicePath').value = ''; - view.querySelector('.chkFavorite').checked = false; - view.querySelector('.txtDevicePath').value = ''; - - if (providerId) { - ApiClient.getNamedConfiguration('livetv').then(function (config) { - var info = config.TunerHosts.filter(function (i) { - return i.Id === providerId; - })[0]; - fillTunerHostInfo(view, info); - }); - } - } - - function fillTunerHostInfo(view, info) { - var selectType = view.querySelector('.selectType'); - var type = info.Type || ''; - - if (info.Source && isM3uVariant(info.Source)) { - type = info.Source; - } - - selectType.value = type; +function fillTypes(view, currentId) { + return ApiClient.getJSON(ApiClient.getUrl('LiveTv/TunerHosts/Types')).then(function (types) { + const selectType = view.querySelector('.selectType'); + let html = ''; + html += types.map(function (tuner) { + return ''; + }).join(''); + html += ''; + selectType.innerHTML = html; + selectType.disabled = currentId != null; + selectType.value = ''; onTypeChange.call(selectType); - view.querySelector('.txtDevicePath').value = info.Url || ''; - view.querySelector('.txtFriendlyName').value = info.FriendlyName || ''; - view.querySelector('.txtUserAgent').value = info.UserAgent || ''; - view.querySelector('.fldDeviceId').value = info.DeviceId || ''; - view.querySelector('.chkFavorite').checked = info.ImportFavoritesOnly; - view.querySelector('.chkTranscode').checked = info.AllowHWTranscoding; - view.querySelector('.chkStreamLoop').checked = info.EnableStreamLooping; - view.querySelector('.txtTunerCount').value = info.TunerCount || '0'; - } + }); +} - function submitForm(page) { - loading.show(); - var info = { - Type: page.querySelector('.selectType').value, - Url: page.querySelector('.txtDevicePath').value || null, - UserAgent: page.querySelector('.txtUserAgent').value || null, - FriendlyName: page.querySelector('.txtFriendlyName').value || null, - DeviceId: page.querySelector('.fldDeviceId').value || null, - TunerCount: page.querySelector('.txtTunerCount').value || 0, - ImportFavoritesOnly: page.querySelector('.chkFavorite').checked, - AllowHWTranscoding: page.querySelector('.chkTranscode').checked, - EnableStreamLooping: page.querySelector('.chkStreamLoop').checked - }; +function reload(view, providerId) { + view.querySelector('.txtDevicePath').value = ''; + view.querySelector('.chkFavorite').checked = false; + view.querySelector('.txtDevicePath').value = ''; - if (isM3uVariant(info.Type)) { - info.Source = info.Type; - info.Type = 'm3u'; - } - - var id = getParameterByName('id'); - - if (id) { - info.Id = id; - } - - ApiClient.ajax({ - type: 'POST', - url: ApiClient.getUrl('LiveTv/TunerHosts'), - data: JSON.stringify(info), - contentType: 'application/json' - }).then(function (result) { - Dashboard.processServerConfigurationUpdateResult(); - Dashboard.navigate('livetvstatus.html'); - }, function () { - loading.hide(); - Dashboard.alert({ - message: globalize.translate('ErrorSavingTvProvider') - }); + if (providerId) { + ApiClient.getNamedConfiguration('livetv').then(function (config) { + const info = config.TunerHosts.filter(function (i) { + return i.Id === providerId; + })[0]; + fillTunerHostInfo(view, info); }); } +} - function getRequirePromise(deps) { - return new Promise(function (resolve, reject) { - require(deps, resolve); - }); +function fillTunerHostInfo(view, info) { + const selectType = view.querySelector('.selectType'); + let type = info.Type || ''; + + if (info.Source && isM3uVariant(info.Source)) { + type = info.Source; } - function getDetectedDevice() { - return getRequirePromise(['tunerPicker']).then(function (tunerPicker) { - return new tunerPicker().show({ - serverId: ApiClient.serverId() - }); - }); - } + selectType.value = type; + onTypeChange.call(selectType); + view.querySelector('.txtDevicePath').value = info.Url || ''; + view.querySelector('.txtFriendlyName').value = info.FriendlyName || ''; + view.querySelector('.txtUserAgent').value = info.UserAgent || ''; + view.querySelector('.fldDeviceId').value = info.DeviceId || ''; + view.querySelector('.chkFavorite').checked = info.ImportFavoritesOnly; + view.querySelector('.chkTranscode').checked = info.AllowHWTranscoding; + view.querySelector('.chkStreamLoop').checked = info.EnableStreamLooping; + view.querySelector('.txtTunerCount').value = info.TunerCount || '0'; +} - function onTypeChange() { - var value = this.value; - var view = dom.parentWithClass(this, 'page'); - var mayIncludeUnsupportedDrmChannels = 'hdhomerun' === value; - var supportsTranscoding = 'hdhomerun' === value; - var supportsFavorites = 'hdhomerun' === value; - var supportsTunerIpAddress = 'hdhomerun' === value; - var supportsTunerFileOrUrl = 'm3u' === value; - var supportsStreamLooping = 'm3u' === value; - var supportsTunerCount = 'm3u' === value; - var supportsUserAgent = 'm3u' === value; - var suppportsSubmit = 'other' !== value; - var supportsSelectablePath = supportsTunerFileOrUrl; - var txtDevicePath = view.querySelector('.txtDevicePath'); - - if (supportsTunerIpAddress) { - txtDevicePath.label(globalize.translate('LabelTunerIpAddress')); - view.querySelector('.fldPath').classList.remove('hide'); - } else if (supportsTunerFileOrUrl) { - txtDevicePath.label(globalize.translate('LabelFileOrUrl')); - view.querySelector('.fldPath').classList.remove('hide'); - } else { - view.querySelector('.fldPath').classList.add('hide'); - } - - if (supportsSelectablePath) { - view.querySelector('.btnSelectPath').classList.remove('hide'); - view.querySelector('.txtDevicePath').setAttribute('required', 'required'); - } else { - view.querySelector('.btnSelectPath').classList.add('hide'); - view.querySelector('.txtDevicePath').removeAttribute('required'); - } - - if (supportsUserAgent) { - view.querySelector('.fldUserAgent').classList.remove('hide'); - } else { - view.querySelector('.fldUserAgent').classList.add('hide'); - } - - if (supportsFavorites) { - view.querySelector('.fldFavorites').classList.remove('hide'); - } else { - view.querySelector('.fldFavorites').classList.add('hide'); - } - - if (supportsTranscoding) { - view.querySelector('.fldTranscode').classList.remove('hide'); - } else { - view.querySelector('.fldTranscode').classList.add('hide'); - } - - if (supportsStreamLooping) { - view.querySelector('.fldStreamLoop').classList.remove('hide'); - } else { - view.querySelector('.fldStreamLoop').classList.add('hide'); - } - - if (supportsTunerCount) { - view.querySelector('.fldTunerCount').classList.remove('hide'); - view.querySelector('.txtTunerCount').setAttribute('required', 'required'); - } else { - view.querySelector('.fldTunerCount').classList.add('hide'); - view.querySelector('.txtTunerCount').removeAttribute('required'); - } - - if (mayIncludeUnsupportedDrmChannels) { - view.querySelector('.drmMessage').classList.remove('hide'); - } else { - view.querySelector('.drmMessage').classList.add('hide'); - } - - if (suppportsSubmit) { - view.querySelector('.button-submit').classList.remove('hide'); - } else { - view.querySelector('.button-submit').classList.add('hide'); - } - } - - return function (view, params) { - if (!params.id) { - view.querySelector('.btnDetect').classList.remove('hide'); - } - - view.addEventListener('viewshow', function () { - var currentId = params.id; - fillTypes(view, currentId).then(function () { - reload(view, currentId); - }); - }); - view.querySelector('form').addEventListener('submit', function (e) { - submitForm(view); - e.preventDefault(); - e.stopPropagation(); - return false; - }); - view.querySelector('.selectType').addEventListener('change', onTypeChange); - view.querySelector('.btnDetect').addEventListener('click', function () { - getDetectedDevice().then(function (info) { - fillTunerHostInfo(view, info); - }); - }); - view.querySelector('.btnSelectPath').addEventListener('click', function () { - require(['directorybrowser'], function (directoryBrowser) { - var picker = new directoryBrowser.default(); - picker.show({ - includeFiles: true, - callback: function (path) { - if (path) { - view.querySelector('.txtDevicePath').value = path; - } - - picker.close(); - } - }); - }); - }); +function submitForm(page) { + loading.show(); + const info = { + Type: page.querySelector('.selectType').value, + Url: page.querySelector('.txtDevicePath').value || null, + UserAgent: page.querySelector('.txtUserAgent').value || null, + FriendlyName: page.querySelector('.txtFriendlyName').value || null, + DeviceId: page.querySelector('.fldDeviceId').value || null, + TunerCount: page.querySelector('.txtTunerCount').value || 0, + ImportFavoritesOnly: page.querySelector('.chkFavorite').checked, + AllowHWTranscoding: page.querySelector('.chkTranscode').checked, + EnableStreamLooping: page.querySelector('.chkStreamLoop').checked }; -}); + + if (isM3uVariant(info.Type)) { + info.Source = info.Type; + info.Type = 'm3u'; + } + + if (getParameterByName('id')) { + info.Id = getParameterByName('id'); + } + + ApiClient.ajax({ + type: 'POST', + url: ApiClient.getUrl('LiveTv/TunerHosts'), + data: JSON.stringify(info), + contentType: 'application/json' + }).then(function (result) { + Dashboard.processServerConfigurationUpdateResult(); + Dashboard.navigate('livetvstatus.html'); + }, function () { + loading.hide(); + Dashboard.alert({ + message: globalize.translate('ErrorSavingTvProvider') + }); + }); +} + +function getDetectedDevice() { + return import('tunerPicker').then(({default: tunerPicker}) => { + return new tunerPicker().show({ + serverId: ApiClient.serverId() + }); + }); +} + +function onTypeChange() { + const value = this.value; + const view = dom.parentWithClass(this, 'page'); + const mayIncludeUnsupportedDrmChannels = value === 'hdhomerun'; + const supportsTranscoding = value === 'hdhomerun'; + const supportsFavorites = value === 'hdhomerun'; + const supportsTunerIpAddress = value === 'hdhomerun'; + const supportsTunerFileOrUrl = value === 'm3u'; + const supportsStreamLooping = value === 'm3u'; + const supportsTunerCount = value === 'm3u'; + const supportsUserAgent = value === 'm3u'; + const suppportsSubmit = value !== 'other'; + const supportsSelectablePath = supportsTunerFileOrUrl; + const txtDevicePath = view.querySelector('.txtDevicePath'); + + if (supportsTunerIpAddress) { + txtDevicePath.label(globalize.translate('LabelTunerIpAddress')); + view.querySelector('.fldPath').classList.remove('hide'); + } else if (supportsTunerFileOrUrl) { + txtDevicePath.label(globalize.translate('LabelFileOrUrl')); + view.querySelector('.fldPath').classList.remove('hide'); + } else { + view.querySelector('.fldPath').classList.add('hide'); + } + + if (supportsSelectablePath) { + view.querySelector('.btnSelectPath').classList.remove('hide'); + view.querySelector('.txtDevicePath').setAttribute('required', 'required'); + } else { + view.querySelector('.btnSelectPath').classList.add('hide'); + view.querySelector('.txtDevicePath').removeAttribute('required'); + } + + if (supportsUserAgent) { + view.querySelector('.fldUserAgent').classList.remove('hide'); + } else { + view.querySelector('.fldUserAgent').classList.add('hide'); + } + + if (supportsFavorites) { + view.querySelector('.fldFavorites').classList.remove('hide'); + } else { + view.querySelector('.fldFavorites').classList.add('hide'); + } + + if (supportsTranscoding) { + view.querySelector('.fldTranscode').classList.remove('hide'); + } else { + view.querySelector('.fldTranscode').classList.add('hide'); + } + + if (supportsStreamLooping) { + view.querySelector('.fldStreamLoop').classList.remove('hide'); + } else { + view.querySelector('.fldStreamLoop').classList.add('hide'); + } + + if (supportsTunerCount) { + view.querySelector('.fldTunerCount').classList.remove('hide'); + view.querySelector('.txtTunerCount').setAttribute('required', 'required'); + } else { + view.querySelector('.fldTunerCount').classList.add('hide'); + view.querySelector('.txtTunerCount').removeAttribute('required'); + } + + if (mayIncludeUnsupportedDrmChannels) { + view.querySelector('.drmMessage').classList.remove('hide'); + } else { + view.querySelector('.drmMessage').classList.add('hide'); + } + + if (suppportsSubmit) { + view.querySelector('.button-submit').classList.remove('hide'); + } else { + view.querySelector('.button-submit').classList.add('hide'); + } +} + +export default function (view, params) { + if (!params.id) { + view.querySelector('.btnDetect').classList.remove('hide'); + } + + view.addEventListener('viewshow', function () { + const currentId = params.id; + fillTypes(view, currentId).then(function () { + reload(view, currentId); + }); + }); + view.querySelector('form').addEventListener('submit', function (e) { + submitForm(view); + e.preventDefault(); + e.stopPropagation(); + return false; + }); + view.querySelector('.selectType').addEventListener('change', onTypeChange); + view.querySelector('.btnDetect').addEventListener('click', function () { + getDetectedDevice().then(function (info) { + fillTunerHostInfo(view, info); + }); + }); + view.querySelector('.btnSelectPath').addEventListener('click', function () { + import('directorybrowser').then(({default: directorybrowser}) => { + const picker = new directorybrowser(); + picker.show({ + includeFiles: true, + callback: function (path) { + if (path) { + view.querySelector('.txtDevicePath').value = path; + } + + picker.close(); + } + }); + }); + }); +} diff --git a/src/controllers/movies/moviecollections.js b/src/controllers/movies/moviecollections.js index 44904633fa..dc8fae3a7b 100644 --- a/src/controllers/movies/moviecollections.js +++ b/src/controllers/movies/moviecollections.js @@ -50,7 +50,7 @@ define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardB var viewStyle = self.getCurrentViewStyle(); var itemsContainer = tabContent.querySelector('.itemsContainer'); - if ('List' == viewStyle) { + if (viewStyle == 'List') { itemsContainer.classList.add('vertical-list'); itemsContainer.classList.remove('vertical-wrap'); } else { diff --git a/src/controllers/movies/moviegenres.js b/src/controllers/movies/moviegenres.js index 69450989e8..07334b4d91 100644 --- a/src/controllers/movies/moviegenres.js +++ b/src/controllers/movies/moviegenres.js @@ -56,13 +56,13 @@ define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader var elem = entry.target; var id = elem.getAttribute('data-id'); var viewStyle = self.getCurrentViewStyle(); - var limit = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 5 : 9; + var limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9; if (enableScrollX()) { limit = 10; } - var enableImageTypes = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 'Primary,Backdrop,Thumb' : 'Primary'; + var enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 'Primary,Backdrop,Thumb' : 'Primary'; var query = { SortBy: 'SortName', SortOrder: 'Ascending', diff --git a/src/controllers/music/musicalbums.js b/src/controllers/music/musicalbums.js index 9b4fcde327..7d03c91073 100644 --- a/src/controllers/music/musicalbums.js +++ b/src/controllers/music/musicalbums.js @@ -1,9 +1,18 @@ -define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) { - 'use strict'; +import playbackManager from 'playbackManager'; +import loading from 'loading'; +import events from 'events'; +import libraryBrowser from 'libraryBrowser'; +import imageLoader from 'imageLoader'; +import AlphaPicker from 'alphaPicker'; +import listView from 'listView'; +import cardBuilder from 'cardBuilder'; +import * as userSettings from 'userSettings'; +import globalize from 'globalize'; +import 'emby-itemscontainer'; - libraryBrowser = libraryBrowser.default || libraryBrowser; +/* eslint-disable indent */ - return function (view, params, tabContent) { + export default function (view, params, tabContent) { function playAll() { ApiClient.getItem(ApiClient.getCurrentUserId(), params.topParentId).then(function (item) { playbackManager.play({ @@ -20,7 +29,7 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser } function getPageData() { - var key = getSavedQueryKey(); + const key = getSavedQueryKey(); if (!pageData) { pageData = { @@ -61,10 +70,10 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser } function onViewStyleChange() { - var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const viewStyle = self.getCurrentViewStyle(); + const itemsContainer = tabContent.querySelector('.itemsContainer'); - if ('List' == viewStyle) { + if (viewStyle == 'List') { itemsContainer.classList.add('vertical-list'); itemsContainer.classList.remove('vertical-wrap'); } else { @@ -78,7 +87,7 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser function reloadItems(page) { loading.show(); isLoading = true; - var query = getQuery(); + const query = getQuery(); ApiClient.getItems(ApiClient.getCurrentUserId(), query).then(function (result) { function onNextPageClick() { if (isLoading) { @@ -104,8 +113,8 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser window.scrollTo(0, 0); updateFilterControls(page); - var html; - var pagingHtml = libraryBrowser.getQueryPagingHtml({ + let html; + const pagingHtml = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -115,7 +124,7 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser sortButton: false, filterButton: false }); - var viewStyle = self.getCurrentViewStyle(); + const viewStyle = self.getCurrentViewStyle(); if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, @@ -146,50 +155,48 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser overlayPlayButton: true }); } - var i; - var length; - var elems = tabContent.querySelectorAll('.paging'); + let elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { + for (let i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { + for (let i = 0, length = elems.length; i < length; i++) { elems[i].addEventListener('click', onNextPageClick); } elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { + for (let i = 0, length = elems.length; i < length; i++) { elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(tabContent); }); }); } function updateFilterControls(tabContent) { - var query = getQuery(); + const query = getQuery(); self.alphaPicker.value(query.NameStartsWithOrGreater); } - var savedQueryKey; - var pageData; - var self = this; - var isLoading = false; + let savedQueryKey; + let pageData; + const self = this; + let isLoading = false; self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { - var filterDialog = new filterDialogFactory({ + import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + const filterDialog = new filterDialogFactory({ query: getQuery(), mode: 'albums', serverId: ApiClient.serverId() @@ -207,17 +214,17 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const alphaPickerElement = tabContent.querySelector('.alphaPicker'); + const itemsContainer = tabContent.querySelector('.itemsContainer'); alphaPickerElement.addEventListener('alphavaluechanged', function (e) { - var newValue = e.detail.value; - var query = getQuery(); + const newValue = e.detail.value; + const query = getQuery(); query.NameStartsWithOrGreater = newValue; query.StartIndex = 0; reloadItems(tabContent); }); - self.alphaPicker = new AlphaPicker.default({ + self.alphaPicker = new AlphaPicker({ element: alphaPickerElement, valueChangeEvent: 'click' }); @@ -261,12 +268,12 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser button: e.target }); }); - var btnSelectView = tabContent.querySelector('.btnSelectView'); + const btnSelectView = tabContent.querySelector('.btnSelectView'); btnSelectView.addEventListener('click', function (e) { libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); btnSelectView.addEventListener('layoutchange', function (e) { - var viewStyle = e.detail.viewStyle; + const viewStyle = e.detail.viewStyle; getPageData().view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle); getQuery().StartIndex = 0; @@ -286,5 +293,6 @@ define(['layoutManager', 'playbackManager', 'loading', 'events', 'libraryBrowser }; self.destroy = function () {}; - }; -}); + } + +/* eslint-enable indent */ diff --git a/src/controllers/music/musicartists.js b/src/controllers/music/musicartists.js index 3e86def538..23e0bbd459 100644 --- a/src/controllers/music/musicartists.js +++ b/src/controllers/music/musicartists.js @@ -1,15 +1,22 @@ -define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'apphost', 'userSettings', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, appHost, userSettings) { - 'use strict'; +import loading from 'loading'; +import events from 'events'; +import libraryBrowser from 'libraryBrowser'; +import imageLoader from 'imageLoader'; +import AlphaPicker from 'alphaPicker'; +import listView from 'listView'; +import cardBuilder from 'cardBuilder'; +import * as userSettings from 'userSettings'; +import 'emby-itemscontainer'; - libraryBrowser = libraryBrowser.default || libraryBrowser; +/* eslint-disable indent */ - return function (view, params, tabContent) { + export default function (view, params, tabContent) { function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; + const key = getSavedQueryKey(context); + let pageData = data[key]; if (!pageData) { - var queryValues = { + const queryValues = { SortBy: 'SortName', SortOrder: 'Ascending', Recursive: true, @@ -47,10 +54,10 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' } function onViewStyleChange() { - var viewStyle = self.getCurrentViewStyle(); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const viewStyle = self.getCurrentViewStyle(); + const itemsContainer = tabContent.querySelector('.itemsContainer'); - if ('List' == viewStyle) { + if (viewStyle == 'List') { itemsContainer.classList.add('vertical-list'); itemsContainer.classList.remove('vertical-wrap'); } else { @@ -64,8 +71,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' function reloadItems(page) { loading.show(); isLoading = true; - var query = getQuery(page); - var promise = self.mode == 'albumartists' ? + const query = getQuery(page); + const promise = self.mode == 'albumartists' ? ApiClient.getAlbumArtists(ApiClient.getCurrentUserId(), query) : ApiClient.getArtists(ApiClient.getCurrentUserId(), query); promise.then(function (result) { @@ -93,8 +100,8 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' window.scrollTo(0, 0); updateFilterControls(page); - var html; - var pagingHtml = libraryBrowser.getQueryPagingHtml({ + let html; + const pagingHtml = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -104,7 +111,7 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' sortButton: false, filterButton: false }); - var viewStyle = self.getCurrentViewStyle(); + const viewStyle = self.getCurrentViewStyle(); if (viewStyle == 'List') { html = listView.getListViewHtml({ items: result.Items, @@ -131,49 +138,47 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' overlayPlayButton: true }); } - var i; - var length; - var elems = tabContent.querySelectorAll('.paging'); + let elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { + for (let i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { + for (let i = 0, length = elems.length; i < length; i++) { elems[i].addEventListener('click', onNextPageClick); } elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { + for (let i = 0, length = elems.length; i < length; i++) { elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(tabContent); }); }); } function updateFilterControls(tabContent) { - var query = getQuery(tabContent); + const query = getQuery(tabContent); self.alphaPicker.value(query.NameStartsWithOrGreater); } - var self = this; - var data = {}; - var isLoading = false; + const self = this; + const data = {}; + let isLoading = false; self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { - var filterDialog = new filterDialogFactory({ + import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: self.mode, serverId: ApiClient.serverId() @@ -191,17 +196,17 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }; function initPage(tabContent) { - var alphaPickerElement = tabContent.querySelector('.alphaPicker'); - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const alphaPickerElement = tabContent.querySelector('.alphaPicker'); + const itemsContainer = tabContent.querySelector('.itemsContainer'); alphaPickerElement.addEventListener('alphavaluechanged', function (e) { - var newValue = e.detail.value; - var query = getQuery(tabContent); + const newValue = e.detail.value; + const query = getQuery(tabContent); query.NameStartsWithOrGreater = newValue; query.StartIndex = 0; reloadItems(tabContent); }); - self.alphaPicker = new AlphaPicker.default({ + self.alphaPicker = new AlphaPicker({ element: alphaPickerElement, valueChangeEvent: 'click' }); @@ -213,12 +218,12 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' tabContent.querySelector('.btnFilter').addEventListener('click', function () { self.showFilterMenu(); }); - var btnSelectView = tabContent.querySelector('.btnSelectView'); + const btnSelectView = tabContent.querySelector('.btnSelectView'); btnSelectView.addEventListener('click', function (e) { libraryBrowser.showLayoutMenu(e.target, self.getCurrentViewStyle(), 'List,Poster,PosterCard'.split(',')); }); btnSelectView.addEventListener('layoutchange', function (e) { - var viewStyle = e.detail.viewStyle; + const viewStyle = e.detail.viewStyle; getPageData(tabContent).view = viewStyle; libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle); getQuery(tabContent).StartIndex = 0; @@ -236,5 +241,6 @@ define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', ' }; self.destroy = function () {}; - }; -}); + } + +/* eslint-enable indent */ diff --git a/src/controllers/music/musicgenres.js b/src/controllers/music/musicgenres.js index 948c4da7dd..29e0d888e4 100644 --- a/src/controllers/music/musicgenres.js +++ b/src/controllers/music/musicgenres.js @@ -1,12 +1,14 @@ -define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { - 'use strict'; +import libraryBrowser from 'libraryBrowser'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import loading from 'loading'; - libraryBrowser = libraryBrowser.default || libraryBrowser; +/* eslint-disable indent */ - return function (view, params, tabContent) { + export default function (view, params, tabContent) { function getPageData() { - var key = getSavedQueryKey(); - var pageData = data[key]; + const key = getSavedQueryKey(); + let pageData = data[key]; if (!pageData) { pageData = data[key] = { @@ -36,15 +38,15 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f function getPromise() { loading.show(); - var query = getQuery(); + const query = getQuery(); return ApiClient.getGenres(ApiClient.getCurrentUserId(), query); } function reloadItems(context, promise) { - var query = getQuery(); + const query = getQuery(); promise.then(function (result) { - var html = ''; - var viewStyle = self.getCurrentViewStyle(); + let html = ''; + const viewStyle = self.getCurrentViewStyle(); if (viewStyle == 'Thumb') { html = cardBuilder.getCardsHtml({ @@ -84,13 +86,13 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f }); } - var elem = context.querySelector('#items'); + const elem = context.querySelector('#items'); elem.innerHTML = html; imageLoader.lazyChildren(elem); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(context); }); }); @@ -101,8 +103,8 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f self.renderTab(); } - var self = this; - var data = {}; + const self = this; + const data = {}; self.getViewStyles = function () { return 'Poster,PosterCard,Thumb,ThumbCard'.split(','); @@ -119,7 +121,7 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f }; self.enableViewSelection = true; - var promise; + let promise; self.preRender = function () { promise = getPromise(); @@ -128,5 +130,6 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f self.renderTab = function () { reloadItems(tabContent, promise); }; - }; -}); + } + +/* eslint-enable indent */ diff --git a/src/controllers/music/musicplaylists.js b/src/controllers/music/musicplaylists.js index 19c08812f9..befeafcf4c 100644 --- a/src/controllers/music/musicplaylists.js +++ b/src/controllers/music/musicplaylists.js @@ -1,12 +1,14 @@ -define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], function (libraryBrowser, cardBuilder, appHost, imageLoader, loading) { - 'use strict'; +import libraryBrowser from 'libraryBrowser'; +import cardBuilder from 'cardBuilder'; +import imageLoader from 'imageLoader'; +import loading from 'loading'; - libraryBrowser = libraryBrowser.default || libraryBrowser; +/* eslint-disable indent */ - return function (view, params, tabContent) { + export default function (view, params, tabContent) { function getPageData() { - var key = getSavedQueryKey(); - var pageData = data[key]; + const key = getSavedQueryKey(); + let pageData = data[key]; if (!pageData) { pageData = data[key] = { @@ -37,14 +39,14 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f function getPromise() { loading.show(); - var query = getQuery(); + const query = getQuery(); return ApiClient.getItems(ApiClient.getCurrentUserId(), query); } function reloadItems(context, promise) { - var query = getQuery(); + const query = getQuery(); promise.then(function (result) { - var html = ''; + let html = ''; html = cardBuilder.getCardsHtml({ items: result.Items, shape: 'square', @@ -55,26 +57,26 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f allowBottomPadding: true, cardLayout: false }); - var elem = context.querySelector('#items'); + const elem = context.querySelector('#items'); elem.innerHTML = html; imageLoader.lazyChildren(elem); libraryBrowser.saveQueryValues(getSavedQueryKey(), query); loading.hide(); - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(context); }); }); } - var self = this; - var data = {}; + const self = this; + const data = {}; self.getCurrentViewStyle = function () { return getPageData().view; }; - var promise; + let promise; self.preRender = function () { promise = getPromise(); @@ -83,5 +85,6 @@ define(['libraryBrowser', 'cardBuilder', 'apphost', 'imageLoader', 'loading'], f self.renderTab = function () { reloadItems(tabContent, promise); }; - }; -}); + } + +/* eslint-enable indent */ diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index 0eecef0bfb..db7dac9547 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -1,8 +1,24 @@ -define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', 'cardBuilder', 'dom', 'apphost', 'imageLoader', 'libraryMenu', 'playbackManager', 'mainTabsManager', 'globalize', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button', 'flexStyles'], function (browser, layoutManager, userSettings, inputManager, loading, cardBuilder, dom, appHost, imageLoader, libraryMenu, playbackManager, mainTabsManager, globalize) { - 'use strict'; +import browser from 'browser'; +import layoutManager from 'layoutManager'; +import * as userSettings from 'userSettings'; +import inputManager from 'inputManager'; +import loading from 'loading'; +import cardBuilder from 'cardBuilder'; +import dom from 'dom'; +import imageLoader from 'imageLoader'; +import libraryMenu from 'libraryMenu'; +import * as mainTabsManager from 'mainTabsManager'; +import globalize from 'globalize'; +import 'scrollStyles'; +import 'emby-itemscontainer'; +import 'emby-tabs'; +import 'emby-button'; +import 'flexStyles'; + +/* eslint-disable indent */ function itemsPerRow() { - var screenWidth = dom.getWindowSize().innerWidth; + const screenWidth = dom.getWindowSize().innerWidth; if (screenWidth >= 1920) { return 9; @@ -29,8 +45,8 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' function loadLatest(page, parentId) { loading.show(); - var userId = ApiClient.getCurrentUserId(); - var options = { + const userId = ApiClient.getCurrentUserId(); + const options = { IncludeItemTypes: 'Audio', Limit: enableScrollX() ? 3 * itemsPerRow() : 2 * itemsPerRow(), Fields: 'PrimaryImageAspectRatio,BasicSyncInfo', @@ -41,7 +57,6 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' }; ApiClient.getJSON(ApiClient.getUrl('Users/' + userId + '/Items/Latest', options)).then(function (items) { var elem = page.querySelector('#recentlyAddedSongs'); - elem.innerHTML = cardBuilder.getCardsHtml({ items: items, showUnplayedIndicator: false, @@ -59,14 +74,14 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' imageLoader.lazyChildren(elem); loading.hide(); - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); } function loadRecentlyPlayed(page, parentId) { - var options = { + const options = { SortBy: 'DatePlayed', SortOrder: 'Descending', IncludeItemTypes: 'Audio', @@ -80,7 +95,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' EnableTotalRecordCount: false }; ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) { - var elem = page.querySelector('#recentlyPlayed'); + const elem = page.querySelector('#recentlyPlayed'); if (result.Items.length) { elem.classList.remove('hide'); @@ -89,6 +104,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' } var itemsContainer = elem.querySelector('.itemsContainer'); + itemsContainer.innerHTML = cardBuilder.getCardsHtml({ items: result.Items, showUnplayedIndicator: false, @@ -108,7 +124,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' } function loadFrequentlyPlayed(page, parentId) { - var options = { + const options = { SortBy: 'PlayCount', SortOrder: 'Descending', IncludeItemTypes: 'Audio', @@ -122,7 +138,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' EnableTotalRecordCount: false }; ApiClient.getItems(ApiClient.getCurrentUserId(), options).then(function (result) { - var elem = page.querySelector('#topPlayed'); + const elem = page.querySelector('#topPlayed'); if (result.Items.length) { elem.classList.remove('hide'); @@ -155,7 +171,7 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' loadRecentlyPlayed(tabContent, parentId); loadFrequentlyPlayed(tabContent, parentId); - require(['components/favoriteitems'], function (favoriteItems) { + import('components/favoriteitems').then(({default: favoriteItems}) => { favoriteItems.render(tabContent, ApiClient.getCurrentUserId(), parentId, ['favoriteArtists', 'favoriteAlbums', 'favoriteSongs']); }); } @@ -206,10 +222,10 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' } } - return function (view, params) { + export default function (view, params) { function reload() { loading.show(); - var tabContent = view.querySelector(".pageTabContent[data-index='0']"); + const tabContent = view.querySelector(".pageTabContent[data-index='0']"); loadSuggestionsTab(view, tabContent, params.topParentId); } @@ -252,46 +268,48 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' } function getTabController(page, index, callback) { - var depends = []; + let depends; switch (index) { case 0: + depends = 'controllers/music/musicrecommended'; break; case 1: - depends.push('controllers/music/musicalbums'); + depends = 'controllers/music/musicalbums'; break; case 2: case 3: - depends.push('controllers/music/musicartists'); + depends = 'controllers/music/musicartists'; break; case 4: - depends.push('controllers/music/musicplaylists'); + depends = 'controllers/music/musicplaylists'; break; case 5: - depends.push('controllers/music/songs'); + depends = 'controllers/music/songs'; break; case 6: - depends.push('controllers/music/musicgenres'); + depends = 'controllers/music/musicgenres'; break; case 7: - depends.push('scripts/searchtab'); + depends = 'scripts/searchtab'; + break; } - require(depends, function (controllerFactory) { - var tabContent; + import(depends).then(({default: controllerFactory}) => { + let tabContent; - if (0 == index) { + if (index == 0) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); self.tabContent = tabContent; } - var controller = tabControllers[index]; + let controller = tabControllers[index]; if (!controller) { tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']"); @@ -353,10 +371,10 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' var currentTabIndex = parseInt(params.tab || getDefaultTabIndex(params.topParentId)); self.initTab = function () { - var tabContent = view.querySelector(".pageTabContent[data-index='0']"); - var containers = tabContent.querySelectorAll('.itemsContainer'); + const tabContent = view.querySelector(".pageTabContent[data-index='0']"); + const containers = tabContent.querySelectorAll('.itemsContainer'); - for (var i = 0, length = containers.length; i < length; i++) { + for (let i = 0, length = containers.length; i < length; i++) { setScrollClasses(containers[i], enableScrollX()); } }; @@ -365,12 +383,12 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' reload(); }; - var tabControllers = []; - var renderedTabs = []; + const tabControllers = []; + const renderedTabs = []; view.addEventListener('viewshow', function (e) { initTabs(); if (!view.getAttribute('data-title')) { - var parentId = params.topParentId; + const parentId = params.topParentId; if (parentId) { ApiClient.getItem(ApiClient.getCurrentUserId(), parentId).then(function (item) { @@ -395,5 +413,6 @@ define(['browser', 'layoutManager', 'userSettings', 'inputManager', 'loading', ' } }); }); - }; -}); + } + +/* eslint-enable indent */ diff --git a/src/controllers/music/songs.js b/src/controllers/music/songs.js index 74c5106860..4c4f229e58 100644 --- a/src/controllers/music/songs.js +++ b/src/controllers/music/songs.js @@ -1,12 +1,18 @@ -define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userSettings', 'globalize', 'emby-itemscontainer'], function (events, libraryBrowser, imageLoader, listView, loading, userSettings, globalize) { - 'use strict'; +import events from 'events'; +import libraryBrowser from 'libraryBrowser'; +import imageLoader from 'imageLoader'; +import listView from 'listView'; +import loading from 'loading'; +import * as userSettings from 'userSettings'; +import globalize from 'globalize'; +import 'emby-itemscontainer'; - libraryBrowser = libraryBrowser.default || libraryBrowser; +/* eslint-disable indent */ - return function (view, params, tabContent) { + export default function (view, params, tabContent) { function getPageData(context) { - var key = getSavedQueryKey(context); - var pageData = data[key]; + const key = getSavedQueryKey(context); + let pageData = data[key]; if (!pageData) { pageData = data[key] = { @@ -48,7 +54,7 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS function reloadItems(page) { loading.show(); isLoading = true; - var query = getQuery(page); + const query = getQuery(page); ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) { function onNextPageClick() { if (isLoading) { @@ -73,9 +79,7 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS } window.scrollTo(0, 0); - var i; - var length; - var pagingHtml = libraryBrowser.getQueryPagingHtml({ + const pagingHtml = libraryBrowser.getQueryPagingHtml({ startIndex: query.StartIndex, limit: query.Limit, totalRecordCount: result.TotalRecordCount, @@ -85,49 +89,49 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS sortButton: false, filterButton: false }); - var html = listView.getListViewHtml({ + const html = listView.getListViewHtml({ items: result.Items, action: 'playallfromhere', smallIcon: true, artist: true, addToListButton: true }); - var elems = tabContent.querySelectorAll('.paging'); + let elems = tabContent.querySelectorAll('.paging'); - for (i = 0, length = elems.length; i < length; i++) { + for (let i = 0, length = elems.length; i < length; i++) { elems[i].innerHTML = pagingHtml; } elems = tabContent.querySelectorAll('.btnNextPage'); - for (i = 0, length = elems.length; i < length; i++) { + for (let i = 0, length = elems.length; i < length; i++) { elems[i].addEventListener('click', onNextPageClick); } elems = tabContent.querySelectorAll('.btnPreviousPage'); - for (i = 0, length = elems.length; i < length; i++) { + for (let i = 0, length = elems.length; i < length; i++) { elems[i].addEventListener('click', onPreviousPageClick); } - var itemsContainer = tabContent.querySelector('.itemsContainer'); + const itemsContainer = tabContent.querySelector('.itemsContainer'); itemsContainer.innerHTML = html; imageLoader.lazyChildren(itemsContainer); libraryBrowser.saveQueryValues(getSavedQueryKey(page), query); loading.hide(); isLoading = false; - require(['autoFocuser'], function (autoFocuser) { + import('autoFocuser').then(({default: autoFocuser}) => { autoFocuser.autoFocus(page); }); }); } - var self = this; - var data = {}; - var isLoading = false; + const self = this; + const data = {}; + let isLoading = false; self.showFilterMenu = function () { - require(['components/filterdialog/filterdialog'], function ({default: filterDialogFactory}) { - var filterDialog = new filterDialogFactory({ + import('components/filterdialog/filterdialog').then(({default: filterDialogFactory}) => { + const filterDialog = new filterDialogFactory({ query: getQuery(tabContent), mode: 'songs', serverId: ApiClient.serverId() @@ -195,5 +199,6 @@ define(['events', 'libraryBrowser', 'imageLoader', 'listView', 'loading', 'userS }; self.destroy = function () {}; - }; -}); + } + +/* eslint-enable indent */ diff --git a/src/controllers/playback/video/index.html b/src/controllers/playback/video/index.html index 452c8a9af8..cf3d0beff8 100644 --- a/src/controllers/playback/video/index.html +++ b/src/controllers/playback/video/index.html @@ -28,7 +28,7 @@ - @@ -44,7 +44,7 @@ - diff --git a/src/controllers/playback/video/index.js b/src/controllers/playback/video/index.js index d2bddfc136..e40ea4c0ad 100644 --- a/src/controllers/playback/video/index.js +++ b/src/controllers/playback/video/index.js @@ -1,6 +1,7 @@ import playbackManager from 'playbackManager'; import dom from 'dom'; import inputManager from 'inputManager'; +import mouseManager from 'mouseManager'; import datetime from 'datetime'; import itemHelper from 'itemHelper'; import mediaInfo from 'mediaInfo'; @@ -21,18 +22,18 @@ import 'css!assets/css/videoosd'; /* eslint-disable indent */ function seriesImageUrl(item, options) { - if ('Episode' !== item.Type) { + if (item.Type !== 'Episode') { return null; } options = options || {}; options.type = options.type || 'Primary'; - if ('Primary' === options.type && item.SeriesPrimaryImageTag) { + if (options.type === 'Primary' && item.SeriesPrimaryImageTag) { options.tag = item.SeriesPrimaryImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); } - if ('Thumb' === options.type) { + if (options.type === 'Thumb') { if (item.SeriesThumbImageTag) { options.tag = item.SeriesThumbImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.SeriesId, options); @@ -56,7 +57,7 @@ import 'css!assets/css/videoosd'; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.PrimaryImageItemId || item.Id, options); } - if ('Primary' === options.type && item.AlbumId && item.AlbumPrimaryImageTag) { + if (options.type === 'Primary' && item.AlbumId && item.AlbumPrimaryImageTag) { options.tag = item.AlbumPrimaryImageTag; return connectionManager.getApiClient(item.ServerId).getScaledImageUrl(item.AlbumId, options); } @@ -103,7 +104,7 @@ import 'css!assets/css/videoosd'; function onDoubleClick(e) { const clientX = e.clientX; - if (null != clientX) { + if (clientX != null) { if (clientX < dom.getWindowSize().innerWidth / 2) { playbackManager.rewind(currentPlayer); } else { @@ -116,7 +117,7 @@ import 'css!assets/css/videoosd'; } function getDisplayItem(item) { - if ('TvChannel' === item.Type) { + if (item.Type === 'TvChannel') { const apiClient = connectionManager.getApiClient(item.ServerId); return apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (refreshedItem) { return { @@ -132,7 +133,7 @@ import 'css!assets/css/videoosd'; } function updateRecordingButton(item) { - if (!item || 'Program' !== item.Type) { + if (!item || item.Type !== 'Program') { if (recordingButtonManager) { recordingButtonManager.destroy(); recordingButtonManager = null; @@ -175,8 +176,8 @@ import 'css!assets/css/videoosd'; const osdTitle = view.querySelector('.osdTitle'); titleElement = osdTitle; let displayName = itemHelper.getDisplayName(displayItem, { - includeParentInfo: 'Program' !== displayItem.Type, - includeIndexNumber: 'Program' !== displayItem.Type + includeParentInfo: displayItem.Type !== 'Program', + includeIndexNumber: displayItem.Type !== 'Program' }); if (!displayName) { @@ -197,8 +198,8 @@ import 'css!assets/css/videoosd'; tomatoes: false, endsAt: false, episodeTitle: false, - originalAirDate: 'Program' !== displayItem.Type, - episodeTitleIndexNumber: 'Program' !== displayItem.Type, + originalAirDate: displayItem.Type !== 'Program', + episodeTitleIndexNumber: displayItem.Type !== 'Program', programIndicator: false }); const osdMediaInfo = view.querySelector('.osdMediaInfo'); @@ -270,7 +271,7 @@ import 'css!assets/css/videoosd'; } function shouldEnableProgressByTimeOfDay(item) { - return !('TvChannel' !== item.Type || !item.CurrentProgram); + return !(item.Type !== 'TvChannel' || !item.CurrentProgram); } function updateNowPlayingInfo(player, state) { @@ -367,10 +368,11 @@ import 'css!assets/css/videoosd'; function hideOsd() { slideUpToHide(headerElement); hideMainOsdControls(); + mouseManager.hideCursor(); } function toggleOsd() { - if ('osd' === currentVisibleMenu) { + if (currentVisibleMenu === 'osd') { hideOsd(); } else if (!currentVisibleMenu) { showOsd(); @@ -431,10 +433,11 @@ import 'css!assets/css/videoosd'; } function hideMainOsdControls() { - if ('osd' === currentVisibleMenu) { + if (currentVisibleMenu === 'osd') { const elem = osdBottomElement; clearHideAnimationEventListeners(elem); elem.classList.add('videoOsdBottom-hidden'); + dom.addEventListener(elem, transitionEndEventName, onHideAnimationComplete, { once: true }); @@ -460,7 +463,7 @@ import 'css!assets/css/videoosd'; } function onPointerMove(e) { - if ('mouse' === (e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse'))) { + if ((e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse')) === 'mouse') { const eventX = e.screenX || 0; const eventY = e.screenY || 0; const obj = lastPointerMoveData; @@ -488,7 +491,7 @@ import 'css!assets/css/videoosd'; switch (e.detail.command) { case 'left': - if ('osd' === currentVisibleMenu) { + if (currentVisibleMenu === 'osd') { showOsd(); } else { if (!currentVisibleMenu) { @@ -500,7 +503,7 @@ import 'css!assets/css/videoosd'; break; case 'right': - if ('osd' === currentVisibleMenu) { + if (currentVisibleMenu === 'osd') { showOsd(); } else if (!currentVisibleMenu) { e.preventDefault(); @@ -615,7 +618,7 @@ import 'css!assets/css/videoosd'; resetUpNextDialog(); console.debug('nowplaying event: ' + e.type); - if ('Video' !== state.NextMediaType) { + if (state.NextMediaType !== 'Video') { view.removeEventListener('viewbeforehide', onViewHideStopPlayback); Emby.Page.back(); } @@ -702,7 +705,7 @@ import 'css!assets/css/videoosd'; } function showComingUpNextIfNeeded(player, currentItem, currentTimeTicks, runtimeTicks) { - if (runtimeTicks && currentTimeTicks && !comingUpNextDisplayed && !currentVisibleMenu && 'Episode' === currentItem.Type && userSettings.enableNextVideoInfoOverlay()) { + if (runtimeTicks && currentTimeTicks && !comingUpNextDisplayed && !currentVisibleMenu && currentItem.Type === 'Episode' && userSettings.enableNextVideoInfoOverlay()) { const showAtSecondsLeft = runtimeTicks >= 3e10 ? 40 : runtimeTicks >= 24e9 ? 35 : 30; const showAtTicks = runtimeTicks - 1e3 * showAtSecondsLeft * 1e4; const timeRemainingTicks = runtimeTicks - currentTimeTicks; @@ -714,7 +717,7 @@ import 'css!assets/css/videoosd'; } function onUpNextHidden() { - if ('upnext' === currentVisibleMenu) { + if (currentVisibleMenu === 'upnext') { currentVisibleMenu = null; } } @@ -737,7 +740,7 @@ import 'css!assets/css/videoosd'; } function refreshProgramInfoIfNeeded(player, item) { - if ('TvChannel' === item.Type) { + if (item.Type === 'TvChannel') { const program = item.CurrentProgram; if (program && program.EndDate) { @@ -778,7 +781,7 @@ import 'css!assets/css/videoosd'; updatePlayPauseState(playState.IsPaused); const supportedCommands = playbackManager.getSupportedCommands(player); currentPlayerSupportedCommands = supportedCommands; - supportsBrightnessChange = -1 !== supportedCommands.indexOf('SetBrightness'); + supportsBrightnessChange = supportedCommands.indexOf('SetBrightness') !== -1; updatePlayerVolumeState(player, playState.IsMuted, playState.VolumeLevel); if (nowPlayingPositionSlider && !nowPlayingPositionSlider.dragging) { @@ -792,13 +795,13 @@ import 'css!assets/css/videoosd'; updateTimeDisplay(playState.PositionTicks, nowPlayingItem.RunTimeTicks, playState.PlaybackStartTimeTicks, playState.BufferedRanges || []); updateNowPlayingInfo(player, state); - if (state.MediaSource && state.MediaSource.SupportsTranscoding && -1 !== supportedCommands.indexOf('SetMaxStreamingBitrate')) { + if (state.MediaSource && state.MediaSource.SupportsTranscoding && supportedCommands.indexOf('SetMaxStreamingBitrate') !== -1) { view.querySelector('.btnVideoOsdSettings').classList.remove('hide'); } else { view.querySelector('.btnVideoOsdSettings').classList.add('hide'); } - const isProgressClear = state.MediaSource && null == state.MediaSource.RunTimeTicks; + const isProgressClear = state.MediaSource && state.MediaSource.RunTimeTicks == null; nowPlayingPositionSlider.setIsClear(isProgressClear); if (nowPlayingItem.RunTimeTicks) { @@ -806,19 +809,19 @@ import 'css!assets/css/videoosd'; userSettings.skipForwardLength() * 1000000 / nowPlayingItem.RunTimeTicks); } - if (-1 === supportedCommands.indexOf('ToggleFullscreen') || player.isLocalPlayer && layoutManager.tv && playbackManager.isFullscreen(player)) { + if (supportedCommands.indexOf('ToggleFullscreen') === -1 || player.isLocalPlayer && layoutManager.tv && playbackManager.isFullscreen(player)) { view.querySelector('.btnFullscreen').classList.add('hide'); } else { view.querySelector('.btnFullscreen').classList.remove('hide'); } - if (-1 === supportedCommands.indexOf('PictureInPicture')) { + if (supportedCommands.indexOf('PictureInPicture') === -1) { view.querySelector('.btnPip').classList.add('hide'); } else { view.querySelector('.btnPip').classList.remove('hide'); } - if (-1 === supportedCommands.indexOf('AirPlay')) { + if (supportedCommands.indexOf('AirPlay') === -1) { view.querySelector('.btnAirPlay').classList.add('hide'); } else { view.querySelector('.btnAirPlay').classList.remove('hide'); @@ -866,7 +869,7 @@ import 'css!assets/css/videoosd'; nowPlayingPositionSlider.value = 0; } - if (runtimeTicks && null != positionTicks && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && 'Recording' !== currentItem.Type) { + if (runtimeTicks && positionTicks != null && currentRuntimeTicks && !enableProgressByTimeOfDay && currentItem.RunTimeTicks && currentItem.Type !== 'Recording') { endsAtText.innerHTML = '  -  ' + mediaInfo.getEndsAtFromPosition(runtimeTicks, positionTicks, true); } else { endsAtText.innerHTML = ''; @@ -887,11 +890,11 @@ import 'css!assets/css/videoosd'; let showMuteButton = true; let showVolumeSlider = true; - if (-1 === supportedCommands.indexOf('Mute')) { + if (supportedCommands.indexOf('Mute') === -1) { showMuteButton = false; } - if (-1 === supportedCommands.indexOf('SetVolume')) { + if (supportedCommands.indexOf('SetVolume') === -1) { showVolumeSlider = false; } @@ -942,7 +945,7 @@ import 'css!assets/css/videoosd'; } function updateTimeText(elem, ticks, divider) { - if (null == ticks) { + if (ticks == null) { elem.innerHTML = ''; return; } @@ -984,9 +987,9 @@ import 'css!assets/css/videoosd'; } function onSettingsOption(selectedOption) { - if ('stats' === selectedOption) { + if (selectedOption === 'stats') { toggleStats(); - } else if ('suboffset' === selectedOption) { + } else if (selectedOption === 'suboffset') { const player = currentPlayer; if (player) { playbackManager.enableShowingSubtitleOffset(player); @@ -1060,7 +1063,7 @@ import 'css!assets/css/videoosd'; const streams = playbackManager.subtitleTracks(player); let currentIndex = playbackManager.getSubtitleStreamIndex(player); - if (null == currentIndex) { + if (currentIndex == null) { currentIndex = -1; } @@ -1131,8 +1134,9 @@ import 'css!assets/css/videoosd'; clickedElement = e.target; const key = keyboardnavigation.getKeyName(e); + const isKeyModified = e.ctrlKey || e.altKey || e.metaKey; - if (!currentVisibleMenu && 32 === e.keyCode) { + if (!currentVisibleMenu && e.keyCode === 32) { playbackManager.playPause(currentPlayer); showOsd(); return; @@ -1235,8 +1239,10 @@ import 'css!assets/css/videoosd'; case '7': case '8': case '9': { - const percent = parseInt(key, 10) * 10; - playbackManager.seekPercent(percent, currentPlayer); + if (!isKeyModified) { + const percent = parseInt(key, 10) * 10; + playbackManager.seekPercent(percent, currentPlayer); + } break; } } diff --git a/src/controllers/session/forgotPassword/index.js b/src/controllers/session/forgotPassword/index.js index ace5a3ec15..368642db35 100644 --- a/src/controllers/session/forgotPassword/index.js +++ b/src/controllers/session/forgotPassword/index.js @@ -3,21 +3,21 @@ import globalize from 'globalize'; /* eslint-disable indent */ function processForgotPasswordResult(result) { - if ('ContactAdmin' == result.Action) { + if (result.Action == 'ContactAdmin') { return void Dashboard.alert({ message: globalize.translate('MessageContactAdminToResetPassword'), title: globalize.translate('HeaderForgotPassword') }); } - if ('InNetworkRequired' == result.Action) { + if (result.Action == 'InNetworkRequired') { return void Dashboard.alert({ message: globalize.translate('MessageForgotPasswordInNetworkRequired'), title: globalize.translate('HeaderForgotPassword') }); } - if ('PinCode' == result.Action) { + if (result.Action == 'PinCode') { let msg = globalize.translate('MessageForgotPasswordFileCreated'); msg += '
'; msg += '
'; diff --git a/src/controllers/shows/episodes.js b/src/controllers/shows/episodes.js index 1e067a7674..5fe70d7be0 100644 --- a/src/controllers/shows/episodes.js +++ b/src/controllers/shows/episodes.js @@ -58,7 +58,7 @@ import 'emby-itemscontainer'; const viewStyle = self.getCurrentViewStyle(); const itemsContainer = tabContent.querySelector('.itemsContainer'); - if ('List' == viewStyle) { + if (viewStyle == 'List') { itemsContainer.classList.add('vertical-list'); itemsContainer.classList.remove('vertical-wrap'); } else { diff --git a/src/controllers/shows/tvgenres.js b/src/controllers/shows/tvgenres.js index 87d3a2e240..3a17fd7997 100644 --- a/src/controllers/shows/tvgenres.js +++ b/src/controllers/shows/tvgenres.js @@ -62,13 +62,13 @@ import 'emby-button'; const elem = entry.target; const id = elem.getAttribute('data-id'); const viewStyle = self.getCurrentViewStyle(); - let limit = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 5 : 9; + let limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9; if (enableScrollX()) { limit = 10; } - const enableImageTypes = 'Thumb' == viewStyle || 'ThumbCard' == viewStyle ? 'Primary,Backdrop,Thumb' : 'Primary'; + const enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 'Primary,Backdrop,Thumb' : 'Primary'; const query = { SortBy: 'SortName', SortOrder: 'Ascending', diff --git a/src/controllers/shows/tvshows.js b/src/controllers/shows/tvshows.js index 1ee70c8f88..281c921e48 100644 --- a/src/controllers/shows/tvshows.js +++ b/src/controllers/shows/tvshows.js @@ -58,7 +58,7 @@ import 'emby-itemscontainer'; const viewStyle = self.getCurrentViewStyle(); const itemsContainer = tabContent.querySelector('.itemsContainer'); - if ('List' == viewStyle) { + if (viewStyle == 'List') { itemsContainer.classList.add('vertical-list'); itemsContainer.classList.remove('vertical-wrap'); } else { diff --git a/src/index.html b/src/index.html index f8d867cb1a..a135079a7d 100644 --- a/src/index.html +++ b/src/index.html @@ -129,7 +129,7 @@ animation: fadein 0.5s; width: 30%; height: 30%; - background-image: url(assets/img/banner-light.png); + background-image: url(assets/img/icon-transparent.png); background-position: center center; background-repeat: no-repeat; background-size: contain; @@ -139,6 +139,14 @@ -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); } + + @media screen + and (min-device-width: 992px) + and (-webkit-min-device-pixel-ratio: 1) { + .splashLogo { + background-image: url(assets/img/banner-light.png); + } + } diff --git a/src/plugins/htmlVideoPlayer/plugin.js b/src/plugins/htmlVideoPlayer/plugin.js index b3b2402c26..d52f0eb5b3 100644 --- a/src/plugins/htmlVideoPlayer/plugin.js +++ b/src/plugins/htmlVideoPlayer/plugin.js @@ -1,15 +1,43 @@ +import browser from 'browser'; +import events from 'events'; +import appHost from 'apphost'; +import loading from 'loading'; +import dom from 'dom'; +import playbackManager from 'playbackManager'; +import appRouter from 'appRouter'; +import connectionManager from 'connectionManager'; +import { + bindEventsToHlsPlayer, + destroyHlsPlayer, + destroyFlvPlayer, + destroyCastPlayer, + getCrossOriginValue, + enableHlsJsPlayer, + applySrc, + playWithPromise, + onEndedInternal, + saveVolume, + seekOnPlaybackStart, + onErrorInternal, + handleHlsJsMediaError, + getSavedVolume, + isValidDuration, + getBufferedRanges +} from 'htmlMediaHelper'; +import itemHelper from 'itemHelper'; +import screenfull from 'screenfull'; +import globalize from 'globalize'; -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'; +/* eslint-disable indent */ - function tryRemoveElement(elem) { - var parentNode = elem.parentNode; +function tryRemoveElement(elem) { + const parentNode = elem.parentNode; if (parentNode) { // Seeing crashes in edge webview try { parentNode.removeChild(elem); } catch (err) { - console.error('error removing dialog element: ' + err); + console.error(`error removing dialog element: ${err}`); } } } @@ -22,7 +50,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } if (browser.firefox) { - if ((currentSrc || '').toLowerCase().indexOf('.m3u8') !== -1) { + if ((currentSrc || '').toLowerCase().includes('.m3u8')) { return false; } } @@ -48,7 +76,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } if (track) { - var format = (track.Codec || '').toLowerCase(); + const format = (track.Codec || '').toLowerCase(); if (format === 'ssa' || format === 'ass') { return false; } @@ -58,7 +86,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } function requireHlsPlayer(callback) { - require(['hlsjs'], function (hls) { + import('hlsjs').then(({default: hls}) => { window.Hls = hls; callback(); }); @@ -84,9 +112,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } function zoomIn(elem) { - return new Promise(function (resolve, reject) { - var duration = 240; - elem.style.animation = 'htmlvideoplayer-zoomin ' + duration + 'ms ease-in normal'; + return new Promise(resolve => { + const duration = 240; + elem.style.animation = `htmlvideoplayer-zoomin ${duration}ms ease-in normal`; hidePrePlaybackPage(); dom.addEventListener(elem, dom.whichAnimationEvent(), resolve, { once: true @@ -95,7 +123,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } function normalizeTrackEventText(text, useHtml) { - var result = text.replace(/\\N/gi, '\n').replace(/\r/gi, ''); + const result = text.replace(/\\N/gi, '\n').replace(/\r/gi, ''); return useHtml ? result.replace(/\n/gi, '
') : result; } @@ -104,7 +132,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return track.Path; } - var url = playbackManager.getSubtitleUrl(track, item.ServerId); + let url = playbackManager.getSubtitleUrl(track, item.ServerId); if (format) { url = url.replace('.vtt', format); } @@ -113,84 +141,189 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } function getDefaultProfile() { - return new Promise(function (resolve, reject) { - require(['browserdeviceprofile'], function (profileBuilder) { - resolve(profileBuilder({})); - }); + return import('browserdeviceprofile').then(({default: profileBuilder}) => { + return profileBuilder({}); }); } - function HtmlVideoPlayer() { - if (browser.edgeUwp) { - this.name = 'Windows Video Player'; - } else { - this.name = 'Html Video Player'; - } + export class HtmlVideoPlayer { + /** + * @type {string} + */ + name + /** + * @type {string} + */ + type = 'mediaplayer'; + /** + * @type {string} + */ + id = 'htmlvideoplayer'; + /** + * Let any players created by plugins take priority + * + * @type {number} + */ + priority = 1; + /** + * @type {boolean} + */ + isFetching = false; - this.type = 'mediaplayer'; - this.id = 'htmlvideoplayer'; + /** + * @type {HTMLDivElement | null | undefined} + */ + #videoDialog; + /** + * @type {number | undefined} + */ + #subtitleTrackIndexToSetOnPlaying; + /** + * @type {number | null} + */ + #audioTrackIndexToSetOnPlaying; + /** + * @type {null | undefined} + */ + #currentClock; + /** + * @type {any | null | undefined} + */ + #currentSubtitlesOctopus; + /** + * @type {null | undefined} + */ + #currentAssRenderer; + /** + * @type {number | undefined} + */ + #customTrackIndex; + /** + * @type {boolean | undefined} + */ + #showTrackOffset; + /** + * @type {number | undefined} + */ + #currentTrackOffset; + /** + * @type {HTMLElement | null | undefined} + */ + #videoSubtitlesElem; + /** + * @type {any | null | undefined} + */ + #currentTrackEvents; + /** + * @type {string[] | undefined} + */ + #supportedFeatures; + /** + * @type {HTMLVideoElement | null | undefined} + */ + #mediaElement; + /** + * @type {number} + */ + #fetchQueue = 0; + /** + * @type {string | undefined} + */ + #currentSrc; + /** + * @type {boolean | undefined} + */ + #started; + /** + * @type {boolean | undefined} + */ + #timeUpdated; + /** + * @type {number | null | undefined} + */ + #currentTime; + /** + * @type {any | undefined} + */ + #flvPlayer; + /** + * @private (used in other files) + * @type {any | undefined} + */ + _hlsPlayer; + /** + * @private (used in other files) + * @type {any | null | undefined} + */ + _castPlayer; + /** + * @private (used in other files) + * @type {any | undefined} + */ + _currentPlayOptions; + /** + * @type {any | undefined} + */ + #lastProfile; + /** + * @type {MutationObserver | IntersectionObserver | undefined} (Unclear observer typing) + */ + #resizeObserver; - // Let any players created by plugins take priority - this.priority = 1; - - var videoDialog; - - var subtitleTrackIndexToSetOnPlaying; - var audioTrackIndexToSetOnPlaying; - - var currentClock; - var currentSubtitlesOctopus; - var currentAssRenderer; - var customTrackIndex = -1; - - var showTrackOffset; - var currentTrackOffset; - - var videoSubtitlesElem; - var currentTrackEvents; - - var self = this; - - self.currentSrc = function () { - return self._currentSrc; - }; - - self._fetchQueue = 0; - self.isFetching = false; - - function incrementFetchQueue() { - if (self._fetchQueue <= 0) { - self.isFetching = true; - events.trigger(self, 'beginFetch'); - } - - self._fetchQueue++; - } - - function decrementFetchQueue() { - self._fetchQueue--; - - if (self._fetchQueue <= 0) { - self.isFetching = false; - events.trigger(self, 'endFetch'); + constructor() { + if (browser.edgeUwp) { + this.name = 'Windows Video Player'; + } else { + this.name = 'Html Video Player'; } } - function updateVideoUrl(streamInfo) { - var isHls = streamInfo.url.toLowerCase().indexOf('.m3u8') !== -1; + currentSrc() { + return this.#currentSrc; + } - var mediaSource = streamInfo.mediaSource; - var item = streamInfo.item; + /** + * @private + */ + incrementFetchQueue() { + if (this.#fetchQueue <= 0) { + this.isFetching = true; + events.trigger(this, 'beginFetch'); + } + + this.#fetchQueue++; + } + + /** + * @private + */ + decrementFetchQueue() { + this.#fetchQueue--; + + if (this.#fetchQueue <= 0) { + this.isFetching = false; + events.trigger(this, 'endFetch'); + } + } + + /** + * @private + */ + updateVideoUrl(streamInfo) { + const isHls = streamInfo.url.toLowerCase().includes('.m3u8'); + + const mediaSource = streamInfo.mediaSource; + const item = streamInfo.item; // Huge hack alert. Safari doesn't seem to like if the segments aren't available right away when playback starts // This will start the transcoding process before actually feeding the video url into the player // Edit: Also seeing stalls from hls.js if (mediaSource && item && !mediaSource.RunTimeTicks && isHls && streamInfo.playMethod === 'Transcode' && (browser.iOS || browser.osx)) { - var hlsPlaylistUrl = streamInfo.url.replace('master.m3u8', 'live.m3u8'); + const hlsPlaylistUrl = streamInfo.url.replace('master.m3u8', 'live.m3u8'); loading.show(); - console.debug('prefetching hls playlist: ' + hlsPlaylistUrl); + console.debug(`prefetching hls playlist: ${hlsPlaylistUrl}`); return connectionManager.getApiClient(item.ServerId).ajax({ @@ -198,42 +331,41 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa url: hlsPlaylistUrl }).then(function () { - console.debug('completed prefetching hls playlist: ' + hlsPlaylistUrl); + console.debug(`completed prefetching hls playlist: ${hlsPlaylistUrl}`); loading.hide(); streamInfo.url = hlsPlaylistUrl; - - return Promise.resolve(); }, function () { - console.error('error prefetching hls playlist: ' + hlsPlaylistUrl); + console.error(`error prefetching hls playlist: ${hlsPlaylistUrl}`); loading.hide(); - return Promise.resolve(); }); } else { return Promise.resolve(); } } - self.play = function (options) { - self._started = false; - self._timeUpdated = false; + play(options) { + this.#started = false; + this.#timeUpdated = false; - self._currentTime = null; + this.#currentTime = null; - self.resetSubtitleOffset(); + this.resetSubtitleOffset(); - return createMediaElement(options).then(function (elem) { - return updateVideoUrl(options).then(function () { - return setCurrentSrc(elem, options); + return this.createMediaElement(options).then(elem => { + return this.updateVideoUrl(options).then(() => { + return this.setCurrentSrc(elem, options); }); }); - }; + } - function setSrcWithFlvJs(instance, elem, options, url) { - return new Promise(function (resolve, reject) { - require(['flvjs'], function (flvjs) { - var flvPlayer = flvjs.createPlayer({ + /** + * @private + */ + setSrcWithFlvJs(elem, options, url) { + return import('flvjs').then(({default: flvjs}) => { + const flvPlayer = flvjs.createPlayer({ type: 'flv', url: url }, @@ -242,117 +374,126 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa lazyLoad: false }); - flvPlayer.attachMediaElement(elem); - flvPlayer.load(); + flvPlayer.attachMediaElement(elem); + flvPlayer.load(); - flvPlayer.play().then(resolve, reject); - instance._flvPlayer = flvPlayer; + this.#flvPlayer = flvPlayer; - // This is needed in setCurrentTrackElement - self._currentSrc = url; - }); + // This is needed in setCurrentTrackElement + this.#currentSrc = url; + + return flvPlayer.play(); }); } - function setSrcWithHlsJs(instance, elem, options, url) { - return new Promise(function (resolve, reject) { - requireHlsPlayer(function () { - var hls = new Hls({ + /** + * @private + */ + setSrcWithHlsJs(elem, options, url) { + return new Promise((resolve, reject) => { + requireHlsPlayer(() => { + const hls = new Hls({ manifestLoadingTimeOut: 20000, - xhrSetup: function(xhr, xhr_url) { + xhrSetup(xhr) { xhr.withCredentials = true; } }); hls.loadSource(url); hls.attachMedia(elem); - htmlMediaHelper.bindEventsToHlsPlayer(self, hls, elem, onError, resolve, reject); + bindEventsToHlsPlayer(this, hls, elem, this.onError, resolve, reject); - self._hlsPlayer = hls; + this._hlsPlayer = hls; // This is needed in setCurrentTrackElement - self._currentSrc = url; + this.#currentSrc = url; }); }); } - function setCurrentSrc(elem, options) { - elem.removeEventListener('error', onError); + /** + * @private + */ + setCurrentSrc(elem, options) { + elem.removeEventListener('error', this.onError); - var val = options.url; - console.debug('playing url: ' + val); + let val = options.url; + console.debug(`playing url: ${val}`); // Convert to seconds - var seconds = (options.playerStartPositionTicks || 0) / 10000000; + const seconds = (options.playerStartPositionTicks || 0) / 10000000; if (seconds) { - val += '#t=' + seconds; + val += `#t=${seconds}`; } - htmlMediaHelper.destroyHlsPlayer(self); - htmlMediaHelper.destroyFlvPlayer(self); - htmlMediaHelper.destroyCastPlayer(self); + destroyHlsPlayer(this); + destroyFlvPlayer(this); + destroyCastPlayer(this); - subtitleTrackIndexToSetOnPlaying = options.mediaSource.DefaultSubtitleStreamIndex == null ? -1 : options.mediaSource.DefaultSubtitleStreamIndex; - if (subtitleTrackIndexToSetOnPlaying != null && subtitleTrackIndexToSetOnPlaying >= 0) { - var initialSubtitleStream = options.mediaSource.MediaStreams[subtitleTrackIndexToSetOnPlaying]; + this.#subtitleTrackIndexToSetOnPlaying = options.mediaSource.DefaultSubtitleStreamIndex == null ? -1 : options.mediaSource.DefaultSubtitleStreamIndex; + if (this.#subtitleTrackIndexToSetOnPlaying != null && this.#subtitleTrackIndexToSetOnPlaying >= 0) { + const initialSubtitleStream = options.mediaSource.MediaStreams[this.#subtitleTrackIndexToSetOnPlaying]; if (!initialSubtitleStream || initialSubtitleStream.DeliveryMethod === 'Encode') { - subtitleTrackIndexToSetOnPlaying = -1; + this.#subtitleTrackIndexToSetOnPlaying = -1; } } - audioTrackIndexToSetOnPlaying = options.playMethod === 'Transcode' ? null : options.mediaSource.DefaultAudioStreamIndex; + this.#audioTrackIndexToSetOnPlaying = options.playMethod === 'Transcode' ? null : options.mediaSource.DefaultAudioStreamIndex; - self._currentPlayOptions = options; + this._currentPlayOptions = options; - var crossOrigin = htmlMediaHelper.getCrossOriginValue(options.mediaSource); + const crossOrigin = getCrossOriginValue(options.mediaSource); if (crossOrigin) { elem.crossOrigin = crossOrigin; } - if (htmlMediaHelper.enableHlsJsPlayer(options.mediaSource.RunTimeTicks, 'Video') && val.indexOf('.m3u8') !== -1) { - return setSrcWithHlsJs(self, elem, options, val); + if (enableHlsJsPlayer(options.mediaSource.RunTimeTicks, 'Video') && val.includes('.m3u8')) { + return this.setSrcWithHlsJs(elem, options, val); } else if (options.playMethod !== 'Transcode' && options.mediaSource.Container === 'flv') { - return setSrcWithFlvJs(self, elem, options, val); + return this.setSrcWithFlvJs(elem, options, val); } else { elem.autoplay = true; // Safari will not send cookies without this elem.crossOrigin = 'use-credentials'; - return htmlMediaHelper.applySrc(elem, val, options).then(function () { - self._currentSrc = val; + return applySrc(elem, val, options).then(() => { + this.#currentSrc = val; - return htmlMediaHelper.playWithPromise(elem, onError); + return playWithPromise(elem, this.onError); }); } } - self.setSubtitleStreamIndex = function (index) { - setCurrentTrackElement(index); - }; + setSubtitleStreamIndex(index) { + this.setCurrentTrackElement(index); + } - self.resetSubtitleOffset = function() { - currentTrackOffset = 0; - showTrackOffset = false; - }; + resetSubtitleOffset() { + this.#currentTrackOffset = 0; + this.#showTrackOffset = false; + } - self.enableShowingSubtitleOffset = function() { - showTrackOffset = true; - }; + enableShowingSubtitleOffset() { + this.#showTrackOffset = true; + } - self.disableShowingSubtitleOffset = function() { - showTrackOffset = false; - }; + disableShowingSubtitleOffset() { + this.#showTrackOffset = false; + } - self.isShowingSubtitleOffsetEnabled = function() { - return showTrackOffset; - }; + isShowingSubtitleOffsetEnabled() { + return this.#showTrackOffset; + } - function getTextTrack() { - var videoElement = self._mediaElement; + /** + * @private + */ + getTextTrack() { + const videoElement = this.#mediaElement; if (videoElement) { return Array.from(videoElement.textTracks) - .find(function(trackElement) { + .find(function (trackElement) { // get showing .vtt textTack return trackElement.mode === 'showing'; }); @@ -361,64 +502,79 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } } - self.setSubtitleOffset = function(offset) { - var offsetValue = parseFloat(offset); + /** + * @private + */ + setSubtitleOffset(offset) { + const offsetValue = parseFloat(offset); // if .ass currently rendering - if (currentSubtitlesOctopus) { - updateCurrentTrackOffset(offsetValue); - currentSubtitlesOctopus.timeOffset = (self._currentPlayOptions.transcodingOffsetTicks || 0) / 10000000 + offsetValue; + if (this.#currentSubtitlesOctopus) { + this.updateCurrentTrackOffset(offsetValue); + this.#currentSubtitlesOctopus.timeOffset = (this._currentPlayOptions.transcodingOffsetTicks || 0) / 10000000 + offsetValue; } else { - var trackElement = getTextTrack(); + const trackElement = this.getTextTrack(); // if .vtt currently rendering if (trackElement) { - setTextTrackSubtitleOffset(trackElement, offsetValue); - } else if (currentTrackEvents) { - setTrackEventsSubtitleOffset(currentTrackEvents, offsetValue); + this.setTextTrackSubtitleOffset(trackElement, offsetValue); + } else if (this.#currentTrackEvents) { + this.setTrackEventsSubtitleOffset(this.#currentTrackEvents, offsetValue); } else { console.debug('No available track, cannot apply offset: ', offsetValue); } } - }; + } - function updateCurrentTrackOffset(offsetValue) { - var relativeOffset = offsetValue; - var newTrackOffset = offsetValue; - if (currentTrackOffset) { - relativeOffset -= currentTrackOffset; + /** + * @private + */ + updateCurrentTrackOffset(offsetValue) { + let relativeOffset = offsetValue; + const newTrackOffset = offsetValue; + if (this.#currentTrackOffset) { + relativeOffset -= this.#currentTrackOffset; } - currentTrackOffset = newTrackOffset; + this.#currentTrackOffset = newTrackOffset; // relative to currentTrackOffset return relativeOffset; } - function setTextTrackSubtitleOffset(currentTrack, offsetValue) { + /** + * @private + */ + setTextTrackSubtitleOffset(currentTrack, offsetValue) { if (currentTrack.cues) { - offsetValue = updateCurrentTrackOffset(offsetValue); + offsetValue = this.updateCurrentTrackOffset(offsetValue); Array.from(currentTrack.cues) - .forEach(function(cue) { + .forEach(function (cue) { cue.startTime -= offsetValue; cue.endTime -= offsetValue; }); } } - function setTrackEventsSubtitleOffset(trackEvents, offsetValue) { + /** + * @private + */ + setTrackEventsSubtitleOffset(trackEvents, offsetValue) { if (Array.isArray(trackEvents)) { - offsetValue = updateCurrentTrackOffset(offsetValue) * 1e7; // ticks - trackEvents.forEach(function(trackEvent) { + offsetValue = this.updateCurrentTrackOffset(offsetValue) * 1e7; // ticks + trackEvents.forEach(function (trackEvent) { trackEvent.StartPositionTicks -= offsetValue; trackEvent.EndPositionTicks -= offsetValue; }); } } - self.getSubtitleOffset = function() { - return currentTrackOffset; - }; + getSubtitleOffset() { + return this.#currentTrackOffset; + } - function isAudioStreamSupported(stream, deviceProfile) { - var codec = (stream.Codec || '').toLowerCase(); + /** + * @private + */ + isAudioStreamSupported(stream, deviceProfile) { + const codec = (stream.Codec || '').toLowerCase(); if (!codec) { return true; @@ -429,7 +585,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return true; } - var profiles = deviceProfile.DirectPlayProfiles || []; + const profiles = deviceProfile.DirectPlayProfiles || []; return profiles.filter(function (p) { if (p.Type === 'Video') { @@ -437,37 +593,35 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return true; } - return p.AudioCodec.toLowerCase().indexOf(codec) !== -1; + return p.AudioCodec.toLowerCase().includes(codec); } return false; }).length > 0; } - function getSupportedAudioStreams() { - var profile = self._lastProfile; + /** + * @private + */ + getSupportedAudioStreams() { + const profile = this.#lastProfile; - return getMediaStreamAudioTracks(self._currentPlayOptions.mediaSource).filter(function (stream) { - return isAudioStreamSupported(stream, profile); + return getMediaStreamAudioTracks(this._currentPlayOptions.mediaSource).filter((stream) => { + return this.isAudioStreamSupported(stream, profile); }); } - self.setAudioStreamIndex = function (index) { - var streams = getSupportedAudioStreams(); + setAudioStreamIndex(index) { + const streams = this.getSupportedAudioStreams(); if (streams.length < 2) { // If there's only one supported stream then trust that the player will handle it on it's own return; } - var audioIndex = -1; - var i; - var length; - var stream; - - for (i = 0, length = streams.length; i < length; i++) { - stream = streams[i]; + let audioIndex = -1; + for (const stream of streams) { audioIndex++; if (stream.Index === index) { @@ -479,204 +633,272 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return; } - var elem = self._mediaElement; + const elem = this.#mediaElement; if (!elem) { return; } - // https://msdn.microsoft.com/en-us/library/hh772507(v=vs.85).aspx + // https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/audioTracks - var elemAudioTracks = elem.audioTracks || []; - console.debug('found ' + elemAudioTracks.length + ' audio tracks'); + /** + * @type {ArrayLike|any[]} + */ + const elemAudioTracks = elem.audioTracks || []; + console.debug(`found ${elemAudioTracks.length} audio tracks`); - for (i = 0, length = elemAudioTracks.length; i < length; i++) { + for (const [i, audioTrack] of Array.from(elemAudioTracks).entries()) { if (audioIndex === i) { - console.debug('setting audio track ' + i + ' to enabled'); - elemAudioTracks[i].enabled = true; + console.debug(`setting audio track ${i} to enabled`); + audioTrack.enabled = true; } else { - console.debug('setting audio track ' + i + ' to disabled'); - elemAudioTracks[i].enabled = false; + console.debug(`setting audio track ${i} to disabled`); + audioTrack.enabled = false; } } - }; + } - self.stop = function (destroyPlayer) { - var elem = self._mediaElement; - var src = self._currentSrc; + stop(destroyPlayer) { + const elem = this.#mediaElement; + const src = this.#currentSrc; if (elem) { if (src) { elem.pause(); } - htmlMediaHelper.onEndedInternal(self, elem, onError); + onEndedInternal(this, elem, this.onError); if (destroyPlayer) { - self.destroy(); + this.destroy(); } } - destroyCustomTrack(elem); + this.destroyCustomTrack(elem); return Promise.resolve(); - }; + } - self.destroy = function () { - htmlMediaHelper.destroyHlsPlayer(self); - htmlMediaHelper.destroyFlvPlayer(self); + destroy() { + destroyHlsPlayer(this); + destroyFlvPlayer(this); appRouter.setTransparency('none'); - var videoElement = self._mediaElement; + const videoElement = this.#mediaElement; if (videoElement) { - self._mediaElement = null; + this.#mediaElement = null; - destroyCustomTrack(videoElement); - videoElement.removeEventListener('timeupdate', onTimeUpdate); - videoElement.removeEventListener('ended', onEnded); - videoElement.removeEventListener('volumechange', onVolumeChange); - videoElement.removeEventListener('pause', onPause); - videoElement.removeEventListener('playing', onPlaying); - videoElement.removeEventListener('play', onPlay); - videoElement.removeEventListener('click', onClick); - videoElement.removeEventListener('dblclick', onDblClick); - videoElement.removeEventListener('waiting', onWaiting); + this.destroyCustomTrack(videoElement); + videoElement.removeEventListener('timeupdate', this.onTimeUpdate); + videoElement.removeEventListener('ended', this.onEnded); + videoElement.removeEventListener('volumechange', this.onVolumeChange); + videoElement.removeEventListener('pause', this.onPause); + videoElement.removeEventListener('playing', this.onPlaying); + videoElement.removeEventListener('play', this.onPlay); + videoElement.removeEventListener('click', this.onClick); + videoElement.removeEventListener('dblclick', this.onDblClick); + videoElement.removeEventListener('waiting', this.onWaiting); videoElement.parentNode.removeChild(videoElement); } - var dlg = videoDialog; + const dlg = this.#videoDialog; if (dlg) { - videoDialog = null; + this.#videoDialog = null; dlg.parentNode.removeChild(dlg); } if (screenfull.isEnabled) { screenfull.exit(); + } else { + // iOS Safari + if (document.webkitIsFullScreen && document.webkitCancelFullscreen) { + document.webkitCancelFullscreen(); + } } - }; - - function onEnded() { - destroyCustomTrack(this); - htmlMediaHelper.onEndedInternal(self, this, onError); } - function onTimeUpdate(e) { - // get the player position and the transcoding offset - var time = this.currentTime; + /** + * @private + * @param e {Event} The event received from the `
'; diff --git a/src/scripts/libraryMenu.js b/src/scripts/libraryMenu.js index 961d89dc05..d2a68cd6e3 100644 --- a/src/scripts/libraryMenu.js +++ b/src/scripts/libraryMenu.js @@ -309,7 +309,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } function isUrlInCurrentView(url) { - return -1 !== window.location.href.toString().toLowerCase().indexOf(url.toLowerCase()); + return window.location.href.toString().toLowerCase().indexOf(url.toLowerCase()) !== -1; } function updateDashboardMenuSelectedItem() { @@ -323,7 +323,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' if (pageIds) { pageIds = pageIds.split('|'); - selected = -1 != pageIds.indexOf(currentViewId); + selected = pageIds.indexOf(currentViewId) != -1; } var pageUrls = link.getAttribute('data-pageurls'); @@ -545,7 +545,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' var view = items[i]; list.push(view); - if ('livetv' == view.CollectionType) { + if (view.CollectionType == 'livetv') { view.ImageTags = {}; view.icon = 'live_tv'; var guideView = Object.assign({}, view); @@ -604,12 +604,10 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' var icon = i.icon || imageHelper.getLibraryIcon(i.CollectionType); var itemId = i.Id; - const linkHtml = ` + return ` ${i.Name} `; - - return linkHtml; }).join(''); libraryMenuOptions.innerHTML = html; var elem = libraryMenuOptions; @@ -673,15 +671,15 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' var lnkMediaFolder = elems[i]; var itemId = lnkMediaFolder.getAttribute('data-itemid'); - if (isChannelsPage && 'channels' === itemId) { + if (isChannelsPage && itemId === 'channels') { lnkMediaFolder.classList.add('navMenuOption-selected'); - } else if (isLiveTvPage && 'livetv' === itemId) { + } else if (isLiveTvPage && itemId === 'livetv') { lnkMediaFolder.classList.add('navMenuOption-selected'); - } else if (isEditorPage && 'editor' === itemId) { + } else if (isEditorPage && itemId === 'editor') { lnkMediaFolder.classList.add('navMenuOption-selected'); - } else if (isMySyncPage && 'manageoffline' === itemId && -1 != window.location.href.toString().indexOf('mode=download')) { + } else if (isMySyncPage && itemId === 'manageoffline' && window.location.href.toString().indexOf('mode=download') != -1) { lnkMediaFolder.classList.add('navMenuOption-selected'); - } else if (isMySyncPage && 'syncotherdevices' === itemId && -1 == window.location.href.toString().indexOf('mode=download')) { + } else if (isMySyncPage && itemId === 'syncotherdevices' && window.location.href.toString().indexOf('mode=download') == -1) { lnkMediaFolder.classList.add('navMenuOption-selected'); } else if (id && itemId == id) { lnkMediaFolder.classList.add('navMenuOption-selected'); @@ -755,7 +753,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } if (headerBackButton) { - if ('false' !== page.getAttribute('data-backbutton') && appRouter.canGoBack()) { + if (page.getAttribute('data-backbutton') !== 'false' && appRouter.canGoBack()) { headerBackButton.classList.remove('hide'); } else { headerBackButton.classList.add('hide'); @@ -865,11 +863,11 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' document.title = 'Jellyfin'; }, setTitle: function (title) { - if (null == title) { + if (title == null) { return void LibraryMenu.setDefaultTitle(); } - if ('-' === title) { + if (title === '-') { title = ''; } @@ -924,7 +922,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', ' } } - if ('library' !== currentDrawerType) { + if (currentDrawerType !== 'library') { refreshLibraryDrawer(); } } diff --git a/src/scripts/mouseManager.js b/src/scripts/mouseManager.js index 4fc174381a..d801d82393 100644 --- a/src/scripts/mouseManager.js +++ b/src/scripts/mouseManager.js @@ -31,6 +31,22 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd } } + function showCursor() { + if (isMouseIdle) { + isMouseIdle = false; + removeIdleClasses(); + events.trigger(self, 'mouseactive'); + } + } + + function hideCursor() { + if (!isMouseIdle) { + isMouseIdle = true; + addIdleClasses(); + events.trigger(self, 'mouseidle'); + } + } + var lastPointerMoveData; function onPointerMove(e) { var eventX = e.screenX; @@ -61,11 +77,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd lastMouseInputTime = new Date().getTime(); notifyApp(); - if (isMouseIdle) { - isMouseIdle = false; - removeIdleClasses(); - events.trigger(self, 'mouseactive'); - } + showCursor(); } function onPointerEnter(e) { @@ -99,9 +111,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd function onMouseInterval() { if (!isMouseIdle && mouseIdleTime() >= 5000) { - isMouseIdle = true; - addIdleClasses(); - events.trigger(self, 'mouseidle'); + hideCursor(); } } @@ -157,5 +167,8 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd events.on(layoutManager, 'modechange', initMouse); + self.hideCursor = hideCursor; + self.showCursor = showCursor; + return self; }); diff --git a/src/scripts/playlists.js b/src/scripts/playlists.js index 123d1c7859..bdfd155c55 100644 --- a/src/scripts/playlists.js +++ b/src/scripts/playlists.js @@ -60,7 +60,7 @@ export default function (view, params) { const viewStyle = getPageData(view).view; const itemsContainer = view.querySelector('.itemsContainer'); - if ('List' == viewStyle) { + if (viewStyle == 'List') { itemsContainer.classList.add('vertical-list'); itemsContainer.classList.remove('vertical-wrap'); } else { diff --git a/src/scripts/site.js b/src/scripts/site.js index 2beb45959a..f1b49f6342 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -6,7 +6,7 @@ function getWindowLocationSearch(win) { if (!search) { var index = window.location.href.indexOf('?'); - if (-1 != index) { + if (index != -1) { search = window.location.href.substring(index); } } @@ -22,7 +22,7 @@ window.getParameterByName = function (name, url) { var regex = new RegExp(regexS, 'i'); var results = regex.exec(url || getWindowLocationSearch()); - if (null == results) { + if (results == null) { return ''; } @@ -73,7 +73,7 @@ var Dashboard = { var urlLower = window.location.href.toLowerCase(); var index = urlLower.lastIndexOf('/web'); - if (-1 != index) { + if (index != -1) { return urlLower.substring(0, index); } @@ -178,7 +178,7 @@ var Dashboard = { }); }, alert: function (options) { - if ('string' == typeof options) { + if (typeof options == 'string') { return void require(['toast'], function (toast) { toast({ text: options @@ -197,7 +197,7 @@ var Dashboard = { var capabilities = { PlayableMediaTypes: ['Audio', 'Video'], SupportedCommands: ['MoveUp', 'MoveDown', 'MoveLeft', 'MoveRight', 'PageUp', 'PageDown', 'PreviousLetter', 'NextLetter', 'ToggleOsd', 'ToggleContextMenu', 'Select', 'Back', 'SendKey', 'SendString', 'GoHome', 'GoToSettings', 'VolumeUp', 'VolumeDown', 'Mute', 'Unmute', 'ToggleMute', 'SetVolume', 'SetAudioStreamIndex', 'SetSubtitleStreamIndex', 'DisplayContent', 'GoToSearch', 'DisplayMessage', 'SetRepeatMode', 'SetShuffleQueue', 'ChannelUp', 'ChannelDown', 'PlayMediaSource', 'PlayTrailers'], - SupportsPersistentIdentifier: 'cordova' === self.appMode || 'android' === self.appMode, + SupportsPersistentIdentifier: self.appMode === 'cordova' || self.appMode === 'android', SupportsMediaControl: true }; appHost.getPushTokenInfo(); @@ -452,8 +452,8 @@ function initClient() { } function onGlobalizeInit(browser, globalize) { - if ('android' === self.appMode) { - if (-1 !== self.location.href.toString().toLowerCase().indexOf('start=backgroundsync')) { + if (self.appMode === 'android') { + if (self.location.href.toString().toLowerCase().indexOf('start=backgroundsync') !== -1) { return onAppReady(browser); } } @@ -863,7 +863,7 @@ function initClient() { }); define('appRouter', [componentsPath + '/appRouter', 'itemHelper'], function (appRouter, itemHelper) { function showItem(item, serverId, options) { - if ('string' == typeof item) { + if (typeof item == 'string') { require(['connectionManager'], function (connectionManager) { var apiClient = connectionManager.currentApiClient(); apiClient.getItem(apiClient.getCurrentUserId(), item).then(function (item) { @@ -871,7 +871,7 @@ function initClient() { }); }); } else { - if (2 == arguments.length) { + if (arguments.length == 2) { options = arguments[1]; } @@ -953,27 +953,27 @@ function initClient() { var itemType = item.Type || (options ? options.itemType : null); var serverId = item.ServerId || options.serverId; - if ('settings' === item) { + if (item === 'settings') { return 'mypreferencesmenu.html'; } - if ('wizard' === item) { + if (item === 'wizard') { return 'wizardstart.html'; } - if ('manageserver' === item) { + if (item === 'manageserver') { return 'dashboard.html'; } - if ('recordedtv' === item) { + if (item === 'recordedtv') { return 'livetv.html?tab=3&serverId=' + options.serverId; } - if ('nextup' === item) { + if (item === 'nextup') { return 'list.html?type=nextup&serverId=' + options.serverId; } - if ('list' === item) { + if (item === 'list') { var url = 'list.html?serverId=' + options.serverId + '&type=' + options.itemTypes; if (options.isFavorite) { @@ -983,61 +983,61 @@ function initClient() { return url; } - if ('livetv' === item) { - if ('programs' === options.section) { + if (item === 'livetv') { + if (options.section === 'programs') { return 'livetv.html?tab=0&serverId=' + options.serverId; } - if ('guide' === options.section) { + if (options.section === 'guide') { return 'livetv.html?tab=1&serverId=' + options.serverId; } - if ('movies' === options.section) { + if (options.section === 'movies') { return 'list.html?type=Programs&IsMovie=true&serverId=' + options.serverId; } - if ('shows' === options.section) { + if (options.section === 'shows') { return 'list.html?type=Programs&IsSeries=true&IsMovie=false&IsNews=false&serverId=' + options.serverId; } - if ('sports' === options.section) { + if (options.section === 'sports') { return 'list.html?type=Programs&IsSports=true&serverId=' + options.serverId; } - if ('kids' === options.section) { + if (options.section === 'kids') { return 'list.html?type=Programs&IsKids=true&serverId=' + options.serverId; } - if ('news' === options.section) { + if (options.section === 'news') { return 'list.html?type=Programs&IsNews=true&serverId=' + options.serverId; } - if ('onnow' === options.section) { + if (options.section === 'onnow') { return 'list.html?type=Programs&IsAiring=true&serverId=' + options.serverId; } - if ('dvrschedule' === options.section) { + if (options.section === 'dvrschedule') { return 'livetv.html?tab=4&serverId=' + options.serverId; } - if ('seriesrecording' === options.section) { + if (options.section === 'seriesrecording') { return 'livetv.html?tab=5&serverId=' + options.serverId; } return 'livetv.html?serverId=' + options.serverId; } - if ('SeriesTimer' == itemType) { + if (itemType == 'SeriesTimer') { return 'details?seriesTimerId=' + id + '&serverId=' + serverId; } - if ('livetv' == item.CollectionType) { + if (item.CollectionType == 'livetv') { return 'livetv.html'; } - if ('Genre' === item.Type) { + if (item.Type === 'Genre') { url = 'list.html?genreId=' + item.Id + '&serverId=' + serverId; - if ('livetv' === context) { + if (context === 'livetv') { url += '&type=Programs'; } @@ -1048,7 +1048,7 @@ function initClient() { return url; } - if ('MusicGenre' === item.Type) { + if (item.Type === 'MusicGenre') { url = 'list.html?musicGenreId=' + item.Id + '&serverId=' + serverId; if (options.parentId) { @@ -1058,7 +1058,7 @@ function initClient() { return url; } - if ('Studio' === item.Type) { + if (item.Type === 'Studio') { url = 'list.html?studioId=' + item.Id + '&serverId=' + serverId; if (options.parentId) { @@ -1068,28 +1068,28 @@ function initClient() { return url; } - if ('folders' !== context && !itemHelper.isLocalItem(item)) { - if ('movies' == item.CollectionType) { + if (context !== 'folders' && !itemHelper.isLocalItem(item)) { + if (item.CollectionType == 'movies') { url = 'movies.html?topParentId=' + item.Id; - if (options && 'latest' === options.section) { + if (options && options.section === 'latest') { url += '&tab=1'; } return url; } - if ('tvshows' == item.CollectionType) { + if (item.CollectionType == 'tvshows') { url = 'tv.html?topParentId=' + item.Id; - if (options && 'latest' === options.section) { + if (options && options.section === 'latest') { url += '&tab=2'; } return url; } - if ('music' == item.CollectionType) { + if (item.CollectionType == 'music') { return 'music.html?topParentId=' + item.Id; } } @@ -1102,7 +1102,7 @@ function initClient() { var contextSuffix = context ? '&context=' + context : ''; - if ('Series' == itemType || 'Season' == itemType || 'Episode' == itemType) { + if (itemType == 'Series' || itemType == 'Season' || itemType == 'Episode') { return 'details?id=' + id + contextSuffix + '&serverId=' + serverId; } diff --git a/src/scripts/themeLoader.js b/src/scripts/themeLoader.js index 3a3a60e565..f7b78e70ab 100644 --- a/src/scripts/themeLoader.js +++ b/src/scripts/themeLoader.js @@ -13,7 +13,7 @@ pageClassOn('viewbeforeshow', 'page', function () { var theme; var context; - if ('a' === viewType) { + if (viewType === 'a') { theme = userSettings.dashboardTheme(); context = 'serverdashboard'; } else { diff --git a/src/strings/cs.json b/src/strings/cs.json index 4e46cebca3..dac9109dbf 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -232,7 +232,7 @@ "HeaderAccessScheduleHelp": "Vytvořte plán přístupu pro limitování přístupu jen určitém čase.", "HeaderActiveDevices": "Aktivní zařízení", "HeaderActiveRecordings": "Aktivní nahrávání", - "HeaderActivity": "Aktivity", + "HeaderActivity": "Aktivita", "HeaderAddScheduledTaskTrigger": "Přidat Spouštěč", "HeaderAddToCollection": "Přidat do Kolekce", "HeaderAddToPlaylist": "Přidat do playlistu", @@ -244,14 +244,14 @@ "HeaderAlbums": "Alba", "HeaderAlert": "Upozornění", "HeaderApiKey": "Klíč Api", - "HeaderApiKeys": "Klíče Api", + "HeaderApiKeys": "Klíče API", "HeaderApiKeysHelp": "Externí aplikace musí mít klíč k API, aby mohly komunikovat se serverem Jellyfin. Klíče jsou vydávány přihlášením k účtu Jellyfin nebo ruční žádostí o klíč.", "HeaderApp": "Aplikace", "HeaderAudioBooks": "Audio knihy", "HeaderAudioSettings": "Nastavení zvuku", "HeaderAutomaticUpdates": "Automatické aktualizace", "HeaderBooks": "Knihy", - "HeaderBranding": "Značkování", + "HeaderBranding": "Branding", "HeaderCancelRecording": "Zrušit nahrávání", "HeaderCancelSeries": "Ukončit Seriál", "HeaderCastAndCrew": "Herci a obsazení", @@ -578,7 +578,7 @@ "LabelLocalHttpServerPortNumber": "Lokální HTTP port:", "LabelLocalHttpServerPortNumberHelp": "Číslo portu TCP, ke kterému by se měl HTTP server Jellyfin připojit.", "LabelLockItemToPreventChanges": "Uzamknout položku pro zabránění budoucích změn", - "LabelLoginDisclaimer": "Zřeknutí se následujících práv při přihlášení:", + "LabelLoginDisclaimer": "Zřeknutí se zodpovědnosti při přihlášení:", "LabelLoginDisclaimerHelp": "Zpráva, která se zobrazí v dolní části přihlašovací stránky.", "LabelLogs": "Záznamy:", "LabelManufacturer": "Výrobce:", @@ -1070,7 +1070,7 @@ "Screenshots": "Snímky obrazovky", "Search": "Vyhledávání", "SearchForCollectionInternetMetadata": "Vyhledat metadata a obrázky na Internetu", - "SearchForMissingMetadata": "Hledání chybějících metadat", + "SearchForMissingMetadata": "Hledat chybějící metadata", "SearchForSubtitles": "Vyhledat titulky", "SearchResults": "Výsledky vyhledávání", "SendMessage": "Poslat zprávu", @@ -1129,7 +1129,7 @@ "TabMusic": "Hudba", "TabMusicVideos": "Hudební videa", "TabMyPlugins": "Moje zásuvné moduly", - "TabNetworks": "Sítě", + "TabNetworks": "Stanice", "TabNfoSettings": "NFO nastavení", "TabNotifications": "Oznámení", "TabOther": "Další", @@ -1152,7 +1152,7 @@ "TabSuggestions": "Návrhy", "TabTrailers": "Upoutávky", "TabTranscoding": "Překódování", - "TabUpcoming": "Nové", + "TabUpcoming": "Nadcházející", "TabUsers": "Uživatelé", "Tags": "Tagy", "TellUsAboutYourself": "Řekněte nám něco o sobě", @@ -1505,7 +1505,7 @@ "MusicArtist": "Interpret", "MusicVideo": "Videoklip", "SubtitleOffset": "Nastavení titulků", - "TabNetworking": "Vytváření sítí", + "TabNetworking": "Síť", "MusicLibraryHelp": "Prostudujte si {0}průvodce pojmenováním hudby{1}.", "MoreMediaInfo": "Informace o médiu", "LabelVideoBitrate": "Datový tok videa:", @@ -1524,7 +1524,7 @@ "LabelAudioBitrate": "Datový tok zvuku:", "LabelAudioBitDepth": "Bitová hloubka zvuku:", "HeaderFavoriteBooks": "Oblíbené knihy", - "FetchingData": "Načtení dalších dat", + "FetchingData": "Načítání dalších dat", "CopyStreamURLSuccess": "Úspěšně zkopírovaná URL.", "CopyStreamURL": "Kopírovat URL adresu streamu", "ButtonAddImage": "Přidat obrázek", @@ -1565,7 +1565,7 @@ "EveryXMinutes": "Každých {0} minut", "OnWakeFromSleep": "Při probuzení", "DailyAt": "Denně v {0}", - "PersonRole": "jako {0}", + "PersonRole": "{0}", "ListPaging": "{0}-{1} ze {2}", "WriteAccessRequired": "Server Jellyfin vyžaduje oprávnění pro zápis do této složky. Zkontrolujte oprávnění a zkuste to znovu.", "PathNotFound": "Cesta nebyla nalezena. Zkontrolujte, zda je platná a zkuste to znovu.", @@ -1652,5 +1652,7 @@ "Writers": "Scénáristé", "ClearQueue": "Vymazat frontu", "StopPlayback": "Zastavit přehrávání", - "ViewAlbumArtist": "Zobrazit interpreta alba" + "ViewAlbumArtist": "Zobrazit interpreta alba", + "PreviousTrack": "Předchozí", + "NextTrack": "Další" } diff --git a/src/strings/de.json b/src/strings/de.json index d7ef74e942..1f7374c4e3 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -428,7 +428,7 @@ "HeaderSortBy": "Sortiert nach", "HeaderSortOrder": "Sortierreihenfolge", "HeaderSpecialEpisodeInfo": "Spezialepisoden Information", - "HeaderSpecialFeatures": "Sonderfunktionen", + "HeaderSpecialFeatures": "Extras", "HeaderStartNow": "Starte jetzt", "HeaderStopRecording": "Aufnahme stoppen", "HeaderSubtitleAppearance": "Untertiteldarstellung", diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 6024363f05..92daf3ebd5 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1094,6 +1094,7 @@ "NewEpisodesOnly": "New episodes only", "News": "News", "Next": "Next", + "NextTrack": "Skip to next", "NextUp": "Next Up", "No": "No", "NoCreatedLibraries": "Seems like you haven't created any libraries yet. {0}Would you like to create one now?{1}", @@ -1307,6 +1308,7 @@ "Premiere": "Premiere", "Premieres": "Premieres", "Previous": "Previous", + "PreviousTrack": "Skip to previous", "Primary": "Primary", "Producer": "Producer", "ProductionLocations": "Production locations", diff --git a/src/strings/es_419.json b/src/strings/es_419.json index d730a75b9e..1cf6a3f07c 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -352,7 +352,7 @@ "MessageSyncPlayGroupDoesNotExist": "Fallo al unirse al grupo porque éste no existe.", "MessageSyncPlayPlaybackPermissionRequired": "Permiso de reproducción requerido.", "MessageSyncPlayNoGroupsAvailable": "No hay grupos disponibles. Empieza a reproducir algo primero.", - "MessageSyncPlayGroupWait": "{0} está cargando...", + "MessageSyncPlayGroupWait": "{0} está cargando…", "MessageSyncPlayUserLeft": "{0} abandonó el grupo.", "MessageSyncPlayUserJoined": "{0} se ha unido al grupo.", "MessageSyncPlayDisabled": "SyncPlay deshabilitado.", diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index ee28cbec81..b5404b8480 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -50,7 +50,7 @@ "TabGenres": "Zvrsti", "TabLatest": "Zadnje", "TabMusic": "Glasba", - "TabMyPlugins": "Moji Vticniki", + "TabMyPlugins": "Moji dodatki", "TabNetworks": "Omrezja", "TabPassword": "Geslo", "TabPlaylist": "Playlista", @@ -70,7 +70,7 @@ "AddToPlayQueue": "Dodaj v čakalno vrsto", "AddToPlaylist": "Dodaj na seznam predvajanja", "AddedOnValue": "Dodano {0}", - "AdditionalNotificationServices": "Prebrskaj katalog dodatkov za namestitev dodatnih storitev obveščanja.", + "AdditionalNotificationServices": "Prebrskajte katalog dodatkov za namestitev dodatnih storitev obveščanja.", "AirDate": "Datum predvajanja", "Aired": "Predvajano", "Albums": "Albumi", @@ -135,7 +135,7 @@ "Box": "Ovitek", "BoxRear": "Ovitek (zadnja stran)", "Browse": "Brskaj", - "BrowsePluginCatalogMessage": "Poišči razpoložljive dodatke v našem katalogu.", + "BrowsePluginCatalogMessage": "Poiščite razpoložljive dodatke v našem katalogu.", "BurnSubtitlesHelp": "Določi ali naj strežnik vžge podnapise pri prekodiranju videa. Izogibanje temu lahko občutno izboljša delovanje strežnika. Izberite Samodejno za vžig slikovnih formatov podnapisov (VOBSUB, PGS, SUB, IDX, ...) in nekaterih ASS oziroma SSA podnapisov.", "ButtonAccept": "Sprejmi", "ButtonAdd": "Dodaj", @@ -343,7 +343,7 @@ "HeaderMyMediaSmall": "Moja predstavnost (majhno)", "HeaderMyMedia": "Moja predstavnost", "HeaderMyDevice": "Moja naprava", - "HeaderMusicVideos": "Glasbeni videi", + "HeaderMusicVideos": "Videospoti", "HeaderMusicQuality": "Kvaliteta glasbe", "HeaderMovies": "Filmi", "HeaderMoreLikeThis": "Podobno", @@ -410,7 +410,7 @@ "HeaderConnectToServer": "Poveži s strežnikom", "HeaderConfirmRevokeApiKey": "Prekliči API ključ", "HeaderConfirmProfileDeletion": "Potrdi brisanje profila", - "HeaderConfirmPluginInstallation": "Potrdi namestitev dodatka", + "HeaderConfirmPluginInstallation": "Potrdite namestitev dodatka", "HeaderConfigureRemoteAccess": "Nastavi oddaljen dostop", "HeaderCodecProfileHelp": "Profili kodeka določajo omejitve naprave pri predvajanju specifičnih kodekov. Če je omejitev dosežena bo predstavnost prekodirana, tudi če je kodek nastavljen za neposredno predvajanje.", "HeaderCodecProfile": "Profil kodeka", @@ -460,7 +460,7 @@ "FormatValue": "Format: {0}", "ForAdditionalLiveTvOptions": "Za dodatne ponudnike TV v živo kliknite zavihek storitve in poglejte možnosti, ki so na voljo.", "FolderTypeUnset": "Mešane vsebine", - "FolderTypeMusicVideos": "Glasbeni videi", + "FolderTypeMusicVideos": "Videospoti", "FolderTypeMusic": "Glasba", "FolderTypeMovies": "Filmi", "FolderTypeBooks": "Knjige", @@ -496,7 +496,7 @@ "EnableThemeVideosHelp": "Predvajaj tematske videe v ozadju med brskanjem knjižnice.", "EnableThemeVideos": "Tematski videi", "EnableThemeSongsHelp": "Predvajaj tematske pesmi v ozadju med brskanjem knjižnice.", - "EnableThemeSongs": "Tematske pesmi", + "EnableThemeSongs": "Glavne pesmi", "EnableStreamLoopingHelp": "Omogoči za prenose v živo ki vsebujejo zgolj nekaj sekund podatkov in jih je treba neprestano znova zahtevati. Če to ni potrebno lahko omogočanje povzroči težave.", "EnablePhotosHelp": "Fotografije bodo zaznane in prikazane skupaj z drugo predstavnostjo.", "EnablePhotos": "Prikaži fotografije", @@ -1186,7 +1186,7 @@ "ValueTimeLimitSingleHour": "Časovna omejitev: 1 ura", "ValueTimeLimitMultiHour": "Časovna omejitev: {0} ur", "ValueSongCount": "{0} pesmi", - "ValueMusicVideoCount": "{0} glasbenih videov", + "ValueMusicVideoCount": "{0} videospotov", "ValueMovieCount": "{0} filmov", "ValueMinutes": "{0} minut", "ValueEpisodeCount": "{0} epizod", @@ -1194,7 +1194,7 @@ "ValueSeconds": "{0} sekund", "ValueOneSong": "1 skladba", "ValueOneSeries": "1 serija", - "ValueOneMusicVideo": "1 glasbeni video", + "ValueOneMusicVideo": "1 videospot", "ValueOneMovie": "1 film", "ValueOneEpisode": "1 epizoda", "ValueOneAlbum": "1 album", @@ -1392,5 +1392,39 @@ "MessageConfirmAppExit": "Ali želite končati?", "LabelWeb": "Splet:", "LabelLineup": "Postava:", - "BoxSet": "Komplet" + "BoxSet": "Komplet", + "TabMetadata": "Metapodatki", + "TabInfo": "Informacije", + "TabGuide": "Vodič", + "TabFavorites": "Priljubljeni", + "TabEpisodes": "Epizode", + "TabDisplay": "Prikaz", + "TabDirectPlay": "Neposredno predvajanje", + "TabDevices": "Naprave", + "TabCodecs": "Kodeki", + "TabChannels": "Programi", + "OptionRegex": "Regex", + "OptionProtocolHls": "HTTP pretakanje v živo", + "OptionProfileVideoAudio": "Video zvok", + "ThemeSongs": "Glavne pesmi", + "TabTranscoding": "Prekodiranje", + "TabStreaming": "Pretakanje", + "TabSongs": "Skladbe", + "TabSettings": "Nastavitve", + "TabServer": "Strežnik", + "TabSeries": "Serije", + "TabScheduledTasks": "Načrtovana opravila", + "TabResumeSettings": "Nadaljuj", + "UninstallPluginHeader": "Odstrani dodatek", + "UninstallPluginConfirmation": "Ali ste prepričan, da želite odstraniti {0}?", + "ServerRestartNeededAfterPluginInstall": "Po namestitvi dodatka bo potreben ponoven zagon jellyfin strežnika.", + "TabResponses": "Odzivi", + "TabRecordings": "Posnetki", + "TabPlugins": "Dodatki", + "TabPlaylists": "Seznami predvajanja", + "TabOther": "Ostalo", + "TabNotifications": "Obvestila", + "TabNfoSettings": "Nastavitve NFO", + "TabMusicVideos": "Videospoti", + "TabMovies": "Filmi" } diff --git a/src/strings/sv.json b/src/strings/sv.json index 0ca152dcc5..af2f88919b 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -179,7 +179,7 @@ "Download": "Ladda ned", "DownloadsValue": "Nedladdningar: {0}", "DrmChannelsNotImported": "Kanaler med DRM kommer inte att importeras.", - "DropShadow": "Mjuk", + "DropShadow": "Skugga", "EasyPasswordHelp": "Din enkla pin-kod används för att logga in offline på klienter som stödjer det, och kan också användas för enkel inloggning från ditt nätverk.", "Edit": "Ändra", "EditImages": "Ändra bilder", @@ -539,7 +539,7 @@ "LabelEmbedAlbumArtDidl": "Bädda in omslagsbilder i Didl", "LabelEmbedAlbumArtDidlHelp": "Vissa enheter föredrar den här metoden att ta fram omslagsbilder. Andra kanske avbryter avspelningen om detta val är aktiverat.", "LabelEnableAutomaticPortMap": "Aktivera automatisk koppling av portar", - "LabelEnableAutomaticPortMapHelp": "Automatisk länkning av publik port på routern och lokal port på servern via UPnP. Detta kanske inte fungerar med alla routrar och nätverks konfigurationer. Obs. Ingenting kommer att ändras förrän servern startats om.", + "LabelEnableAutomaticPortMapHelp": "För automatiskt vidare publika portar från din router till lokala portar på din server via UPnP. Detta fungerar inte med alla router modeller eller nätverkskonfigurationer. Ändringar kommer inte appliceras inte tills server startats om.", "LabelEnableBlastAliveMessages": "Skicka ut \"jag lever\"-meddelanden", "LabelEnableBlastAliveMessagesHelp": "Aktivera detta om andra UPnP-enheter på nätverket har problem att upptäcka servern.", "LabelEnableDlnaClientDiscoveryInterval": "Intervall för upptäckt av klienter (i sekunder)", @@ -660,7 +660,7 @@ "LabelNumberOfGuideDays": "Antal dagars tablå att hämta:", "LabelNumberOfGuideDaysHelp": "Hämtning av en längre periods tablå ger möjlighet att boka inspelningar och se program längre fram i tiden, men ger längre nedladdningstid. \"Auto\" väljer baserat på antalet kanaler.", "LabelOptionalNetworkPath": "(Valfri) Delad nätverksmapp:", - "LabelOptionalNetworkPathHelp": "Om denna mappen delas på ditt nätverk, kan den delade sökvägen tillåta Jellyfin-appar på andra enheter att streama mediafiler direkt.", + "LabelOptionalNetworkPathHelp": "Om denna mappen delas på ditt nätverk, kan den delade sökvägen tillåta Jellyfin-appar på andra enheter att streama mediafiler direkt. Som exempel, {0} eller {1}.", "LabelOriginalAspectRatio": "Ursprungligt bildförhållande:", "LabelOriginalTitle": "Original titel:", "LabelOverview": "Synopsis:", @@ -850,7 +850,7 @@ "MessageNoAvailablePlugins": "Inga tillägg tillgängliga.", "MessageNoMovieSuggestionsAvailable": "Det finns inga filmförslag för tillfället. Efter att ha sett ett antal filmer kan du återkomma hit för att se dina förslag.", "MessageNoPluginsInstalled": "Inga tillägg har installerats.", - "MessageNoTrailersFound": "Hittade inga trailers. Installera Trailer-kanalen och öka biokänslan genom att lägga till ett bibliotek av trailers.", + "MessageNoTrailersFound": "Installera Trailer-kanalen och öka biokänslan genom att lägga till ett bibliotek av trailers.", "MessageNothingHere": "Ingenting här.", "MessagePasswordResetForUsers": "Lösenord har tagots bort från följande användare. För att logga in, använd ett blankt lösenord.", "MessagePlayAccessRestricted": "Uppspelning av detta innehållet är för närvarande begränsat. Kontakta din server administratör för mer information.", @@ -891,7 +891,7 @@ "NoNextUpItemsMessage": "Hittade inget. Sätt igång och titta!", "NoPluginConfigurationMessage": "Detta tillägg har inga inställningar att konfigurera.", "NoSubtitleSearchResultsFound": "Inga resultat hittades.", - "NoSubtitles": "Inga undertexter", + "NoSubtitles": "Inga", "NoSubtitlesHelp": "Undertexter kommer inte visas per standard. Det kan fortfarande sättas på manuellt under uppspelning.", "None": "Inga", "NumLocationsValue": "{0} mappar", @@ -1350,7 +1350,7 @@ "LabelPlayMethod": "Spelmetod:", "LabelPlayerDimensions": "Spelare dimensioner:", "LabelPasswordResetProvider": "Lösenords Återställning Leverantör:", - "LabelBaseUrlHelp": "Du kan lägga till en egen underkategori här för att få tillgång till servern från en mer unik URL.", + "LabelBaseUrlHelp": "Lägger till en anpassad undermapp till serverns URL. Som exempel: http://example.com/<baseurl>", "LabelCorruptedFrames": "Skadade ramar:", "HeaderParentalRatings": "Föräldrabetyg", "HeaderNavigation": "Navigering", @@ -1388,7 +1388,7 @@ "OptionThumbCard": "Miniatyr kort", "OptionThumb": "Miniatyr", "OptionSaveMetadataAsHiddenHelp": "Ändring av detta kommer att tilldelas till ny metadata som sparas. Existerande metadata filer kommer att uppdateras nästa gång dom sparas av Jellyfin Server.", - "OptionResElement": "res element", + "OptionResElement": "återskapa element", "OptionRegex": "Regex", "OptionRandom": "Slumpmässig", "OptionProtocolHttp": "HTTP", @@ -1499,7 +1499,7 @@ "MessageUnauthorizedUser": "Du har inte behörighet att komma åt servern just nu. Kontakta din serveradministratör för mer information.", "HeaderFavoritePlaylists": "Favoritspellista", "OnWakeFromSleep": "Vid start från vilande läge", - "UnsupportedPlayback": "Jellyfin kan inte dekryptera inehåll skyddat av DRM men allt inehåll kommer ändå försökas, även skyddade titlar. Vissa filer kan se helt svart ut på grund av kryptering eller andra funktioner som inte stöds, till exempel interaktiva titlar.", + "UnsupportedPlayback": "Jellyfin kan inte dekryptera inehåll skyddat av DRM men allt inehåll kommer ändå försökas, även skyddade titlar. Vissa filer kan se helt svarta ut på grund av kryptering eller andra funktioner som inte stöds, till exempel interaktiva titlar.", "LabelLibraryPageSizeHelp": "Sätter en begränsad sidstorlek i bibliotek. Sätt 0 för att avaktivera begränsad sidstorlek.", "ApiKeysCaption": "Lista av aktiva API-nycklar", "DeinterlaceMethodHelp": "Välj metod för borttagning av inflätning vid konvertering av inflätat inehåll.", @@ -1518,7 +1518,58 @@ "HeaderSyncPlaySelectGroup": "Gå med i en grupp", "EnableDecodingColorDepth10Vp9": "Aktivera 10-Bitars hårdvaru avcodning för VP9", "EnableDecodingColorDepth10Hevc": "Aktivera 10-Bitars hårdvaru avcodning för HEVC", - "HeaderSyncPlayEnabled": "SyncPlay påslaget", + "HeaderSyncPlayEnabled": "SyncPlay aktiverat", "EnableDetailsBannerHelp": "Visa en bannerbild högst upp på sidan för detaljsidan .", - "EnableDetailsBanner": "Information banner" + "EnableDetailsBanner": "Information banner", + "LabelRepositoryName": "Förvaringsplats namn", + "LabelRepositoryUrlHelp": "Platsen för det förvaringsplats manifest du vill inkludera.", + "LabelRepositoryUrl": "Förvaringsplats URL", + "HeaderNewRepository": "Ny förvaringsplats", + "MessageNoRepositories": "Inga förvaringsplatser.", + "LabelSyncPlayAccess": "SyncPlay åtkomst", + "LabelSyncPlayAccessNone": "Avstängt för denna användaren", + "LabelSyncPlayAccessJoinGroups": "Tillåt användaren att gå med i grupper", + "LabelSyncPlayAccessCreateAndJoinGroups": "Tillåt användaren att skapa och gå med i grupper", + "LabelSyncPlayLeaveGroupDescription": "Stäng av SyncPlay", + "LabelSyncPlayLeaveGroup": "Lämna grupp", + "LabelSyncPlayNewGroupDescription": "Skapa ny grupp", + "LabelSyncPlayNewGroup": "Ny grupp", + "LabelSyncPlaySyncMethod": "Synkningsmetod:", + "LabelSyncPlayPlaybackDiff": "Uppspelnings tids skillnad:", + "MillisecondsUnit": "ms", + "LabelSyncPlayTimeOffset": "Tids skillnad med servern:", + "EnableFasterAnimationsHelp": "Använd snabbare animationer och övergångar", + "EnableFasterAnimations": "Snabbare animationer", + "LabelRequireHttpsHelp": "Om valt, kommer servern automatiskt omdirigera all inkommande trafik över HTTP till HTTPS. Detta har ingen effekt om servern inte lyssnar på HTTPS.", + "ClearQueue": "Töm kön", + "StopPlayback": "Stoppa uppspelning", + "ButtonPlayer": "Spelare", + "ButtonCast": "Roller", + "EnableBlurhashHelp": "Bilder som fortfarande laddas kommer visas med en suddig platshållare", + "EnableBlurhash": "Aktivera suddiga platshållare för bilder", + "Writers": "Skribenter", + "ViewAlbumArtist": "Visa albums artist", + "TabRepositories": "Förvaringsplatser", + "SyncPlayAccessHelp": "Välj tillgångsnivån för denna användaren har till SyncPlay funktionen. SyncPlay tillåter en att synka uppspelning med andra enheter.", + "ShowMore": "Visa mer", + "ShowLess": "Visa mindre", + "MessageSyncPlayErrorMedia": "Misslyckades att aktivera SyncPlay! Media fel.", + "MessageSyncPlayErrorMissingSession": "Misslyckades att aktivera SyncPlay! Saknar session.", + "MessageAddRepository": "Om du vill skapa en förvaringsplats, klicka på knappen bredvid rubriken och fyll i all omfrågad information.", + "MessageSyncPlayErrorNoActivePlayer": "Ingen aktiv spelare hittades. SyncPlay har avaktiverats.", + "MessageSyncPlayErrorAccessingGroups": "Ett fel uppstod vid hämtning av grupplista.", + "MessageSyncPlayLibraryAccessDenied": "Tillgång till detta innehåll är begränsat.", + "MessageSyncPlayJoinGroupDenied": "Tillåtelse krävs för att använda SyncPlay.", + "MessageSyncPlayCreateGroupDenied": "Tillåtelse krävs för att skapa en grupp.", + "MessageSyncPlayGroupDoesNotExist": "Kunde inte gå med i gruppen då den inte finns.", + "MessageSyncPlayPlaybackPermissionRequired": "Uppspelningstillåtelse krävs.", + "MessageSyncPlayNoGroupsAvailable": "Inga grupper tillgängliga. Börja spela något först.", + "MessageSyncPlayGroupWait": "{0} buffrar…", + "MessageSyncPlayUserLeft": "{0} har lämnat gruppen.", + "MessageSyncPlayUserJoined": "{0} har anslutit till gruppen.", + "MessageSyncPlayDisabled": "SyncPlay avaktiverat.", + "MessageSyncPlayEnabled": "SyncPlay aktiverat.", + "MessageNoGenresAvailable": "Aktivera vissa metadataleverantörer att hämta genrer från internet.", + "LabelRepositoryNameHelp": "Ett eget namn för att särskilja denna förvaringsplats från andra tillagda på din server.", + "LabelNightly": "Nattlig" } diff --git a/src/strings/vi.json b/src/strings/vi.json index 4e51ce8d2d..7ca2832ea8 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -825,5 +825,10 @@ "LabelMaxStreamingBitrate": "Chất lượng phát tối đa:", "LabelMaxScreenshotsPerItem": "Số lượng ảnh chụp tối đa mỗi mục:", "LabelMaxResumePercentageHelp": "Nội dung sẽ được cho là đã kết thúc nếu ngừng phát sau thời gian này.", - "ButtonSyncPlay": "SyncPlay" + "ButtonSyncPlay": "SyncPlay", + "LabelPasswordConfirm": "Mật khẩu (xác nhận):", + "LabelPassword": "Mật khẩu:", + "LabelNotificationEnabled": "Bật thông báo này", + "LabelNewsCategories": "", + "LabelStable": "Ổn Định" } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 06acfddab5..c19bdf3611 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1362,7 +1362,7 @@ "DashboardVersionNumber": "版本:{0}", "DashboardServerName": "服务器:{0}", "LabelVideo": "视频", - "LabelWeb": "网站:", + "LabelWeb": "网页:", "LeaveBlankToNotSetAPassword": "您可以将此字段留空以设置空密码。", "LinksValue": "链接:{0}", "LiveBroadcasts": "直播", diff --git a/yarn.lock b/yarn.lock index 6704749acb..22240c09b9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,28 +9,28 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.4.tgz#706a6484ee6f910b719b696a9194f8da7d7ac241" - integrity sha512-t+rjExOrSVvjQQXNp5zAIYDp00KjdvGl/TpDX5REPr0S9IAIPQMTilcfG6q8c0QFmj9lSTVySV2VTsyggvtNIw== +"@babel/compat-data@^7.10.4", "@babel/compat-data@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.11.0.tgz#e9f73efe09af1355b723a7f39b11bad637d7c99c" + integrity sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ== dependencies: browserslist "^4.12.0" invariant "^2.2.4" semver "^5.5.0" -"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.10.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.5.tgz#1f15e2cca8ad9a1d78a38ddba612f5e7cdbbd330" - integrity sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w== +"@babel/core@>=7.2.2", "@babel/core@>=7.9.0", "@babel/core@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.0.tgz#73b9c33f1658506887f767c26dae07798b30df76" + integrity sha512-mkLq8nwaXmDtFmRkQ8ED/eA2CnVw4zr7dCztKalZXBvdK5EeNUAesrrwUqjQEzFgomJssayzB0aqlOsP1vGLqg== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.10.5" - "@babel/helper-module-transforms" "^7.10.5" + "@babel/generator" "^7.11.0" + "@babel/helper-module-transforms" "^7.11.0" "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.10.5" + "@babel/parser" "^7.11.0" "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.5" - "@babel/types" "^7.10.5" + "@babel/traverse" "^7.11.0" + "@babel/types" "^7.11.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -40,12 +40,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.10.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69" - integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig== +"@babel/generator@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" + integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== dependencies: - "@babel/types" "^7.10.5" + "@babel/types" "^7.11.0" jsesc "^2.5.1" source-map "^0.5.0" @@ -150,17 +150,17 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz#120c271c0b3353673fcdfd8c053db3c544a260d6" - integrity sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA== +"@babel/helper-module-transforms@^7.10.4", "@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz#b16f250229e47211abdd84b34b64737c2ab2d359" + integrity sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg== dependencies: "@babel/helper-module-imports" "^7.10.4" "@babel/helper-replace-supers" "^7.10.4" "@babel/helper-simple-access" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/helper-split-export-declaration" "^7.11.0" "@babel/template" "^7.10.4" - "@babel/types" "^7.10.5" + "@babel/types" "^7.11.0" lodash "^4.17.19" "@babel/helper-optimise-call-expression@^7.10.4": @@ -170,7 +170,7 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== @@ -211,6 +211,13 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-skip-transparent-expression-wrappers@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz#eec162f112c2f58d3af0af125e3bb57665146729" + integrity sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q== + dependencies: + "@babel/types" "^7.11.0" + "@babel/helper-split-export-declaration@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1" @@ -218,6 +225,13 @@ dependencies: "@babel/types" "^7.10.4" +"@babel/helper-split-export-declaration@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" + integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== + dependencies: + "@babel/types" "^7.11.0" + "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" @@ -251,10 +265,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.10.4", "@babel/parser@^7.10.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b" - integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ== +"@babel/parser@^7.10.4", "@babel/parser@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.11.0.tgz#a9d7e11aead25d3b422d17b2c6502c8dddef6a5d" + integrity sha512-qvRvi4oI8xii8NllyEc4MDJjuZiNaRzyb7Y7lup1NqJV8TZHF4O27CcP+72WPn/k1zkgJ6WJfnIbk4jTsVAZHw== "@babel/plugin-proposal-async-generator-functions@^7.10.4": version "7.10.4" @@ -281,6 +295,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" +"@babel/plugin-proposal-export-namespace-from@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz#570d883b91031637b3e2958eea3c438e62c05f54" + integrity sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-proposal-json-strings@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz#593e59c63528160233bd321b1aebe0820c2341db" @@ -289,6 +311,14 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.0" +"@babel/plugin-proposal-logical-assignment-operators@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz#9f80e482c03083c87125dee10026b58527ea20c8" + integrity sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz#02a7e961fc32e6d5b2db0649e01bf80ddee7e04a" @@ -305,10 +335,10 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz#50129ac216b9a6a55b3853fdd923e74bf553a4c0" - integrity sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA== +"@babel/plugin-proposal-object-rest-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz#bd81f95a1f746760ea43b6c2d3d62b11790ad0af" + integrity sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" @@ -322,12 +352,13 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz#750f1255e930a1f82d8cdde45031f81a0d0adff7" - integrity sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ== +"@babel/plugin-proposal-optional-chaining@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz#de5866d0646f6afdaab8a566382fe3a221755076" + integrity sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA== dependencies: "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" "@babel/plugin-proposal-private-methods@^7.10.1", "@babel/plugin-proposal-private-methods@^7.10.4": @@ -367,6 +398,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -374,6 +412,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" @@ -622,12 +667,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-spread@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz#4e2c85ea0d6abaee1b24dcfbbae426fe8d674cff" - integrity sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ== +"@babel/plugin-transform-spread@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz#fa84d300f5e4f57752fe41a6d1b3c554f13f17cc" + integrity sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw== dependencies: "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.11.0" "@babel/plugin-transform-sticky-regex@^7.10.4": version "7.10.4" @@ -675,30 +721,34 @@ core-js "^2.6.5" regenerator-runtime "^0.13.4" -"@babel/preset-env@^7.10.3": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.4.tgz#fbf57f9a803afd97f4f32e4f798bb62e4b2bef5f" - integrity sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw== +"@babel/preset-env@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" + integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== dependencies: - "@babel/compat-data" "^7.10.4" + "@babel/compat-data" "^7.11.0" "@babel/helper-compilation-targets" "^7.10.4" "@babel/helper-module-imports" "^7.10.4" "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-proposal-async-generator-functions" "^7.10.4" "@babel/plugin-proposal-class-properties" "^7.10.4" "@babel/plugin-proposal-dynamic-import" "^7.10.4" + "@babel/plugin-proposal-export-namespace-from" "^7.10.4" "@babel/plugin-proposal-json-strings" "^7.10.4" + "@babel/plugin-proposal-logical-assignment-operators" "^7.11.0" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.4" "@babel/plugin-proposal-numeric-separator" "^7.10.4" - "@babel/plugin-proposal-object-rest-spread" "^7.10.4" + "@babel/plugin-proposal-object-rest-spread" "^7.11.0" "@babel/plugin-proposal-optional-catch-binding" "^7.10.4" - "@babel/plugin-proposal-optional-chaining" "^7.10.4" + "@babel/plugin-proposal-optional-chaining" "^7.11.0" "@babel/plugin-proposal-private-methods" "^7.10.4" "@babel/plugin-proposal-unicode-property-regex" "^7.10.4" "@babel/plugin-syntax-async-generators" "^7.8.0" "@babel/plugin-syntax-class-properties" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" @@ -731,14 +781,14 @@ "@babel/plugin-transform-regenerator" "^7.10.4" "@babel/plugin-transform-reserved-words" "^7.10.4" "@babel/plugin-transform-shorthand-properties" "^7.10.4" - "@babel/plugin-transform-spread" "^7.10.4" + "@babel/plugin-transform-spread" "^7.11.0" "@babel/plugin-transform-sticky-regex" "^7.10.4" "@babel/plugin-transform-template-literals" "^7.10.4" "@babel/plugin-transform-typeof-symbol" "^7.10.4" "@babel/plugin-transform-unicode-escapes" "^7.10.4" "@babel/plugin-transform-unicode-regex" "^7.10.4" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.10.4" + "@babel/types" "^7.11.0" browserslist "^4.12.0" core-js-compat "^3.6.2" invariant "^2.2.2" @@ -779,25 +829,25 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/traverse@^7.10.4", "@babel/traverse@^7.10.5": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564" - integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ== +"@babel/traverse@^7.10.4", "@babel/traverse@^7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.11.0.tgz#9b996ce1b98f53f7c3e4175115605d56ed07dd24" + integrity sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg== dependencies: "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.10.5" + "@babel/generator" "^7.11.0" "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.10.4" - "@babel/parser" "^7.10.5" - "@babel/types" "^7.10.5" + "@babel/helper-split-export-declaration" "^7.11.0" + "@babel/parser" "^7.11.0" + "@babel/types" "^7.11.0" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.4.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15" - integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q== +"@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.4.4": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.11.0.tgz#2ae6bf1ba9ae8c3c43824e5861269871b206e90d" + integrity sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA== dependencies: "@babel/helper-validator-identifier" "^7.10.4" lodash "^4.17.19" @@ -1616,14 +1666,14 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.8.0, autoprefixer@^9.8.5: - version "9.8.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.5.tgz#2c225de229ddafe1d1424c02791d0c3e10ccccaa" - integrity sha512-C2p5KkumJlsTHoNv9w31NrBRgXhf6eCMteJuHZi2xhkgC+5Vm40MEtCKPhc0qdgAOhox0YPy1SQHTAky05UoKg== +autoprefixer@^9.0.0, autoprefixer@^9.6.1, autoprefixer@^9.8.0, autoprefixer@^9.8.6: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== dependencies: browserslist "^4.12.0" - caniuse-lite "^1.0.30001097" - colorette "^1.2.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" normalize-range "^0.1.2" num2fraction "^1.2.2" postcss "^7.0.32" @@ -1857,9 +1907,9 @@ blurhash@^1.1.3: integrity sha512-yUhPJvXexbqbyijCIE/T2NCXcj9iNPhWmOKbPTuR/cm7Q5snXYIfnVnz6m7MWOXxODMz/Cr3UcVkRdHiuDVRDw== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== boolbase@^1.0.0, boolbase@~1.0.0: version "1.0.0" @@ -2282,10 +2332,10 @@ caniuse-db@^1.0.30001090: resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30001093.tgz#5a1cae72d94df1156f40f15d9079456e1b29d050" integrity sha512-XqXxHR6Z9IN0BXLKMaTJ1NZ+US74cbKritholD6uaDLUWHiDj0QilpSb708wOcoGz0PmPRsXT/6zE+bjx+QSMw== -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001088, caniuse-lite@^1.0.30001097: - version "1.0.30001099" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001099.tgz#540118fcc6842d1fde62f4ee5521d1ec6afdb40e" - integrity sha512-sdS9A+sQTk7wKoeuZBN/YMAHVztUfVnjDi4/UV3sDE8xoh7YR12hKW+pIdB3oqKGwr9XaFL2ovfzt9w8eUI5CA== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001088, caniuse-lite@^1.0.30001109: + version "1.0.30001109" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001109.tgz#a9f3f26a0c3753b063d7acbb48dfb9c0e46f2b19" + integrity sha512-4JIXRodHzdS3HdK8nSgIqXYLExOvG+D2/EenSvcub2Kp3QEADjo2v2oUn5g0n0D+UNwG9BtwKOyGcSq2qvQXvQ== caseless@~0.12.0: version "0.12.0" @@ -2624,10 +2674,10 @@ color@^3.0.0: color-convert "^1.9.1" color-string "^1.5.2" -colorette@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.0.tgz#45306add826d196e8c87236ac05d797f25982e63" - integrity sha512-soRSroY+OF/8OdA3PTQXwaDJeMc7TfknKKrxeSCencL2a4+Tx5zhxmmv7hdpCjhKBjehzp8+bwe/T68K0hpIjw== +colorette@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" + integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" @@ -2968,10 +3018,10 @@ css-has-pseudo@^0.10.0: postcss "^7.0.6" postcss-selector-parser "^5.0.0-rc.4" -css-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.0.0.tgz#814434d4e1e2d5f430c70e85e78268db7f3cced1" - integrity sha512-/7d5slKnmY2S39FNifJ7JQ8MhcMM/rDIjAZ2Sc/Z8lnOWOmc10hijg28ovBtljY364pQaF01O2nj5AIBDnJ9vQ== +css-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.1.1.tgz#48342f098784e75bbfc0933dea2853314fb737d8" + integrity sha512-nZ4OC2g88+wOOdkVQ0yYy7T6uXSkb7I7UyMNnaevQQvVWskTSDRAz08ETl91et4ghVL6jfnzWUt0o2XaY0gyRg== dependencies: camelcase "^6.0.0" cssesc "^3.0.0" @@ -3631,9 +3681,9 @@ electron-to-chromium@^1.3.483: integrity sha512-NReBdOugu1yl8ly+0VDtiQ6Yw/1sLjnvflWq0gvY1nfUXU2PbA+1XAVuEb7ModnwL/MfUPjby7e4pAFnSHiy6Q== elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + version "6.5.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" + integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -5417,10 +5467,10 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== -hls.js@^0.14.6: - version "0.14.6" - resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.14.6.tgz#f5ea8412ccd980fec67ec94a40b65adcc0bf75d1" - integrity sha512-6s8L+Pzed3Gyf7wDxQNx9TP9y9clCDIPW8cQdDV7PF7npI75BbCbUZSQQclnt20442Ay1NL3vg2WXeSEYNiuAw== +hls.js@^0.14.7: + version "0.14.7" + resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.14.7.tgz#47fbd2662b13121ab17c07aea06b1c07828240cf" + integrity sha512-9JY0D9nwMrfQPRWc8/kEJTKK0TYfDTzIs6Xq+gdCvasRxdvQKQ2T76rdueTkS0AsFV6sQlJN0wxbnI44aRvvUA== dependencies: eventemitter3 "^4.0.3" url-toolkit "^2.1.6" @@ -11953,10 +12003,10 @@ webpack-stream@^5.2.1: vinyl "^2.1.0" webpack "^4.26.1" -webpack@^4.26.1, webpack@^4.44.0: - version "4.44.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.0.tgz#3b08f88a89470175f036f4a9496b8a0428668802" - integrity sha512-wAuJxK123sqAw31SpkPiPW3iKHgFUiKvO7E7UZjtdExcsRe3fgav4mvoMM7vvpjLHVoJ6a0Mtp2fzkoA13e0Zw== +webpack@^4.26.1, webpack@^4.44.1: + version "4.44.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" + integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0"