diff --git a/.eslintrc.yml b/.eslintrc.yml index b215e1580..f5ce779d4 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -1,27 +1,71 @@ env: - es6: true + es6: false browser: true amd: true +globals: + # New browser globals + DataView: readonly + MediaMetadata: readonly + Promise: readonly + # Deprecated browser globals + DocumentTouch: readonly + # Tizen globals + tizen: readonly + webapis: readonly + # WebOS globals + webOS: readonly + # Dependency globals + $: readonly + jQuery: readonly + queryString: readonly + requirejs: readonly + # Jellyfin globals + ApiClient: writable + AppInfo: writable + chrome: writable + ConnectionManager: writable + DlnaProfilePage: writable + Dashboard: writable + DashboardPage: writable + Emby: readonly + Events: writable + getParameterByName: writable + getWindowLocationSearch: writable + Globalize: writable + Hls: writable + humaneDate: writable + humaneElapsed: writable + LibraryMenu: writable + LinkParser: writable + LiveTvHelpers: writable + MetadataEditor: writable + pageClassOn: writable + pageIdOn: writable + PlaylistViewer: writable + UserParentalControlPage: writable + Windows: readonly + +extends: + - eslint:recommended + rules: block-spacing: ["error"] brace-style: ["error"] comma-dangle: ["error", "never"] comma-spacing: ["error"] - eol-last: ["off"] + eol-last: ["error"] indent: ["error", 4, { "SwitchCase": 1 }] keyword-spacing: ["error"] - line-comment-position: ["off"] max-statements-per-line: ["error"] - no-empty: ["error"] - no-extra-semi: ["error"] no-floating-decimal: ["error"] no-multi-spaces: ["error"] no-multiple-empty-lines: ["error", { "max": 1 }] no-trailing-spaces: ["error"] - no-void: ["off"] one-var: ["error", "never"] - padding-line-between-statements: ["off"] - semi: ["off"] + semi: ["warn"] space-before-blocks: ["error"] - yoda: ["off"] + # TODO: Fix warnings and remove these rules + no-redeclare: ["warn"] + no-unused-vars: ["warn"] + no-useless-escape: ["warn"] diff --git a/.gitignore b/.gitignore index 2e12adf22..10b2d24f4 100644 --- a/.gitignore +++ b/.gitignore @@ -575,4 +575,4 @@ healthchecksdb # End of https://www.gitignore.io/api/node,rider,macos,linux,windows,visualstudio,visualstudiocode # dist for webpack output -dist \ No newline at end of file +dist diff --git a/.stylelintrc b/.stylelintrc index 93e359209..a13acf428 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -140,4 +140,4 @@ "value-list-comma-space-before": "never", "value-list-max-empty-lines": 0, } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 87050382c..dbc6c8fa8 100644 --- a/package.json +++ b/package.json @@ -31,11 +31,10 @@ "jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto", "jquery": "^3.4.1", "jstree": "^3.3.7", - "libass-wasm": "^2.1.1", + "libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus", "libjass": "^0.11.0", "material-design-icons-iconfont": "^5.0.1", "native-promise-only": "^0.8.0-a", - "requirejs": "^2.3.5", "resize-observer-polyfill": "^1.5.1", "shaka-player": "^2.5.9", "sortablejs": "^1.10.2", diff --git a/src/assets/css/fonts.css b/src/assets/css/fonts.css index f125bc6a0..cb0da0f80 100644 --- a/src/assets/css/fonts.css +++ b/src/assets/css/fonts.css @@ -29,7 +29,7 @@ h3 { } .layout-tv { - font-size: 2.5vh; + font-size: 130%; } .layout-mobile { diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css index 7a3e0ada6..d3a3438b0 100644 --- a/src/assets/css/librarybrowser.css +++ b/src/assets/css/librarybrowser.css @@ -439,10 +439,42 @@ background-size: cover; background-repeat: no-repeat; background-position: center; + background-attachment: fixed; height: 50vh; position: relative; } +.layout-desktop .itemBackdrop::after, +.layout-tv .itemBackdrop::after { + content: ""; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.65); + display: block; +} + +.layout-desktop .noBackdrop .itemBackdrop, +.layout-tv .noBackdrop .itemBackdrop { + display: none; +} + +.detailPageContent { + display: flex; + flex-direction: column; + padding-left: 2%; + padding-right: 2%; +} + +.layout-desktop .noBackdrop .detailPageContent, +.layout-tv .noBackdrop .detailPageContent { + margin-top: 2.5em; +} + +.layout-desktop .noBackdrop .detailImageContainer img, +.layout-tv .noBackdrop .detailImageContainer img { + margin-top: 0; +} + .personBackdrop { background-size: contain; } @@ -509,8 +541,6 @@ display: flex; align-items: center; align-content: center; - position: sticky; - top: 3.85em; z-index: 2; } @@ -520,13 +550,21 @@ top: 0; } -.layout-tv .detailPagePrimaryContainer { +.layout-tv #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer, +.layout-desktop #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer { position: relative; top: 0; + padding-left: 32.45vw; } -.detailSticky { - background-color: #101010; +.layout-desktop .detailSticky, +.layout-tv .detailSticky { + margin-top: -7.2em; +} + +.layout-desktop .noBackdrop .detailSticky, +.layout-tv .noBackdrop .detailSticky { + margin-top: 0; } .infoWrapper { @@ -548,23 +586,17 @@ margin: 1.25em 0; } -.detailPageContent { - display: flex; - flex-direction: column; - padding-left: 2%; - padding-right: 2%; -} - .detailImageContainer { - position: sticky; - top: 25%; + position: relative; + margin-top: -25vh; float: left; - width: 22.786458333333332vw; + width: 25vw; + z-index: 3; } -.layout-mobile .detailImageContainer, -.layout-tv .detailImageContainer { - position: relative; +.layout-desktop .noBackdrop .detailImageContainer, +.layout-tv .noBackdrop .detailImageContainer { + margin-top: 0; } .detailPagePrimaryContent { @@ -572,15 +604,19 @@ } .detailLogo { - width: 25em; - height: 9.375em; + width: 67.25vw; + height: 14.5vh; position: absolute; - top: 14.5%; - right: 10.5%; + top: 15vh; + right: 0; -webkit-background-size: contain; background-size: contain; } +.noBackdrop .detailLogo { + display: none; +} + @media all and (max-width: 87.5em) { .detailLogo { right: 5%; @@ -607,8 +643,8 @@ .itemDetailImage { width: 100% !important; - box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); - -webkit-box-shadow: 0 0.0725em 0.29em 0 rgba(0, 0, 0, 0.37); + -webkit-box-shadow: 0 0.1em 0.5em 0 rgba(0, 0, 0, 0.75); + box-shadow: 0 0.1em 0.5em 0 rgba(0, 0, 0, 0.75); } div.itemDetailGalleryLink.defaultCardBackground { @@ -635,6 +671,16 @@ div.itemDetailGalleryLink.defaultCardBackground { position: relative; } + .layout-desktop .detailPageWrapperContainer, + .layout-tv .detailPageWrapperContainer { + margin-top: 7.2em; + } + + .layout-tv #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer, + .layout-desktop #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer { + padding-left: 3.3%; + } + .btnPlaySimple { display: none !important; } @@ -849,6 +895,11 @@ div.itemDetailGalleryLink.defaultCardBackground { border-collapse: collapse; } +.layout-desktop .noBackdrop .detailPageWrapperContainer, +.layout-tv .noBackdrop .detailPageWrapperContainer { + margin-top: 3.8em; +} + .mediaInfoStream { margin: 0 3em 0 0; display: inline-block; diff --git a/src/availableplugins.html b/src/availableplugins.html index ea1147fbf..6c9b89c26 100644 --- a/src/availableplugins.html +++ b/src/availableplugins.html @@ -5,4 +5,4 @@
- \ No newline at end of file + diff --git a/src/bundle.js b/src/bundle.js index b7bde65f8..6a352c577 100644 --- a/src/bundle.js +++ b/src/bundle.js @@ -47,12 +47,6 @@ _define("howler", function() { return howler; }); -// native-promise-only -var nativePromise = require("native-promise-only"); -_define("native-promise-only", function() { - return nativePromise; -}); - // resize-observer-polyfill var resize = require("resize-observer-polyfill").default; _define("resize-observer-polyfill", function() { diff --git a/src/components/alert.js b/src/components/alert.js index 8a4dc11c2..8a37ac184 100644 --- a/src/components/alert.js +++ b/src/components/alert.js @@ -42,4 +42,4 @@ define(['browser', 'dialog', 'globalize'], function (browser, dialog, globalize) return Promise.resolve(); }; -}); \ No newline at end of file +}); diff --git a/src/components/alphanumericshortcuts/alphanumericshortcuts.js b/src/components/alphanumericshortcuts/alphanumericshortcuts.js index 03d0118cb..2bcf3712b 100644 --- a/src/components/alphanumericshortcuts/alphanumericshortcuts.js +++ b/src/components/alphanumericshortcuts/alphanumericshortcuts.js @@ -10,7 +10,7 @@ define(['dom', 'focusManager'], function (dom, focusManager) { if (e.ctrlKey) { return; } - if (!!e.shiftKey) { + if (e.shiftKey) { return; } if (e.altKey) { @@ -127,4 +127,4 @@ define(['dom', 'focusManager'], function (dom, focusManager) { }; return AlphaNumericShortcuts; -}); \ No newline at end of file +}); diff --git a/src/components/alphapicker/alphapicker.js b/src/components/alphapicker/alphapicker.js index 9ac39e55b..455a43b46 100644 --- a/src/components/alphapicker/alphapicker.js +++ b/src/components/alphapicker/alphapicker.js @@ -241,7 +241,7 @@ define(['focusManager', 'layoutManager', 'dom', 'css!./style.css', 'paper-icon-b try { btn = element.querySelector('.alphaPickerButton[data-value=\'' + value + '\']'); } catch (err) { - console.log('Error in querySelector: ' + err); + console.error('error in querySelector: ' + err); } if (btn && btn !== selected) { diff --git a/src/components/appRouter.js b/src/components/appRouter.js index 7b36d01bd..74b1a5cd5 100644 --- a/src/components/appRouter.js +++ b/src/components/appRouter.js @@ -14,6 +14,9 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM }, showSettings: function () { show('/settings/settings.html'); + }, + showNowPlaying: function () { + show("/nowplaying.html"); } }; @@ -387,13 +390,13 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM var apiClient = connectionManager.currentApiClient(); var pathname = ctx.pathname.toLowerCase(); - console.log('appRouter - processing path request ' + pathname); + console.debug('appRouter - processing path request ' + pathname); var isCurrentRouteStartup = currentRouteInfo ? currentRouteInfo.route.startup : true; var shouldExitApp = ctx.isBack && route.isDefaultRoute && isCurrentRouteStartup; if (!shouldExitApp && (!apiClient || !apiClient.isLoggedIn()) && !route.anonymous) { - console.log('appRouter - route does not allow anonymous access, redirecting to login'); + console.debug('appRouter - route does not allow anonymous access, redirecting to login'); beginConnectionWizard(); return; } @@ -408,10 +411,10 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM if (apiClient && apiClient.isLoggedIn()) { - console.log('appRouter - user is authenticated'); + console.debug('appRouter - user is authenticated'); if (route.isDefaultRoute) { - console.log('appRouter - loading skin home page'); + console.debug('appRouter - loading skin home page'); loadUserSkinWithOptions(ctx); return; } else if (route.roles) { @@ -425,7 +428,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM } } - console.log('appRouter - proceeding to ' + pathname); + console.debug('appRouter - proceeding to ' + pathname); callback(); } @@ -672,7 +675,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM baseRoute = baseRoute.substring(0, baseRoute.length - 1); } - console.log('Setting page base to ' + baseRoute); + console.debug('setting page base to ' + baseRoute); page.base(baseRoute); } diff --git a/src/components/apphost.js b/src/components/apphost.js index 2a0b7b19e..f3e89ed29 100644 --- a/src/components/apphost.js +++ b/src/components/apphost.js @@ -186,7 +186,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet return !!cue.length; } catch (err) { - console.log("error detecting cue support: " + err); + console.error("error detecting cue support: " + err); return false; } } @@ -194,7 +194,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet function onAppVisible() { if (isHidden) { isHidden = false; - console.log("triggering app resume event"); + console.debug("triggering app resume event"); events.trigger(appHost, "resume"); } } @@ -202,7 +202,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet function onAppHidden() { if (!isHidden) { isHidden = true; - console.log("app is hidden"); + console.debug("app is hidden"); } } @@ -314,7 +314,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet window.close(); } } catch (err) { - console.log("error closing application: " + err); + console.error("error closing application: " + err); } } @@ -324,7 +324,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet * Ask user for exit */ function askForExit() { - if (!!exitPromise) { + if (exitPromise) { return; } @@ -374,7 +374,7 @@ define(["appSettings", "browser", "events", "htmlMediaHelper"], function (appSet return -1 !== supportedFeatures.indexOf(command.toLowerCase()); }, preferVisualCards: browser.android || browser.chrome, - moreIcon: browser.android ? "dots-vert" : "dots-horiz", + moreIcon: browser.android ? "more_vert" : "more_horiz", getSyncProfile: getSyncProfile, getDefaultLayout: function () { if (window.NativeShell) { diff --git a/src/components/autoFocuser.js b/src/components/autoFocuser.js index 09ded814f..6d99009e6 100644 --- a/src/components/autoFocuser.js +++ b/src/components/autoFocuser.js @@ -25,7 +25,7 @@ define(["focusManager", "layoutManager"], function (focusManager, layoutManager) activeElement = e.target; }); - console.log("AutoFocuser enabled"); + console.debug("AutoFocuser enabled"); } /** diff --git a/src/components/cardbuilder/card.css b/src/components/cardbuilder/card.css index 7e2855c85..3cd038cd0 100644 --- a/src/components/cardbuilder/card.css +++ b/src/components/cardbuilder/card.css @@ -429,6 +429,12 @@ button::-moz-focus-inner { font-size: 1.66956521739130434em !important; } +.cardOverlayButtonIcon.material-icons { + /* material-icons override display, so we need to + make a better matching selector to set it to flex */ + display: flex; +} + .cardOverlayButton-centered { bottom: initial; right: initial; @@ -784,7 +790,7 @@ button::-moz-focus-inner { opacity: 0; transition: 0.2s; background: transparent; - padding: 0.5em; + padding: 0.25em; } .cardOverlayButtonIcon-hover { diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js index 4e589c4a1..bec641f40 100644 --- a/src/components/cardbuilder/cardBuilder.js +++ b/src/components/cardbuilder/cardBuilder.js @@ -140,7 +140,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } return 100 / 72; } - break; case 'overflowPortrait': if (layoutManager.tv) { @@ -166,7 +165,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } return 100 / 42; } - break; case 'overflowSquare': if (layoutManager.tv) { return 100 / 15.5; @@ -191,7 +189,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } return 100 / 42; } - break; case 'overflowBackdrop': if (layoutManager.tv) { return 100 / 23.3; @@ -216,7 +213,6 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } return 100 / 72; } - break; default: return 4; } @@ -342,7 +338,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana try { newIndexValue = datetime.toLocaleDateString(datetime.parseISO8601Date(item.PremiereDate), { weekday: 'long', month: 'long', day: 'numeric' }); } catch (err) { - console.log('error parsing timestamp for premiere date'); + console.error('error parsing timestamp for premiere date'); } } } else if (options.indexBy === 'ProductionYear') { @@ -738,7 +734,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana airTimeText += ' - ' + datetime.getDisplayTime(date); } } catch (e) { - console.log("Error parsing date: " + item.StartDate); + console.error("error parsing date: " + item.StartDate); } } @@ -870,9 +866,10 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana if (item.PremiereDate) { try { - - lines.push(getPremiereDateText(item)); - + lines.push(datetime.toLocaleDateString( + datetime.parseISO8601Date(item.PremiereDate), + { weekday: 'long', month: 'long', day: 'numeric' } + )); } catch (err) { lines.push(''); @@ -1383,7 +1380,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana } if (item.Type === 'CollectionFolder' || item.CollectionType) { - var refreshClass = item.RefreshProgress || (item.RefreshStatus && virtualFolder.item !== 'Idle') ? '' : ' class="hide"'; + var refreshClass = item.RefreshProgress ? '' : ' class="hide"'; indicatorsHtml += '
'; requireRefreshIndicator(); } @@ -1497,13 +1494,13 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'focusMana case 'Person': return 'person'; case 'Movie': - return 'movie' + return 'movie'; case 'Series': - return 'tv' + return 'tv'; case 'Book': - return 'book' + return 'book'; case 'Folder': - return 'folder' + return 'folder'; } if (options && options.defaultCardImageIcon) { diff --git a/src/components/cardbuilder/chaptercardbuilder.js b/src/components/cardbuilder/chaptercardbuilder.js index 75b940285..02d583abc 100644 --- a/src/components/cardbuilder/chaptercardbuilder.js +++ b/src/components/cardbuilder/chaptercardbuilder.js @@ -90,7 +90,7 @@ define(['datetime', 'imageLoader', 'connectionManager', 'layoutManager', 'browse var cardImageContainer = imgUrl ? ('
') : ('
'); if (!imgUrl) { - cardImageContainer += 'local_movies'; + cardImageContainer += ''; } var nameHtml = ''; diff --git a/src/components/channelmapper/channelmapper.js b/src/components/channelmapper/channelmapper.js index 2b2de1870..1b536f440 100644 --- a/src/components/channelmapper/channelmapper.js +++ b/src/components/channelmapper/channelmapper.js @@ -84,7 +84,7 @@ define(["dialogHelper", "loading", "connectionManager", "globalize", "actionshee html += "
"; html += "
"; - html += ''; + html += ''; return html += ""; } diff --git a/src/components/chromecast/chromecasthelpers.js b/src/components/chromecast/chromecasthelpers.js index 9d6f811cb..2fef0c68b 100644 --- a/src/components/chromecast/chromecasthelpers.js +++ b/src/components/chromecast/chromecasthelpers.js @@ -131,8 +131,9 @@ define(['events'], function (events) { var links = []; var match; + // eslint-disable-next-line no-cond-assign while (match = linkRegExp.exec(text)) { - // console.log(matches); + console.debug(match); var txt = match[0]; var pos = match.index; var len = txt.length; @@ -189,7 +190,7 @@ define(['events'], function (events) { return apiClient.getPublicSystemInfo().then(function (info) { var localAddress = info.LocalAddress if (!localAddress) { - console.log("No valid local address returned, defaulting to external one") + console.debug("No valid local address returned, defaulting to external one") localAddress = serverAddress; } addToCache(serverAddress, localAddress); @@ -230,4 +231,4 @@ define(['events'], function (events) { return { getServerAddress: getServerAddress }; -}); \ No newline at end of file +}); diff --git a/src/components/chromecast/chromecastplayer.js b/src/components/chromecast/chromecastplayer.js index 112d2980a..18103e433 100644 --- a/src/components/chromecast/chromecastplayer.js +++ b/src/components/chromecast/chromecastplayer.js @@ -105,7 +105,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' this.sessionListener.bind(this), this.receiverListener.bind(this)); - console.log('chromecast.initialize'); + console.debug('chromecast.initialize'); chrome.cast.initialize(apiConfig, this.onInitSuccess.bind(this), this.errorHandler); }; @@ -114,14 +114,14 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.onInitSuccess = function () { this.isInitialized = true; - console.log("chromecast init success"); + console.debug("chromecast init success"); }; /** * Generic error callback function */ CastPlayer.prototype.onError = function () { - console.log("chromecast error"); + console.debug("chromecast error"); }; /** @@ -177,10 +177,10 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.receiverListener = function (e) { if (e === 'available') { - console.log("chromecast receiver found"); + console.debug("chromecast receiver found"); this.hasReceivers = true; } else { - console.log("chromecast receiver list empty"); + console.debug("chromecast receiver list empty"); this.hasReceivers = false; } }; @@ -190,7 +190,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.sessionUpdateListener = function (isAlive) { if (isAlive) { - console.log('sessionUpdateListener: already alive'); + console.debug('sessionUpdateListener: already alive'); } else { this.session = null; this.deviceState = DEVICE_STATE.IDLE; @@ -198,7 +198,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' document.removeEventListener("volumeupbutton", onVolumeUpKeyDown, false); document.removeEventListener("volumedownbutton", onVolumeDownKeyDown, false); - console.log('sessionUpdateListener: setting currentMediaSession to null'); + console.debug('sessionUpdateListener: setting currentMediaSession to null'); this.currentMediaSession = null; sendConnectionResult(false); @@ -211,7 +211,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * session request in opt_sessionRequest. */ CastPlayer.prototype.launchApp = function () { - console.log("chromecast launching app..."); + console.debug("chromecast launching app..."); chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this), this.onLaunchError.bind(this)); }; @@ -220,7 +220,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * @param {Object} e A chrome.cast.Session object */ CastPlayer.prototype.onRequestSessionSuccess = function (e) { - console.log("chromecast session success: " + e.sessionId); + console.debug("chromecast session success: " + e.sessionId); this.onSessionConnected(e); }; @@ -262,7 +262,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * Callback function for launch error */ CastPlayer.prototype.onLaunchError = function () { - console.log("chromecast launch error"); + console.debug("chromecast launch error"); this.deviceState = DEVICE_STATE.ERROR; sendConnectionResult(false); }; @@ -280,7 +280,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * Callback function for stop app success */ CastPlayer.prototype.onStopAppSuccess = function (message) { - console.log(message); + console.debug(message); this.deviceState = DEVICE_STATE.IDLE; this.castPlayerState = PLAYER_STATE.IDLE; @@ -296,7 +296,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.loadMedia = function (options, command) { if (!this.session) { - console.log("no session"); + console.debug("no session"); return Promise.reject(); } @@ -377,7 +377,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' }; CastPlayer.prototype.onPlayCommandSuccess = function () { - //console.log('Message was sent to receiver ok.'); + console.debug('Message was sent to receiver ok.'); }; /** @@ -386,7 +386,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.onMediaDiscovered = function (how, mediaSession) { - //console.log("chromecast new media session ID:" + mediaSession.mediaSessionId + ' (' + how + ')'); + console.debug("chromecast new media session ID:" + mediaSession.mediaSessionId + ' (' + how + ')'); this.currentMediaSession = mediaSession; if (how === 'loadMedia') { @@ -405,7 +405,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * @param {!Boolean} e true/false */ CastPlayer.prototype.onMediaStatusUpdate = function (e) { - //console.log("chromecast updating media: " + e); + console.debug("chromecast updating media: " + e); if (e === false) { this.castPlayerState = PLAYER_STATE.IDLE; } @@ -417,7 +417,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' */ CastPlayer.prototype.setReceiverVolume = function (mute, vol) { if (!this.currentMediaSession) { - //console.log('this.currentMediaSession is null'); + console.debug('this.currentMediaSession is null'); return; } @@ -443,7 +443,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' * Callback function for media command success */ CastPlayer.prototype.mediaCommandSuccessCallback = function (info, e) { - //console.log(info); + console.debug(info); }; function normalizeImages(state) { @@ -493,7 +493,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' events.on(instance._castPlayer, eventName, function (e, data) { - //console.log('cc: ' + eventName); + console.debug('cc: ' + eventName); var state = instance.getPlayerStateInternal(data); events.trigger(instance, eventName, [state]); @@ -520,14 +520,14 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' playbackManager.setActivePlayer(PlayerName, instance.getCurrentTargetInfo()); } - console.log('cc: connect'); + console.debug('cc: connect'); // Reset this so that statechange will fire instance.lastPlayerData = null; }); events.on(instance._castPlayer, "playbackstart", function (e, data) { - console.log('cc: playbackstart'); + console.debug('cc: playbackstart'); instance._castPlayer.initializeCastPlayer(); @@ -537,7 +537,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' events.on(instance._castPlayer, "playbackstop", function (e, data) { - console.log('cc: playbackstop'); + console.debug('cc: playbackstop'); var state = instance.getPlayerStateInternal(data); events.trigger(instance, "playbackstop", [state]); @@ -555,7 +555,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' events.on(instance._castPlayer, "playbackprogress", function (e, data) { - //console.log('cc: positionchange'); + console.debug('cc: positionchange'); var state = instance.getPlayerStateInternal(data); events.trigger(instance, "timeupdate", [state]); @@ -569,7 +569,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' events.on(instance._castPlayer, "playstatechange", function (e, data) { - //console.log('cc: playstatechange'); + console.debug('cc: playstatechange'); var state = instance.getPlayerStateInternal(data); events.trigger(instance, "pause", [state]); @@ -664,7 +664,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', ' normalizeImages(data); - //console.log(JSON.stringify(data)); + console.debug(JSON.stringify(data)); if (triggerStateChange) { events.trigger(this, "statechange", [data]); diff --git a/src/components/confirm/nativeconfirm.js b/src/components/confirm/nativeconfirm.js index fd586ad1d..7d72bc5ea 100644 --- a/src/components/confirm/nativeconfirm.js +++ b/src/components/confirm/nativeconfirm.js @@ -24,4 +24,4 @@ define([], function () { return Promise.reject(); } }; -}); \ No newline at end of file +}); diff --git a/src/components/dialog/dialog.template.html b/src/components/dialog/dialog.template.html index eae210d14..bee0ef7f7 100644 --- a/src/components/dialog/dialog.template.html +++ b/src/components/dialog/dialog.template.html @@ -12,4 +12,4 @@
-
\ No newline at end of file + diff --git a/src/components/dialogHelper/dialogHelper.js b/src/components/dialogHelper/dialogHelper.js index bddd83976..6ee96df31 100644 --- a/src/components/dialogHelper/dialogHelper.js +++ b/src/components/dialogHelper/dialogHelper.js @@ -32,7 +32,7 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', try { parentNode.removeChild(elem); } catch (err) { - console.log('Error removing dialog element: ' + err); + console.error('error removing dialog element: ' + err); } } } @@ -481,4 +481,4 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager', globalOnOpenCallback = val; } }; -}); \ No newline at end of file +}); diff --git a/src/components/directorybrowser/directorybrowser.js b/src/components/directorybrowser/directorybrowser.js index 06f7773cf..b71f7bbb0 100644 --- a/src/components/directorybrowser/directorybrowser.js +++ b/src/components/directorybrowser/directorybrowser.js @@ -76,7 +76,7 @@ define(['loading', 'dialogHelper', 'dom', 'listViewStyle', 'emby-input', 'paper- html += name; html += ""; html += ""; - html += 'arrow_forward'; + html += ''; html += ""; return html; } diff --git a/src/components/dom.js b/src/components/dom.js index da03b8742..072ff5c77 100644 --- a/src/components/dom.js +++ b/src/components/dom.js @@ -63,13 +63,14 @@ define([], function () { var supportsCaptureOption = false; try { var opts = Object.defineProperty({}, 'capture', { + // eslint-disable-next-line getter-return get: function () { supportsCaptureOption = true; } }); window.addEventListener("test", null, opts); } catch (e) { - console.log('error checking capture support'); + console.debug('error checking capture support'); } function addEventListenerWithOptions(target, type, handler, options) { @@ -178,4 +179,4 @@ define([], function () { whichAnimationEvent: whichAnimationEvent, whichAnimationCancelEvent: whichAnimationCancelEvent }; -}); \ No newline at end of file +}); diff --git a/src/components/emby-itemrefreshindicator/emby-itemrefreshindicator.js b/src/components/emby-itemrefreshindicator/emby-itemrefreshindicator.js index be50abeb8..9864dbbb6 100644 --- a/src/components/emby-itemrefreshindicator/emby-itemrefreshindicator.js +++ b/src/components/emby-itemrefreshindicator/emby-itemrefreshindicator.js @@ -74,4 +74,4 @@ define(['emby-progressring', 'dom', 'serverNotifications', 'events', 'registerEl prototype: EmbyItemRefreshIndicatorPrototype, extends: 'div' }); -}); \ No newline at end of file +}); diff --git a/src/components/emby-itemscontainer/emby-itemscontainer.js b/src/components/emby-itemscontainer/emby-itemscontainer.js index 7cfb3e4a4..c1aba9b6a 100644 --- a/src/components/emby-itemscontainer/emby-itemscontainer.js +++ b/src/components/emby-itemscontainer/emby-itemscontainer.js @@ -467,7 +467,7 @@ define(['itemShortcuts', 'inputManager', 'connectionManager', 'playbackManager', focusManager.focus(newElement); return; } catch (err) { - console.log(err); + console.error(err); } } } @@ -479,4 +479,4 @@ define(['itemShortcuts', 'inputManager', 'connectionManager', 'playbackManager', prototype: ItemsContainerPrototype, extends: 'div' }); -}); \ No newline at end of file +}); diff --git a/src/components/emby-scroller/emby-scroller.js b/src/components/emby-scroller/emby-scroller.js index f943047f5..cb5bae818 100644 --- a/src/components/emby-scroller/emby-scroller.js +++ b/src/components/emby-scroller/emby-scroller.js @@ -206,4 +206,4 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro prototype: ScrollerPrototype, extends: 'div' }); -}); \ No newline at end of file +}); diff --git a/src/components/emby-tabs/emby-tabs.js b/src/components/emby-tabs/emby-tabs.js index 9fedf0bfe..fa5979fa4 100644 --- a/src/components/emby-tabs/emby-tabs.js +++ b/src/components/emby-tabs/emby-tabs.js @@ -338,4 +338,4 @@ define(['dom', 'scroller', 'browser', 'layoutManager', 'focusManager', 'register prototype: EmbyTabs, extends: 'div' }); -}); \ No newline at end of file +}); diff --git a/src/components/fetchhelper.js b/src/components/fetchhelper.js index bb7f21e75..0b8d45173 100644 --- a/src/components/fetchhelper.js +++ b/src/components/fetchhelper.js @@ -51,7 +51,7 @@ define([], function () { function fetchWithTimeout(url, options, timeoutMs) { - console.log('fetchWithTimeout: timeoutMs: ' + timeoutMs + ', url: ' + url); + console.debug('fetchWithTimeout: timeoutMs: ' + timeoutMs + ', url: ' + url); return new Promise(function (resolve, reject) { @@ -63,14 +63,14 @@ define([], function () { fetch(url, options).then(function (response) { clearTimeout(timeout); - console.log('fetchWithTimeout: succeeded connecting to url: ' + url); + console.debug('fetchWithTimeout: succeeded connecting to url: ' + url); resolve(response); }, function (error) { clearTimeout(timeout); - console.log('fetchWithTimeout: timed out connecting to url: ' + url); + console.debug('fetchWithTimeout: timed out connecting to url: ' + url); reject(); }); @@ -93,21 +93,17 @@ define([], function () { } function ajax(request) { - if (!request) { throw new Error("Request cannot be null"); } request.headers = request.headers || {}; - console.log('requesting url: ' + request.url); + console.debug('requesting url: ' + request.url); return getFetchPromise(request).then(function (response) { - - console.log('response status: ' + response.status + ', url: ' + request.url); - + console.debug('response status: ' + response.status + ', url: ' + request.url); if (response.status < 400) { - if (request.dataType === 'json' || request.headers.accept === 'application/json') { return response.json(); } else if (request.dataType === 'text' || (response.headers.get('Content-Type') || '').toLowerCase().indexOf('text/') === 0) { @@ -118,10 +114,8 @@ define([], function () { } else { return Promise.reject(response); } - }, function (err) { - - console.log('request failed to url: ' + request.url); + console.error('request failed to url: ' + request.url); throw err; }); } @@ -129,4 +123,4 @@ define([], function () { getFetchPromise: getFetchPromise, ajax: ajax }; -}); \ No newline at end of file +}); diff --git a/src/components/filedownloader.js b/src/components/filedownloader.js index c5810b460..08b6176a0 100644 --- a/src/components/filedownloader.js +++ b/src/components/filedownloader.js @@ -15,4 +15,4 @@ define(['multi-download'], function (multiDownload) { } } }; -}); \ No newline at end of file +}); diff --git a/src/components/filesystem.js b/src/components/filesystem.js index 3ab759b28..aac697415 100644 --- a/src/components/filesystem.js +++ b/src/components/filesystem.js @@ -15,4 +15,4 @@ define([], function () { return Promise.reject(); } }; -}); \ No newline at end of file +}); diff --git a/src/components/filtermenu/filtermenu.template.html b/src/components/filtermenu/filtermenu.template.html index 1cadab2d1..1a5545baa 100644 --- a/src/components/filtermenu/filtermenu.template.html +++ b/src/components/filtermenu/filtermenu.template.html @@ -105,4 +105,4 @@ - \ No newline at end of file + diff --git a/src/components/focusManager.js b/src/components/focusManager.js index 56ff324e2..1da58d75c 100644 --- a/src/components/focusManager.js +++ b/src/components/focusManager.js @@ -43,7 +43,7 @@ define(['dom', 'scrollManager'], function (dom, scrollManager) { preventScroll: scrollManager.isEnabled() }); } catch (err) { - console.log('Error in focusManager.autoFocus: ' + err); + console.error('Error in focusManager.autoFocus: ' + err); } } diff --git a/src/components/guide/guide-settings.js b/src/components/guide/guide-settings.js index 9ee43be9f..7409a7e94 100644 --- a/src/components/guide/guide-settings.js +++ b/src/components/guide/guide-settings.js @@ -89,20 +89,6 @@ define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectio } } - function onSortByChange() { - var newValue = this.value; - if (this.checked) { - var changed = options.query.SortBy !== newValue; - - options.query.SortBy = newValue.replace('_', ','); - options.query.StartIndex = 0; - - if (options.callback && changed) { - options.callback(); - } - } - } - function showEditor(options) { return new Promise(function (resolve, reject) { @@ -171,4 +157,4 @@ define(['dialogHelper', 'globalize', 'userSettings', 'layoutManager', 'connectio return { show: showEditor }; -}); \ No newline at end of file +}); diff --git a/src/components/guide/guide.js b/src/components/guide/guide.js index fd6931177..a00baaa6f 100644 --- a/src/components/guide/guide.js +++ b/src/components/guide/guide.js @@ -29,7 +29,6 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', var offset = newPct - left; var pctOfWidth = (offset / width) * 100; - //console.log(pctOfWidth); var guideProgramName = cell.guideProgramName; if (!guideProgramName) { guideProgramName = cell.querySelector('.guideProgramName'); @@ -396,7 +395,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', try { program.StartDateLocal = datetime.parseISO8601Date(program.StartDate, { toLocal: true }); } catch (err) { - console.log('error parsing timestamp for start date'); + console.error('error parsing timestamp for start date'); } } @@ -404,7 +403,7 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', try { program.EndDateLocal = datetime.parseISO8601Date(program.EndDate, { toLocal: true }); } catch (err) { - console.log('error parsing timestamp for end date'); + console.error('error parsing timestamp for end date'); } } diff --git a/src/components/guide/tvguide.template.html b/src/components/guide/tvguide.template.html index 5dc16dba3..ef3c4b58c 100644 --- a/src/components/guide/tvguide.template.html +++ b/src/components/guide/tvguide.template.html @@ -33,6 +33,6 @@ diff --git a/src/components/headroom/headroom.js b/src/components/headroom/headroom.js index 9c058a8e8..3c0ada3ce 100644 --- a/src/components/headroom/headroom.js +++ b/src/components/headroom/headroom.js @@ -340,4 +340,4 @@ define(['dom', 'layoutManager', 'browser', 'css!./headroom'], function (dom, lay }; return Headroom; -}); \ No newline at end of file +}); diff --git a/src/components/homescreensettings/homescreensettings.template.html b/src/components/homescreensettings/homescreensettings.template.html index 1ed2ec1b9..d5bae685b 100644 --- a/src/components/homescreensettings/homescreensettings.template.html +++ b/src/components/homescreensettings/homescreensettings.template.html @@ -129,4 +129,4 @@ - \ No newline at end of file + diff --git a/src/components/homesections/homesections.js b/src/components/homesections/homesections.js index 21373a179..430c06bc5 100644 --- a/src/components/homesections/homesections.js +++ b/src/components/homesections/homesections.js @@ -77,7 +77,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la var createNowLink = elem.querySelector("#button-createLibrary") if (createNowLink) { - createNowLink.addEventListener("click", () => { + createNowLink.addEventListener("click", function () { Dashboard.navigate("library.html"); }); } @@ -290,7 +290,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += ''; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -343,7 +343,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la if (userViews.length) { html += '

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

'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -423,7 +423,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

' + globalize.translate('HeaderContinueWatching') + '

'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -496,7 +496,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '

' + globalize.translate('HeaderContinueWatching') + '

'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -582,7 +582,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '
'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
'; } else { html += '
'; @@ -639,7 +639,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '
'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
' } else { html += '
'; @@ -713,7 +713,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '
'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
' } else { html += '
'; @@ -785,7 +785,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la html += '
'; if (enableScrollX()) { - html += '
'; + html += '
'; html += '
' } else { html += '
'; diff --git a/src/components/htmlMediaHelper.js b/src/components/htmlMediaHelper.js index 86f05dabf..338b8e6fe 100644 --- a/src/components/htmlMediaHelper.js +++ b/src/components/htmlMediaHelper.js @@ -114,12 +114,12 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve if (!recoverDecodingErrorDate || (now - recoverDecodingErrorDate) > 3000) { recoverDecodingErrorDate = now; - console.log('try to recover media Error ...'); + console.debug('try to recover media Error ...'); hlsPlayer.recoverMediaError(); } else { if (!recoverSwapAudioCodecDate || (now - recoverSwapAudioCodecDate) > 3000) { recoverSwapAudioCodecDate = now; - console.log('try to swap Audio Codec and recover media Error ...'); + console.debug('try to swap Audio Codec and recover media Error ...'); hlsPlayer.swapAudioCodec(); hlsPlayer.recoverMediaError(); } else { @@ -233,7 +233,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve return Promise.resolve(); } } catch (err) { - console.log('error calling video.play: ' + err); + console.error('error calling video.play: ' + err); return Promise.reject(); } } @@ -245,7 +245,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve try { player.unload(); } catch (err) { - console.log(err); + console.error(err); } instance._castPlayer = null; @@ -258,7 +258,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve try { player.destroy(); } catch (err) { - console.log(err); + console.error(err); } instance._shakaPlayer = null; @@ -271,7 +271,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve try { player.destroy(); } catch (err) { - console.log(err); + console.error(err); } instance._hlsPlayer = null; @@ -286,7 +286,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve player.detachMediaElement(); player.destroy(); } catch (err) { - console.log(err); + console.error(err); } instance._flvPlayer = null; @@ -307,14 +307,14 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve hls.on(Hls.Events.ERROR, function (event, data) { - console.log('HLS Error: Type: ' + data.type + ' Details: ' + (data.details || '') + ' Fatal: ' + (data.fatal || false)); + console.error('HLS Error: Type: ' + data.type + ' Details: ' + (data.details || '') + ' Fatal: ' + (data.fatal || false)); switch (data.type) { case Hls.ErrorTypes.NETWORK_ERROR: // try to recover network error if (data.response && data.response.code && data.response.code >= 400) { - console.log('hls.js response error code: ' + data.response.code); + console.debug('hls.js response error code: ' + data.response.code); // Trigger failure differently depending on whether this is prior to start of playback, or after hls.destroy(); @@ -343,7 +343,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve // This could be a CORS error related to access control response headers - console.log('hls.js response error code: ' + data.response.code); + console.debug('hls.js response error code: ' + data.response.code); // Trigger failure differently depending on whether this is prior to start of playback, or after hls.destroy(); @@ -355,20 +355,20 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve onErrorInternal(instance, 'network'); } } else { - console.log("fatal network error encountered, try to recover"); + console.debug("fatal network error encountered, try to recover"); hls.startLoad(); } break; case Hls.ErrorTypes.MEDIA_ERROR: - console.log("fatal media error encountered, try to recover"); + console.debug("fatal media error encountered, try to recover"); var currentReject = reject; reject = null; handleHlsJsMediaError(instance, currentReject); break; default: - console.log('Cannot recover from hls error - destroy and trigger error'); + console.debug('Cannot recover from hls error - destroy and trigger error'); // cannot recover // Trigger failure differently depending on whether this is prior to start of playback, or after hls.destroy(); @@ -463,4 +463,4 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve getCrossOriginValue: getCrossOriginValue, getBufferedRanges: getBufferedRanges }; -}); \ No newline at end of file +}); diff --git a/src/components/htmlaudioplayer/plugin.js b/src/components/htmlaudioplayer/plugin.js index ef64bad04..8cae76bbe 100644 --- a/src/components/htmlaudioplayer/plugin.js +++ b/src/components/htmlaudioplayer/plugin.js @@ -16,7 +16,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp // Need to record the starting volume on each pass rather than querying elem.volume // This is due to iOS safari not allowing volume changes and always returning the system volume value var newVolume = Math.max(0, startingVolume - 0.15); - console.log('fading volume to ' + newVolume); + console.debug('fading volume to ' + newVolume); elem.volume = newVolume; if (newVolume <= 0) { @@ -113,7 +113,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp bindEvents(elem); var val = options.url; - console.log('playing url: ' + val); + console.debug('playing url: ' + val); // Convert to seconds var seconds = (options.playerStartPositionTicks || 0) / 10000000; @@ -298,7 +298,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp var errorCode = this.error ? (this.error.code || 0) : 0; var errorMessage = this.error ? (this.error.message || '') : ''; - console.log('Media element error: ' + errorCode.toString() + ' ' + errorMessage); + console.error('media element error: ' + errorCode.toString() + ' ' + errorMessage); var type; diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index 45eff41db..d19187c9e 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -1,5 +1,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackManager', 'appRouter', 'appSettings', 'connectionManager', 'htmlMediaHelper', 'itemHelper', 'fullscreenManager', 'globalize'], function (browser, require, events, appHost, loading, dom, playbackManager, appRouter, appSettings, connectionManager, htmlMediaHelper, itemHelper, fullscreenManager, globalize) { "use strict"; + /* globals cast */ var mediaManager; @@ -11,7 +12,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa try { parentNode.removeChild(elem); } catch (err) { - console.log('Error removing dialog element: ' + err); + console.error('error removing dialog element: ' + err); } } } @@ -242,7 +243,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa loading.show(); - console.log('prefetching hls playlist: ' + hlsPlaylistUrl); + console.debug('prefetching hls playlist: ' + hlsPlaylistUrl); return connectionManager.getApiClient(item.ServerId).ajax({ @@ -251,7 +252,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }).then(function () { - console.log('completed prefetching hls playlist: ' + hlsPlaylistUrl); + console.debug('completed prefetching hls playlist: ' + hlsPlaylistUrl); loading.hide(); streamInfo.url = hlsPlaylistUrl; @@ -260,7 +261,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }, function () { - console.log('error prefetching hls playlist: ' + hlsPlaylistUrl); + console.error('error prefetching hls playlist: ' + hlsPlaylistUrl); loading.hide(); return Promise.resolve(); @@ -357,6 +358,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return new Promise(function (resolve, reject) { require(['shaka'], function () { + /* globals shaka */ var player = new shaka.Player(elem); @@ -408,7 +410,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa lrd.media.streamType = cast.receiver.media.StreamType.OTHER; lrd.media.customData = options; - console.log('loading media url into mediaManager'); + console.debug('loading media url into media manager'); try { mediaManager.load(lrd); @@ -418,7 +420,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return Promise.resolve(); } catch (err) { - console.log('mediaManager error: ' + err); + console.debug('media manager error: ' + err); return Promise.reject(); } } @@ -460,11 +462,11 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa protocol = cast.player.api.CreateSmoothStreamingProtocol(host); } - console.log('loading playback url: ' + url); - console.log('contentType: ' + contentType); + console.debug('loading playback url: ' + url); + console.debug('content type: ' + contentType); host.onError = function (errorCode) { - console.log("Fatal Error - " + errorCode); + console.error("fatal Error - " + errorCode); }; mediaElement.autoplay = false; @@ -499,7 +501,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa elem.removeEventListener('error', onError); var val = options.url; - console.log('playing url: ' + val); + console.debug('playing url: ' + val); // Convert to seconds var seconds = (options.playerStartPositionTicks || 0) / 10000000; @@ -608,7 +610,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } else if (currentTrackEvents) { setTrackEventsSubtitleOffset(currentTrackEvents, offsetValue); } else { - console.log("No available track, cannot apply offset: ", offsetValue); + console.debug("No available track, cannot apply offset: ", offsetValue); } } }; @@ -727,22 +729,18 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa // https://msdn.microsoft.com/en-us/library/hh772507(v=vs.85).aspx var elemAudioTracks = elem.audioTracks || []; - console.log('found ' + elemAudioTracks.length + ' audio tracks'); + console.debug('found ' + elemAudioTracks.length + ' audio tracks'); for (i = 0, length = elemAudioTracks.length; i < length; i++) { if (audioIndex === i) { - console.log('setting audio track ' + i + ' to enabled'); + console.debug('setting audio track ' + i + ' to enabled'); elemAudioTracks[i].enabled = true; } else { - console.log('setting audio track ' + i + ' to disabled'); + console.debug('setting audio track ' + i + ' to disabled'); elemAudioTracks[i].enabled = false; } } - - setTimeout(function () { - elem.currentTime = elem.currentTime; - }, 100); }; self.stop = function (destroyPlayer) { @@ -911,7 +909,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function onError() { var errorCode = this.error ? (this.error.code || 0) : 0; var errorMessage = this.error ? (this.error.message || '') : ''; - console.log('Media element error: ' + errorCode.toString() + ' ' + errorMessage); + console.error('media element error: ' + errorCode.toString() + ' ' + errorMessage); var type; @@ -1058,8 +1056,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return i.DeliveryUrl; }), workerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker.js", + legacyWorkerUrl: appRouter.baseUrl() + "/libraries/subtitles-octopus-worker-legacy.js", onError: function() { - htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror') + htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror'); } }; require(['JavascriptSubtitlesOctopus'], function(SubtitlesOctopus) { @@ -1115,9 +1114,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function renderSsaAss(videoElement, track, item) { if (supportsCanvas() && supportsWebWorkers()) { + console.debug('rendering subtitles with SubtitlesOctopus'); renderWithSubtitlesOctopus(videoElement, track, item); } else { - console.log('rendering subtitles with libjass'); + console.debug('rendering subtitles with libjass'); renderWithLibjass(videoElement, track, item); } } @@ -1137,7 +1137,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var videoElement = self._mediaElement; var width = videoElement.offsetWidth; var height = videoElement.offsetHeight; - console.log('videoElement resized: ' + width + 'x' + height); + console.debug('videoElement resized: ' + width + 'x' + height); renderer.resize(width, height, 0, 0); } } @@ -1254,7 +1254,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa trackElement.removeCue(trackElement.cues[0]); } } catch (e) { - console.log('Error removing cue from textTrack'); + console.error('error removing cue from textTrack'); } trackElement.mode = 'disabled'; @@ -1268,7 +1268,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa fetchSubtitles(track, item).then(function (data) { // show in ui - console.log('downloaded ' + data.TrackEvents.length + ' track events'); + console.debug('downloaded ' + data.TrackEvents.length + ' track events'); // add some cues to show the text // in safari, the cues need to be added before setting the track mode to showing data.TrackEvents.forEach(function (trackEvent) { @@ -1294,7 +1294,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa try { clock.seek(timeMs / 1000); } catch (err) { - console.log('Error in libjass: ' + err); + console.error('error in libjass: ' + err); } return; } @@ -1327,7 +1327,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa function setCurrentTrackElement(streamIndex) { - console.log('Setting new text track index to: ' + streamIndex); + console.debug('setting new text track index to: ' + streamIndex); var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource); @@ -1348,38 +1348,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa } } - function updateTextStreamUrls(startPositionTicks) { - - if (!supportsTextTracks()) { - return; - } - - var allTracks = self._mediaElement.textTracks; // get list of tracks - var i; - var track; - - for (i = 0; i < allTracks.length; i++) { - - track = allTracks[i]; - - // This throws an error in IE, but is fine in chrome - // In IE it's not necessary anyway because changing the src seems to be enough - try { - while (track.cues.length) { - track.removeCue(track.cues[0]); - } - } catch (e) { - console.log('Error removing cue from textTrack'); - } - } - - var tracks = self._mediaElement.querySelectorAll('track'); - for (i = 0; i < tracks.length; i++) { - track = tracks[i]; - track.src = replaceQueryString(track.src, 'startPositionTicks', startPositionTicks); - } - } - function createMediaElement(options) { if (browser.tv || browser.iOS || browser.mobile) { @@ -1590,7 +1558,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }; function onPictureInPictureError(err) { - console.log('Picture in picture error: ' + err.toString()); + console.error('Picture in picture error: ' + err.toString()); } HtmlVideoPlayer.prototype.setPictureInPictureEnabled = function (isEnabled) { @@ -1651,9 +1619,13 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (document.AirPlayEnabled) { if (video) { if (isEnabled) { - video.requestAirPlay().catch(onAirPlayError); + video.requestAirPlay().catch(function(err) { + console.error("Error requesting AirPlay", err) + }); } else { - document.exitAirPLay().catch(onAirPlayError); + document.exitAirPLay().catch(function(err) { + console.error("Error exiting AirPlay", err) + }); } } } else { diff --git a/src/components/humanedate.js b/src/components/humanedate.js index 85d3a6d3b..26ce26d94 100644 --- a/src/components/humanedate.js +++ b/src/components/humanedate.js @@ -25,6 +25,7 @@ define(["datetime"], function (datetime) { if (seconds < 0) { seconds = Math.abs(seconds); } + // eslint-disable-next-line no-cond-assign for (; format = time_formats[i++];) { if (seconds < format[0]) { if (2 == format.length) { diff --git a/src/components/imagedownloader/imagedownloader.js b/src/components/imagedownloader/imagedownloader.js index f984ce22a..ce53b5cf0 100644 --- a/src/components/imagedownloader/imagedownloader.js +++ b/src/components/imagedownloader/imagedownloader.js @@ -117,7 +117,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' html += '
'; html += ''; - html += ''; + html += ''; html += '
'; } @@ -277,7 +277,7 @@ define(['loading', 'apphost', 'dialogHelper', 'connectionManager', 'imageLoader' if (enableFooterButtons) { html += '
'; - html += ''; + html += ''; html += '
'; } diff --git a/src/components/images/imageFetcher.js b/src/components/images/imageFetcher.js index 54d3ef750..1e13cebc7 100644 --- a/src/components/images/imageFetcher.js +++ b/src/components/images/imageFetcher.js @@ -35,4 +35,4 @@ define(['dom'], function (dom) { loadImage: loadImage }; -}); \ No newline at end of file +}); diff --git a/src/components/images/imageLoader.js b/src/components/images/imageLoader.js index 80fcbbd3f..764be06fd 100644 --- a/src/components/images/imageLoader.js +++ b/src/components/images/imageLoader.js @@ -122,4 +122,4 @@ define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', self.getPrimaryImageAspectRatio = getPrimaryImageAspectRatio; return self; -}); \ No newline at end of file +}); diff --git a/src/components/imageuploader/imageuploader.js b/src/components/imageuploader/imageuploader.js index 198f54080..400646f66 100644 --- a/src/components/imageuploader/imageuploader.js +++ b/src/components/imageuploader/imageuploader.js @@ -47,7 +47,7 @@ define(['dialogHelper', 'connectionManager', 'dom', 'loading', 'scrollHelper', ' }; reader.onabort = function () { loading.hide(); - console.log('File read cancelled'); + console.debug('File read cancelled'); }; // Closure to capture the file information. diff --git a/src/components/indicators/indicators.js b/src/components/indicators/indicators.js index 4b9b0a8c6..e41ccb977 100644 --- a/src/components/indicators/indicators.js +++ b/src/components/indicators/indicators.js @@ -62,7 +62,7 @@ define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], fun startDate = datetime.parseISO8601Date(item.StartDate).getTime(); endDate = datetime.parseISO8601Date(item.EndDate).getTime(); } catch (err) { - console.log(err); + console.error(err); } var now = new Date().getTime(); @@ -174,7 +174,7 @@ define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], fun return '
Unaired
'; } } catch (err) { - console.log(err); + console.error(err); } } return '
Missing
'; diff --git a/src/components/serverNotifications/gamepadtokey.js b/src/components/input/gamepadtokey.js similarity index 64% rename from src/components/serverNotifications/gamepadtokey.js rename to src/components/input/gamepadtokey.js index abf3ddb38..5356bcbb4 100644 --- a/src/components/serverNotifications/gamepadtokey.js +++ b/src/components/input/gamepadtokey.js @@ -251,114 +251,150 @@ require(['apphost'], function (appHost) { } } + var inputLoopTimer; function runInputLoop() { // Get the latest gamepad state. - var gamepads; - if (navigator.getGamepads) { - gamepads = navigator.getGamepads(); - } else if (navigator.webkitGetGamepads) { - gamepads = navigator.webkitGetGamepads(); - } - gamepads = gamepads || []; - var i; - var j; - var len; - for (i = 0, len = gamepads.length; i < len; i++) { + var gamepads = navigator.getGamepads(); + for (var i = 0, len = gamepads.length; i < len; i++) { var gamepad = gamepads[i]; - if (gamepad) { - // Iterate through the axes - var axes = gamepad.axes; - var leftStickX = axes[0]; - var leftStickY = axes[1]; - if (leftStickX > _THUMB_STICK_THRESHOLD) { // Right - _ButtonPressedState.setleftThumbstickRight(true); - } else if (leftStickX < -_THUMB_STICK_THRESHOLD) { // Left - _ButtonPressedState.setleftThumbstickLeft(true); - } else if (leftStickY < -_THUMB_STICK_THRESHOLD) { // Up - _ButtonPressedState.setleftThumbstickUp(true); - } else if (leftStickY > _THUMB_STICK_THRESHOLD) { // Down - _ButtonPressedState.setleftThumbstickDown(true); - } else { - _ButtonPressedState.setleftThumbstickLeft(false); - _ButtonPressedState.setleftThumbstickRight(false); - _ButtonPressedState.setleftThumbstickUp(false); - _ButtonPressedState.setleftThumbstickDown(false); - } - // Iterate through the buttons to see if Left thumbstick, DPad, A and B are pressed. - var buttons = gamepad.buttons; - for (j = 0, len = buttons.length; j < len; j++) { - if (ProcessedButtons.indexOf(j) !== -1) { - - if (buttons[j].pressed) { - switch (j) { - case _GAMEPAD_DPAD_UP_BUTTON_INDEX: - _ButtonPressedState.setdPadUp(true); - break; - case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: - _ButtonPressedState.setdPadDown(true); - break; - case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: - _ButtonPressedState.setdPadLeft(true); - break; - case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: - _ButtonPressedState.setdPadRight(true); - break; - case _GAMEPAD_A_BUTTON_INDEX: - _ButtonPressedState.setgamepadA(true); - break; - case _GAMEPAD_B_BUTTON_INDEX: - _ButtonPressedState.setgamepadB(true); - break; - default: - // No-op - break; - } - } else { - switch (j) { - case _GAMEPAD_DPAD_UP_BUTTON_INDEX: - if (_ButtonPressedState.getdPadUp()) { - _ButtonPressedState.setdPadUp(false); - } - break; - case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: - if (_ButtonPressedState.getdPadDown()) { - _ButtonPressedState.setdPadDown(false); - } - break; - case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: - if (_ButtonPressedState.getdPadLeft()) { - _ButtonPressedState.setdPadLeft(false); - } - break; - case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: - if (_ButtonPressedState.getdPadRight()) { - _ButtonPressedState.setdPadRight(false); - } - break; - case _GAMEPAD_A_BUTTON_INDEX: - if (_ButtonPressedState.getgamepadA()) { - _ButtonPressedState.setgamepadA(false); - } - break; - case _GAMEPAD_B_BUTTON_INDEX: - if (_ButtonPressedState.getgamepadB()) { - _ButtonPressedState.setgamepadB(false); - } - break; - default: - // No-op - break; - } + if (!gamepad) { + continue; + } + // Iterate through the axes + var axes = gamepad.axes; + var leftStickX = axes[0]; + var leftStickY = axes[1]; + if (leftStickX > _THUMB_STICK_THRESHOLD) { // Right + _ButtonPressedState.setleftThumbstickRight(true); + } else if (leftStickX < -_THUMB_STICK_THRESHOLD) { // Left + _ButtonPressedState.setleftThumbstickLeft(true); + } else if (leftStickY < -_THUMB_STICK_THRESHOLD) { // Up + _ButtonPressedState.setleftThumbstickUp(true); + } else if (leftStickY > _THUMB_STICK_THRESHOLD) { // Down + _ButtonPressedState.setleftThumbstickDown(true); + } else { + _ButtonPressedState.setleftThumbstickLeft(false); + _ButtonPressedState.setleftThumbstickRight(false); + _ButtonPressedState.setleftThumbstickUp(false); + _ButtonPressedState.setleftThumbstickDown(false); + } + // Iterate through the buttons to see if Left thumbstick, DPad, A and B are pressed. + var buttons = gamepad.buttons; + for (var j = 0, len = buttons.length; j < len; j++) { + if (ProcessedButtons.indexOf(j) !== -1) { + if (buttons[j].pressed) { + switch (j) { + case _GAMEPAD_DPAD_UP_BUTTON_INDEX: + _ButtonPressedState.setdPadUp(true); + break; + case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: + _ButtonPressedState.setdPadDown(true); + break; + case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: + _ButtonPressedState.setdPadLeft(true); + break; + case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: + _ButtonPressedState.setdPadRight(true); + break; + case _GAMEPAD_A_BUTTON_INDEX: + _ButtonPressedState.setgamepadA(true); + break; + case _GAMEPAD_B_BUTTON_INDEX: + _ButtonPressedState.setgamepadB(true); + break; + default: + // No-op + break; + } + } else { + switch (j) { + case _GAMEPAD_DPAD_UP_BUTTON_INDEX: + if (_ButtonPressedState.getdPadUp()) { + _ButtonPressedState.setdPadUp(false); + } + break; + case _GAMEPAD_DPAD_DOWN_BUTTON_INDEX: + if (_ButtonPressedState.getdPadDown()) { + _ButtonPressedState.setdPadDown(false); + } + break; + case _GAMEPAD_DPAD_LEFT_BUTTON_INDEX: + if (_ButtonPressedState.getdPadLeft()) { + _ButtonPressedState.setdPadLeft(false); + } + break; + case _GAMEPAD_DPAD_RIGHT_BUTTON_INDEX: + if (_ButtonPressedState.getdPadRight()) { + _ButtonPressedState.setdPadRight(false); + } + break; + case _GAMEPAD_A_BUTTON_INDEX: + if (_ButtonPressedState.getgamepadA()) { + _ButtonPressedState.setgamepadA(false); + } + break; + case _GAMEPAD_B_BUTTON_INDEX: + if (_ButtonPressedState.getgamepadB()) { + _ButtonPressedState.setgamepadB(false); + } + break; + default: + // No-op + break; } } } } } // Schedule the next one - requestAnimationFrame(runInputLoop); + inputLoopTimer = requestAnimationFrame(runInputLoop); } - runInputLoop(); + function startInputLoop() { + if (!inputLoopTimer) { + runInputLoop(); + } + } + + function stopInputLoop() { + cancelAnimationFrame(inputLoopTimer); + inputLoopTimer = undefined; + } + + function isGamepadConnected() { + var gamepads = navigator.getGamepads(); + for (var i = 0, len = gamepads.length; i < len; i++) { + var gamepad = gamepads[i]; + if (gamepad && gamepad.connected) { + return true; + } + } + return false; + } + + function onFocusOrGamepadAttach(e) { + if (isGamepadConnected() && document.hasFocus()) { + console.log("Gamepad connected! Starting input loop"); + startInputLoop(); + } + } + + function onFocusOrGamepadDetach(e) { + if (!isGamepadConnected() || !document.hasFocus()) { + console.log("Gamepad disconnected! No other gamepads are connected, stopping input loop"); + stopInputLoop(); + } else { + console.log("Gamepad disconnected! There are gamepads still connected."); + } + } + + // Event listeners for any change in gamepads' state. + window.addEventListener("gamepaddisconnected", onFocusOrGamepadDetach); + window.addEventListener("gamepadconnected", onFocusOrGamepadAttach); + window.addEventListener("blur", onFocusOrGamepadDetach); + window.addEventListener("focus", onFocusOrGamepadAttach); + + onFocusOrGamepadAttach(); // The gamepadInputEmulation is a string property that exists in JavaScript UWAs and in WebViews in UWAs. // It won't exist in Win8.1 style apps or browsers. @@ -369,4 +405,4 @@ require(['apphost'], function (appHost) { window.navigator.gamepadInputEmulation = "gamepad"; } -}); \ No newline at end of file +}); diff --git a/src/components/keyboardnavigation.js b/src/components/input/keyboardnavigation.js similarity index 84% rename from src/components/keyboardnavigation.js rename to src/components/input/keyboardnavigation.js index 4f3ed873d..0359ee743 100644 --- a/src/components/keyboardnavigation.js +++ b/src/components/input/keyboardnavigation.js @@ -1,8 +1,6 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) { "use strict"; - console.log("keyboardnavigation"); - /** * Key name mapping. */ @@ -45,7 +43,7 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) try { hasFieldKey = "key" in new KeyboardEvent("keydown"); } catch (e) { - console.log("error checking 'key' field"); + console.error("error checking 'key' field"); } if (!hasFieldKey) { @@ -142,12 +140,23 @@ define(["inputManager", "layoutManager"], function (inputManager, layoutManager) } if (capture) { - console.log("Disabling default event handling"); + console.debug("disabling default event handling"); e.preventDefault(); } }); } + // Gamepad initialisation. No script is required if no gamepads are present at init time, saving a bit of resources. + // Whenever the gamepad is connected, we hand all the control of the gamepad to gamepadtokey.js by removing the event handler + function attachGamepadScript(e) { + console.log("Gamepad connected! Attaching gamepadtokey.js script"); + window.removeEventListener("gamepadconnected", attachGamepadScript); + require(["components/input/gamepadtokey"]); + } + + // No need to check for gamepads manually at load time, the eventhandler will be fired for that + window.addEventListener("gamepadconnected", attachGamepadScript); + return { enable: enable, getKeyName: getKeyName, diff --git a/src/components/serverNotifications/mouseManager.js b/src/components/input/mouseManager.js similarity index 99% rename from src/components/serverNotifications/mouseManager.js rename to src/components/input/mouseManager.js index ffea3b01f..78057c0bf 100644 --- a/src/components/serverNotifications/mouseManager.js +++ b/src/components/input/mouseManager.js @@ -166,4 +166,4 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd events.on(layoutManager, 'modechange', initMouse); return self; -}); \ No newline at end of file +}); diff --git a/src/components/itemsrefresher.js b/src/components/itemsrefresher.js index 46956d2df..6da74eef8 100644 --- a/src/components/itemsrefresher.js +++ b/src/components/itemsrefresher.js @@ -278,4 +278,4 @@ define(['playbackManager', 'serverNotifications', 'events'], function (playbackM }; return ItemsRefresher; -}); \ No newline at end of file +}); diff --git a/src/components/lazyloader/lazyloader-intersectionobserver.js b/src/components/lazyloader/lazyloader-intersectionobserver.js index 1935f65a3..5f8374260 100644 --- a/src/components/lazyloader/lazyloader-intersectionobserver.js +++ b/src/components/lazyloader/lazyloader-intersectionobserver.js @@ -100,4 +100,4 @@ define(['require', 'browser'], function (require, browser) { }; return LazyLoader; -}); \ No newline at end of file +}); diff --git a/src/components/lazyloader/lazyloader-scroll.js b/src/components/lazyloader/lazyloader-scroll.js index 318f6dbea..d5120146c 100644 --- a/src/components/lazyloader/lazyloader-scroll.js +++ b/src/components/lazyloader/lazyloader-scroll.js @@ -186,4 +186,4 @@ define(['visibleinviewport', 'dom', 'browser'], function (visibleinviewport, dom }; return LazyLoader; -}); \ No newline at end of file +}); diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.js b/src/components/libraryoptionseditor/libraryoptionseditor.js index f9f63c9b5..193533bfc 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.js +++ b/src/components/libraryoptionseditor/libraryoptionseditor.js @@ -58,7 +58,7 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct for (var i = 0; i < plugins.length; i++) { var plugin = plugins[i]; html += '
'; - html += 'live_tv'; + html += ''; html += '
'; html += '

'; html += plugin.Name; @@ -463,7 +463,7 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct if (!typeOptions) { typeOptions = { - Type: type + Type: originalTypeOption.Type }; options.TypeOptions.push(typeOptions); } diff --git a/src/components/libraryoptionseditor/libraryoptionseditor.template.html b/src/components/libraryoptionseditor/libraryoptionseditor.template.html index ebfdacaa1..377488f44 100644 --- a/src/components/libraryoptionseditor/libraryoptionseditor.template.html +++ b/src/components/libraryoptionseditor/libraryoptionseditor.template.html @@ -147,4 +147,4 @@
${SaveSubtitlesIntoMediaFoldersHelp}

-
\ No newline at end of file +
diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js index 4ab317155..b38d601e3 100644 --- a/src/components/listview/listview.js +++ b/src/components/listview/listview.js @@ -269,7 +269,6 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan if (options.image !== false) { var imgUrl = options.imageSource === 'channel' ? getChannelImageUrl(item, downloadWidth) : getImageUrl(item, downloadWidth); - console.log(imgUrl); var imageClass = isLargeStyle ? 'listItemImage listItemImage-large' : 'listItemImage'; if (isLargeStyle && layoutManager.tv) { diff --git a/src/components/loading/loading.js b/src/components/loading/loading.js index 510f31121..d6c00347c 100644 --- a/src/components/loading/loading.js +++ b/src/components/loading/loading.js @@ -81,4 +81,4 @@ define(['components/loading/loadingLegacy', 'browser', 'css!./loading'], functio } } }; -}); \ No newline at end of file +}); diff --git a/src/components/maintabsmanager.js b/src/components/maintabsmanager.js index 64e25b487..257147001 100644 --- a/src/components/maintabsmanager.js +++ b/src/components/maintabsmanager.js @@ -264,4 +264,4 @@ define(['dom', 'browser', 'events', 'emby-tabs', 'emby-button'], function (dom, getTabsElement: getTabsElement, selectedTabIndex: selectedTabIndex }; -}); \ No newline at end of file +}); diff --git a/src/components/mediainfo/mediainfo.js b/src/components/mediainfo/mediainfo.js index 3b25b58ff..188ea9a07 100644 --- a/src/components/mediainfo/mediainfo.js +++ b/src/components/mediainfo/mediainfo.js @@ -57,7 +57,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater miscInfo.push(text); } catch (e) { - console.log("Error parsing date: " + item.StartDate); + console.error("error parsing date: " + item.StartDate); } } @@ -143,7 +143,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = datetime.toLocaleDateString(date); miscInfo.push(text); } catch (e) { - console.log("Error parsing date: " + item.PremiereDate); + console.error("error parsing date: " + item.PremiereDate); } } } @@ -176,7 +176,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater miscInfo.push(text); } } catch (e) { - console.log("Error parsing date: " + item.StartDate); + console.error("error parsing date: " + item.StartDate); } } @@ -200,7 +200,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater } } catch (e) { - console.log("Error parsing date: " + item.EndDate); + console.error("error parsing date: " + item.EndDate); } } @@ -248,7 +248,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = globalize.translate('OriginalAirDateValue', datetime.toLocaleDateString(date)); miscInfo.push(text); } catch (e) { - console.log("Error parsing date: " + item.PremiereDate); + console.error("error parsing date: " + item.PremiereDate); } } else if (item.ProductionYear) { miscInfo.push(item.ProductionYear); @@ -267,7 +267,7 @@ define(['datetime', 'globalize', 'appRouter', 'itemHelper', 'indicators', 'mater text = datetime.parseISO8601Date(item.PremiereDate).getFullYear(); miscInfo.push(text); } catch (e) { - console.log("Error parsing date: " + item.PremiereDate); + console.error("error parsing date: " + item.PremiereDate); } } } diff --git a/src/components/metadataeditor/metadataeditor.js b/src/components/metadataeditor/metadataeditor.js index 030fdc80c..e8736258f 100644 --- a/src/components/metadataeditor/metadataeditor.js +++ b/src/components/metadataeditor/metadataeditor.js @@ -477,7 +477,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi html += '
'; if (formatString) { - html += ''; + html += ''; } html += '
'; @@ -917,7 +917,7 @@ define(['itemHelper', 'dom', 'layoutManager', 'dialogHelper', 'datetime', 'loadi for (var i = 0; i < items.length; i++) { html += '
'; - html += 'live_tv'; + html += ''; html += '
'; diff --git a/src/components/metadataeditor/personeditor.js b/src/components/metadataeditor/personeditor.js index 7883cfca1..9fb6fdec6 100644 --- a/src/components/metadataeditor/personeditor.js +++ b/src/components/metadataeditor/personeditor.js @@ -96,4 +96,4 @@ define(['dialogHelper', 'layoutManager', 'globalize', 'require', 'paper-icon-but return { show: show }; -}); \ No newline at end of file +}); diff --git a/src/components/multidownload.js b/src/components/multidownload.js index a1881b8db..d11e52de1 100644 --- a/src/components/multidownload.js +++ b/src/components/multidownload.js @@ -63,4 +63,4 @@ define(['browser'], function (browser) { download(url); }); }; -}); \ No newline at end of file +}); diff --git a/src/components/nowplayingbar/nowplayingbar.js b/src/components/nowplayingbar/nowplayingbar.js index 9a96220e5..8da9b9c05 100644 --- a/src/components/nowplayingbar/nowplayingbar.js +++ b/src/components/nowplayingbar/nowplayingbar.js @@ -54,7 +54,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', html += '
'; - html += ''; + html += ''; html += '
'; html += ''; @@ -591,8 +591,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', } function onPlaybackStart(e, state) { - - //console.log('nowplaying event: ' + e.type); + console.debug('nowplaying event: ' + e.type); var player = this; @@ -637,7 +636,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', function onPlaybackStopped(e, state) { - //console.log('nowplaying event: ' + e.type); + console.debug('nowplaying event: ' + e.type); var player = this; if (player.isLocalPlayer) { @@ -663,7 +662,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', function onStateChanged(event, state) { - //console.log('nowplaying event: ' + e.type); + console.debug('nowplaying event: ' + event.type); var player = this; if (!state.NowPlayingItem || layoutManager.tv) { diff --git a/src/components/packagemanager.js b/src/components/packagemanager.js index 03ed1006c..46f470452 100644 --- a/src/components/packagemanager.js +++ b/src/components/packagemanager.js @@ -149,4 +149,4 @@ define(['appSettings', 'pluginManager'], function (appSettings, pluginManager) { }; return new PackageManager(); -}); \ No newline at end of file +}); diff --git a/src/components/photoplayer/plugin.js b/src/components/photoplayer/plugin.js index 6629fbfb0..4ebdbbd6d 100644 --- a/src/components/photoplayer/plugin.js +++ b/src/components/photoplayer/plugin.js @@ -43,4 +43,4 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa }; return PhotoPlayer; -}); \ No newline at end of file +}); diff --git a/src/components/playback/experimentalwarnings.js b/src/components/playback/experimentalwarnings.js index 17b1af025..2d1ef53c1 100644 --- a/src/components/playback/experimentalwarnings.js +++ b/src/components/playback/experimentalwarnings.js @@ -94,4 +94,4 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function ( }; return ExpirementalPlaybackWarnings; -}); \ No newline at end of file +}); diff --git a/src/components/playback/playaccessvalidation.js b/src/components/playback/playaccessvalidation.js index 35d8314fc..46a6f7546 100644 --- a/src/components/playback/playaccessvalidation.js +++ b/src/components/playback/playaccessvalidation.js @@ -47,4 +47,4 @@ define(['connectionManager', 'globalize'], function (connectionManager, globaliz }; return PlayAccessValidation; -}); \ No newline at end of file +}); diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index da04a2e13..3a3bddd98 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -57,7 +57,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId); } - //console.log(method + '-' + JSON.stringify(info)); + console.debug(method + '-' + JSON.stringify(info)); var apiClient = connectionManager.getApiClient(serverId); apiClient[method](info); } @@ -1024,7 +1024,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla currentTargetInfo = targetInfo; if (targetInfo) { - console.log('Active player: ' + JSON.stringify(targetInfo)); + console.debug('Active player: ' + JSON.stringify(targetInfo)); } if (player && player.isLocalPlayer) { @@ -2828,7 +2828,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla if (newItemInfo) { - console.log('playing next track'); + console.debug('playing next track'); var newItemPlayOptions = newItemInfo.item.playOptions || getDefaultPlayOptions(); @@ -3118,7 +3118,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla // medianotsupported var errorType = error.type; - console.log('playbackmanager playback error type: ' + (errorType || '')); + console.debug('playbackmanager playback error type: ' + (errorType || '')); var streamInfo = error.streamInfo || getPlayerData(player).streamInfo; @@ -3401,7 +3401,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla function getLiveStreamMediaInfo(player, streamInfo, mediaSource, liveStreamId, serverId) { - console.log('getLiveStreamMediaInfo'); + console.debug('getLiveStreamMediaInfo'); streamInfo.lastMediaInfoQuery = new Date().getTime(); @@ -3961,7 +3961,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla }; PlaybackManager.prototype.sendCommand = function (cmd, player) { - console.log('MediaController received command: ' + cmd.Name); + console.debug('MediaController received command: ' + cmd.Name); switch (cmd.Name) { case 'SetRepeatMode': this.setRepeatMode(cmd.Arguments.RepeatMode, player); diff --git a/src/components/playback/playbackorientation.js b/src/components/playback/playbackorientation.js index 3253d8acd..5b178dbf0 100644 --- a/src/components/playback/playbackorientation.js +++ b/src/components/playback/playbackorientation.js @@ -9,7 +9,7 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager function onOrientationChangeError(err) { orientationLocked = false; - console.log('error locking orientation: ' + err); + console.error('error locking orientation: ' + err); } events.on(playbackManager, 'playbackstart', function (e, player, state) { @@ -46,10 +46,10 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager try { unlockOrientation(); } catch (err) { - console.log('error unlocking orientation: ' + err); + console.error('error unlocking orientation: ' + err); } orientationLocked = false; } } }); -}); \ No newline at end of file +}); diff --git a/src/components/playback/playmethodhelper.js b/src/components/playback/playmethodhelper.js index 4e85f8709..75af04035 100644 --- a/src/components/playback/playmethodhelper.js +++ b/src/components/playback/playmethodhelper.js @@ -21,4 +21,4 @@ define([], function () { return { getDisplayPlayMethod: getDisplayPlayMethod }; -}); \ No newline at end of file +}); diff --git a/src/components/playback/playqueuemanager.js b/src/components/playback/playqueuemanager.js index ed2076a81..429c4027f 100644 --- a/src/components/playback/playqueuemanager.js +++ b/src/components/playback/playqueuemanager.js @@ -230,4 +230,4 @@ define([], function () { }; return PlayQueueManager; -}); \ No newline at end of file +}); diff --git a/src/components/playback/remotecontrolautoplay.js b/src/components/playback/remotecontrolautoplay.js index d8316b87e..90a872cc6 100644 --- a/src/components/playback/remotecontrolautoplay.js +++ b/src/components/playback/remotecontrolautoplay.js @@ -32,16 +32,16 @@ define(['events', 'playbackManager'], function (events, playbackManager) { } if (!oldPlayer.isLocalPlayer) { - console.log('Skipping remote control autoplay because oldPlayer is not a local player'); + console.debug('Skipping remote control autoplay because oldPlayer is not a local player'); return; } if (newPlayer.isLocalPlayer) { - console.log('Skipping remote control autoplay because newPlayer is a local player'); + console.debug('Skipping remote control autoplay because newPlayer is a local player'); return; } transferPlayback(oldPlayer, newPlayer); }); -}); \ No newline at end of file +}); diff --git a/src/components/playback/volumeosd.js b/src/components/playback/volumeosd.js index de20aaab1..5d2c90ddb 100644 --- a/src/components/playback/volumeosd.js +++ b/src/components/playback/volumeosd.js @@ -11,7 +11,7 @@ define(['events', 'playbackManager', 'dom', 'browser', 'css!./iconosd', 'materia function getOsdElementHtml() { var html = ''; - html += ''; + html += ''; html += '
'; diff --git a/src/components/playbacksettings/playbacksettings.js b/src/components/playbacksettings/playbacksettings.js index 69915b18b..d249b5b98 100644 --- a/src/components/playbacksettings/playbacksettings.js +++ b/src/components/playbacksettings/playbacksettings.js @@ -342,4 +342,4 @@ define(['require', 'browser', 'appSettings', 'apphost', 'focusManager', 'quality }; return PlaybackSettings; -}); \ No newline at end of file +}); diff --git a/src/components/playbacksettings/playbacksettings.template.html b/src/components/playbacksettings/playbacksettings.template.html index 06cfe3f3d..0c8b726a4 100644 --- a/src/components/playbacksettings/playbacksettings.template.html +++ b/src/components/playbacksettings/playbacksettings.template.html @@ -86,4 +86,4 @@ - \ No newline at end of file + diff --git a/src/components/playmenu.js b/src/components/playmenu.js index 7225ff94e..a410da698 100644 --- a/src/components/playmenu.js +++ b/src/components/playmenu.js @@ -72,4 +72,4 @@ define(['actionsheet', 'datetime', 'playbackManager', 'globalize', 'appSettings' return { show: show }; -}); \ No newline at end of file +}); diff --git a/src/components/pluginManager.js b/src/components/pluginManager.js index ec65e63e6..2126d73b3 100644 --- a/src/components/pluginManager.js +++ b/src/components/pluginManager.js @@ -27,7 +27,7 @@ define(['events'], function (events) { PluginManager.prototype.loadPlugin = function (url) { - console.log('Loading plugin: ' + url); + console.debug('Loading plugin: ' + url); var instance = this; return new Promise(function (resolve, reject) { @@ -146,4 +146,4 @@ define(['events'], function (events) { }; return new PluginManager(); -}); \ No newline at end of file +}); diff --git a/src/components/polyfills/focusPreventScroll.js b/src/components/polyfills/focusPreventScroll.js index 6511c0426..6df9e9928 100644 --- a/src/components/polyfills/focusPreventScroll.js +++ b/src/components/polyfills/focusPreventScroll.js @@ -12,6 +12,7 @@ if (HTMLElement.prototype.nativeFocus === undefined) { }, true); var opts = Object.defineProperty({}, "preventScroll", { + // eslint-disable-next-line getter-return get: function () { supportsPreventScrollOption = true; } @@ -19,7 +20,7 @@ if (HTMLElement.prototype.nativeFocus === undefined) { focusElem.focus(opts); } catch (e) { - console.log("error checking preventScroll support"); + console.error("error checking preventScroll support"); } if (!supportsPreventScrollOption) { diff --git a/src/components/polyfills/objectassign.js b/src/components/polyfills/objectassign.js index bf8d7118a..85f55aa14 100644 --- a/src/components/polyfills/objectassign.js +++ b/src/components/polyfills/objectassign.js @@ -11,6 +11,7 @@ if (typeof Object.assign != 'function') { var source = arguments[index]; if (source !== undefined && source !== null) { for (var nextKey in source) { + // eslint-disable-next-line no-prototype-builtins if (source.hasOwnProperty(nextKey)) { output[nextKey] = source[nextKey]; } diff --git a/src/components/prompt/nativeprompt.js b/src/components/prompt/nativeprompt.js index b0634bd42..ba7f1a9a4 100644 --- a/src/components/prompt/nativeprompt.js +++ b/src/components/prompt/nativeprompt.js @@ -25,4 +25,4 @@ define([], function () { return Promise.reject(result); } }; -}); \ No newline at end of file +}); diff --git a/src/components/prompt/prompt.js b/src/components/prompt/prompt.js index 6e8e019c8..8f4f839ea 100644 --- a/src/components/prompt/prompt.js +++ b/src/components/prompt/prompt.js @@ -101,4 +101,4 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're }); }); }; -}); \ No newline at end of file +}); diff --git a/src/components/qualityoptions.js b/src/components/qualityoptions.js index e46a690e8..5ad69cb79 100644 --- a/src/components/qualityoptions.js +++ b/src/components/qualityoptions.js @@ -160,4 +160,4 @@ define(['globalize'], function (globalize) { getVideoQualityOptions: getVideoQualityOptions, getAudioQualityOptions: getAudioQualityOptions }; -}); \ No newline at end of file +}); diff --git a/src/components/recordingcreator/recordingcreator.js b/src/components/recordingcreator/recordingcreator.js index 614d483b2..a51fac430 100644 --- a/src/components/recordingcreator/recordingcreator.js +++ b/src/components/recordingcreator/recordingcreator.js @@ -202,4 +202,4 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c return { show: showEditor }; -}); \ No newline at end of file +}); diff --git a/src/components/recordingcreator/recordingeditor.js b/src/components/recordingcreator/recordingeditor.js index 3a1d4ba94..86c731ad2 100644 --- a/src/components/recordingcreator/recordingeditor.js +++ b/src/components/recordingcreator/recordingeditor.js @@ -159,4 +159,4 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c return { show: showEditor }; -}); \ No newline at end of file +}); diff --git a/src/components/recordingcreator/recordinghelper.js b/src/components/recordingcreator/recordinghelper.js index 4bfd316c7..a071cb203 100644 --- a/src/components/recordingcreator/recordinghelper.js +++ b/src/components/recordingcreator/recordinghelper.js @@ -214,4 +214,4 @@ define(['globalize', 'loading', 'connectionManager'], function (globalize, loadi cancelTimerWithConfirmation: cancelTimerWithConfirmation, cancelSeriesTimerWithConfirmation: cancelSeriesTimerWithConfirmation }; -}); \ No newline at end of file +}); diff --git a/src/components/recordingcreator/seriesrecordingeditor.js b/src/components/recordingcreator/seriesrecordingeditor.js index 73a98cf5e..62accd5b6 100644 --- a/src/components/recordingcreator/seriesrecordingeditor.js +++ b/src/components/recordingcreator/seriesrecordingeditor.js @@ -267,4 +267,4 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c show: showEditor, embed: embed }; -}); \ No newline at end of file +}); diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js index 11f14fdc8..90115b3a8 100644 --- a/src/components/remotecontrol/remotecontrol.js +++ b/src/components/remotecontrol/remotecontrol.js @@ -1,4 +1,4 @@ -define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageLoader", "playbackManager", "nowPlayingHelper", "events", "connectionManager", "apphost", "globalize", "cardStyle", "emby-itemscontainer", "css!./remotecontrol.css", "emby-ratingbutton"], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize) { +define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageLoader", "playbackManager", "nowPlayingHelper", "events", "connectionManager", "apphost", "globalize", "layoutManager", "userSettings", "cardStyle", "emby-itemscontainer", "css!./remotecontrol.css", "emby-ratingbutton"], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings) { "use strict"; function showAudioMenu(context, player, button, item) { @@ -127,7 +127,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL maxHeight: 300 }) : null; - console.log("updateNowPlayingInfo"); + console.debug("updateNowPlayingInfo"); setImageUrl(context, url); if (item) { backdrop.setBackdrops([item]); @@ -228,6 +228,11 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL buttonVisible(context.querySelector(".btnFastForward"), null != item); var positionSlider = context.querySelector(".nowPlayingPositionSlider"); + if (positionSlider && item && item.RunTimeTicks) { + positionSlider.setKeyboardSteps(userSettings.skipBackLength() * 1000000 / item.RunTimeTicks, + userSettings.skipForwardLength() * 1000000 / item.RunTimeTicks); + } + if (positionSlider && !positionSlider.dragging) { positionSlider.disabled = !playState.CanSeek; var isProgressClear = state.MediaSource && null == state.MediaSource.RunTimeTicks; @@ -266,7 +271,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL toggleRepeatButton.innerHTML = "repeat"; toggleRepeatButton.classList.add("repeatButton-active"); } else if ("RepeatOne" == repeatMode) { - toggleRepeatButton.innerHTML = "repeat_one"; + toggleRepeatButton.innerHTML = ""; toggleRepeatButton.classList.add("repeatButton-active"); } else { toggleRepeatButton.innerHTML = "repeat"; @@ -392,7 +397,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } function onPlaybackStart(e, state) { - console.log("remotecontrol event: " + e.type); + console.debug("remotecontrol event: " + e.type); var player = this; onStateChanged.call(player, e, state); } @@ -420,7 +425,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL } function onPlaybackStopped(e, state) { - console.log("remotecontrol event: " + e.type); + console.debug("remotecontrol event: " + e.type); var player = this; if (!state.NextMediaType) { @@ -693,6 +698,12 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL context.querySelector(".sendMessageForm").addEventListener("submit", onMessageSubmit); context.querySelector(".typeTextForm").addEventListener("submit", onSendStringSubmit); events.on(playbackManager, "playerchange", onPlayerChange); + + if (layoutManager.tv) { + var positionSlider = context.querySelector(".nowPlayingPositionSlider"); + positionSlider.classList.add("focusable"); + positionSlider.enableKeyboardDragging(); + } } function onDialogClosed(e) { diff --git a/src/components/sanitizefilename.js b/src/components/sanitizefilename.js index d422a9553..f53ce613f 100644 --- a/src/components/sanitizefilename.js +++ b/src/components/sanitizefilename.js @@ -4,6 +4,7 @@ define([], function () { 'use strict'; var illegalRe = /[\/\?<>\\:\*\|":]/g; + // eslint-disable-next-line no-control-regex var controlRe = /[\x00-\x1f\x80-\x9f]/g; var reservedRe = /^\.+$/; var windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i; @@ -92,4 +93,4 @@ define([], function () { return truncate(sanitized, 255); } }; -}); \ No newline at end of file +}); diff --git a/src/components/screensavermanager.js b/src/components/screensavermanager.js index 5b7613c98..b9d708285 100644 --- a/src/components/screensavermanager.js +++ b/src/components/screensavermanager.js @@ -53,7 +53,7 @@ define(["events", "playbackManager", "pluginManager", "inputManager", "connectio throw new Error("An existing screensaver is already active."); } - console.log("Showing screensaver " + screensaver.name); + console.debug("Showing screensaver " + screensaver.name); screensaver.show(); activeScreenSaver = screensaver; @@ -71,7 +71,7 @@ define(["events", "playbackManager", "pluginManager", "inputManager", "connectio function hide() { if (activeScreenSaver) { - console.log("Hiding screensaver"); + console.debug("Hiding screensaver"); activeScreenSaver.hide(); activeScreenSaver = null; } diff --git a/src/components/scrollManager.js b/src/components/scrollManager.js index 4ba696d74..5fc3729ba 100644 --- a/src/components/scrollManager.js +++ b/src/components/scrollManager.js @@ -33,6 +33,7 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage var elem = document.createElement("div"); var opts = Object.defineProperty({}, "behavior", { + // eslint-disable-next-line getter-return get: function () { supportsScrollToOptions = true; } @@ -40,7 +41,7 @@ define(["dom", "browser", "layoutManager"], function (dom, browser, layoutManage elem.scrollTo(opts); } catch (e) { - console.log("error checking ScrollToOptions support"); + console.error("error checking ScrollToOptions support"); } /** diff --git a/src/components/scroller.js b/src/components/scroller.js index 65f33b8e8..8c67127eb 100644 --- a/src/components/scroller.js +++ b/src/components/scroller.js @@ -392,7 +392,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc var currentStart = self._pos.cur; var currentEnd = currentStart + frameSize; - //console.log('offset:' + offset + ' currentStart:' + currentStart + ' currentEnd:' + currentEnd); + console.debug('offset:' + offset + ' currentStart:' + currentStart + ' currentEnd:' + currentEnd); var isVisible = offset >= currentStart && (offset + size) <= currentEnd; return { @@ -574,8 +574,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc * @return {Int} */ function normalizeWheelDelta(event) { - // wheelDelta needed only for IE8- - scrolling.curDelta = ((o.horizontal ? event.deltaY || event.deltaX : event.deltaY) || -event.wheelDelta); + // JELLYFIN MOD: Only use deltaX for horizontal scroll and remove IE8 support + scrolling.curDelta = o.horizontal ? event.deltaX : event.deltaY; + // END JELLYFIN MOD if (transform) { scrolling.curDelta /= event.deltaMode === 1 ? 3 : 100; @@ -928,4 +929,4 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc }; return scrollerFactory; -}); \ No newline at end of file +}); diff --git a/src/components/scrollhelper.js b/src/components/scrollhelper.js index 6280dc506..1a3659402 100644 --- a/src/components/scrollhelper.js +++ b/src/components/scrollhelper.js @@ -134,4 +134,4 @@ define(['focusManager', 'dom', 'scrollStyles'], function (focusManager, dom) { toCenter: toCenter, toStart: toStart }; -}); \ No newline at end of file +}); diff --git a/src/components/search/searchfields.js b/src/components/search/searchfields.js index 912acfc41..53ab187a8 100644 --- a/src/components/search/searchfields.js +++ b/src/components/search/searchfields.js @@ -121,4 +121,4 @@ define(['layoutManager', 'globalize', 'require', 'events', 'browser', 'alphaPick }; return SearchFields; -}); \ No newline at end of file +}); diff --git a/src/components/search/searchresults.template.html b/src/components/search/searchresults.template.html index a9fa232fb..1deecaca6 100644 --- a/src/components/search/searchresults.template.html +++ b/src/components/search/searchresults.template.html @@ -11,7 +11,7 @@

${Movies}

-
+
@@ -19,7 +19,7 @@

${Shows}

-
+
@@ -27,7 +27,7 @@

${Episodes}

-
+
@@ -35,7 +35,7 @@

${Sports}

-
+
@@ -43,7 +43,7 @@

${Kids}

-
+
@@ -51,7 +51,7 @@

${News}

-
+
@@ -59,7 +59,7 @@

${Programs}

-
+
@@ -67,7 +67,7 @@

${Videos}

-
+
@@ -75,7 +75,7 @@

${Playlists}

-
+
@@ -83,7 +83,7 @@

${Artists}

-
+
@@ -91,7 +91,7 @@

${Albums}

-
+
@@ -99,7 +99,7 @@

${Songs}

-
+
@@ -107,7 +107,7 @@

${HeaderPhotoAlbums}

-
+
@@ -115,7 +115,7 @@

${Photos}

-
+
@@ -123,7 +123,7 @@

${HeaderAudioBooks}

-
+
@@ -131,7 +131,7 @@

${Books}

-
+
@@ -139,7 +139,7 @@

${People}

-
+
-
\ No newline at end of file +
diff --git a/src/components/serverNotifications/serverNotifications.js b/src/components/serverNotifications.js similarity index 90% rename from src/components/serverNotifications/serverNotifications.js rename to src/components/serverNotifications.js index 1941881b7..555492527 100644 --- a/src/components/serverNotifications/serverNotifications.js +++ b/src/components/serverNotifications.js @@ -33,7 +33,7 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus } function processGeneralCommand(cmd, apiClient) { - console.log('Received command: ' + cmd.Name); + console.debug('Received command: ' + cmd.Name); switch (cmd.Name) { case 'Select': inputManager.trigger('select'); @@ -133,7 +133,7 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus focusManager.sendText(cmd.Arguments.String); break; default: - console.log('processGeneralCommand does not recognize: ' + cmd.Name); + console.debug('processGeneralCommand does not recognize: ' + cmd.Name); break; } @@ -191,36 +191,14 @@ define(['connectionManager', 'playbackManager', 'events', 'inputManager', 'focus events.trigger(serverNotifications, msg.MessageType, [apiClient, msg.Data]); } } - function bindEvents(apiClient) { events.off(apiClient, "message", onMessageReceived); events.on(apiClient, "message", onMessageReceived); } - function enableNativeGamepadKeyMapping() { - if (window.navigator && "string" == typeof window.navigator.gamepadInputEmulation) { - window.navigator.gamepadInputEmulation = "keyboard"; - return true; - } - - return false; - } - - function isGamepadSupported() { - return "ongamepadconnected" in window || navigator.getGamepads || navigator.webkitGetGamepads; - } - connectionManager.getApiClients().forEach(bindEvents); - events.on(connectionManager, 'apiclientcreated', function (e, newApiClient) { bindEvents(newApiClient); }); - - if (!enableNativeGamepadKeyMapping() && isGamepadSupported()) { - require(["components/serverNotifications/gamepadtokey"]); - } - - require(["components/serverNotifications/mouseManager"]); - return serverNotifications; }); diff --git a/src/components/serverRestartDialog.js b/src/components/serverRestartDialog.js index 4c20183b2..ef012fe44 100644 --- a/src/components/serverRestartDialog.js +++ b/src/components/serverRestartDialog.js @@ -155,4 +155,4 @@ define(['loading', 'events', 'dialogHelper', 'dom', 'layoutManager', 'scrollHelp }; return ServerRestartDialog; -}); \ No newline at end of file +}); diff --git a/src/components/serviceworker/notifications.js b/src/components/serviceworker/notifications.js index 9c5be840b..33f54bb64 100644 --- a/src/components/serviceworker/notifications.js +++ b/src/components/serviceworker/notifications.js @@ -1,3 +1,4 @@ +/* eslint-env serviceworker */ (function () { 'use strict'; @@ -41,4 +42,4 @@ event.waitUntil(executeAction(action, data, serverId)); }, false); -})(); \ No newline at end of file +})(); diff --git a/src/components/sessionplayer.js b/src/components/sessionplayer.js index adcaab267..bbb22a965 100644 --- a/src/components/sessionplayer.js +++ b/src/components/sessionplayer.js @@ -549,4 +549,4 @@ define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'] }; return SessionPlayer; -}); \ No newline at end of file +}); diff --git a/src/components/shell.js b/src/components/shell.js index 534a57b02..f82f5eea3 100644 --- a/src/components/shell.js +++ b/src/components/shell.js @@ -27,4 +27,4 @@ define([], function () { } } }; -}); \ No newline at end of file +}); diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 9d2b1847e..ab606ab1d 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -425,4 +425,4 @@ define(['playbackManager', 'inputManager', 'connectionManager', 'appRouter', 'gl getShortcutAttributesHtml: getShortcutAttributesHtml }; -}); \ No newline at end of file +}); diff --git a/src/components/skinManager.js b/src/components/skinManager.js index b757aab3d..b81e7c3a4 100644 --- a/src/components/skinManager.js +++ b/src/components/skinManager.js @@ -96,7 +96,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr appHost.setThemeColor(color); } } catch (err) { - console.log('Error setting theme color: ' + err); + console.error('error setting theme color: ' + err); } } @@ -162,6 +162,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr function playSound(path, volume) { lastSound = new Date().getTime(); require(['howler'], function (howler) { + /* globals Howl */ try { var sound = new Howl({ src: [path], @@ -170,7 +171,7 @@ define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdr sound.play(); currentSound = sound; } catch (err) { - console.log('Error playing sound: ' + err); + console.error('error playing sound: ' + err); } }); } diff --git a/src/components/slideshow/slideshow.js b/src/components/slideshow/slideshow.js index 115de54b2..40d87e951 100644 --- a/src/components/slideshow/slideshow.js +++ b/src/components/slideshow/slideshow.js @@ -78,7 +78,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f try { appHost.setUserScalable(scalable); } catch (err) { - console.log('error in appHost.setUserScalable: ' + err); + console.error('error in appHost.setUserScalable: ' + err); } } @@ -198,6 +198,20 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f } } + function onAutoplayStart() { + var btnSlideshowPause = dlg.querySelector('.btnSlideshowPause i'); + if (btnSlideshowPause) { + btnSlideshowPause.innerHTML = "pause"; + } + } + + function onAutoplayStop() { + var btnSlideshowPause = dlg.querySelector('.btnSlideshowPause i'); + if (btnSlideshowPause) { + btnSlideshowPause.innerHTML = ""; + } + } + function loadSwiper(dlg) { if (currentOptions.slides) { @@ -225,6 +239,9 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f speed: 240 }); + swiperInstance.on('autoplayStart', onAutoplayStart); + swiperInstance.on('autoplayStop', onAutoplayStop); + if (layoutManager.mobile) { pause(); } else { @@ -336,23 +353,15 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f } function play() { - - var btnSlideshowPause = dlg.querySelector('.btnSlideshowPause i'); - if (btnSlideshowPause) { - btnSlideshowPause.innerHTML = "pause"; + if (swiperInstance.autoplay) { + swiperInstance.autoplay.start(); } - - swiperInstance.startAutoplay(); } function pause() { - - var btnSlideshowPause = dlg.querySelector('.btnSlideshowPause i'); - if (btnSlideshowPause) { - btnSlideshowPause.innerHTML = ""; + if (swiperInstance.autoplay) { + swiperInstance.autoplay.stop(); } - - swiperInstance.stopAutoplay(); } function playPause() { @@ -641,4 +650,4 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f } }; }; -}); \ No newline at end of file +}); diff --git a/src/components/sortmenu/sortmenu.template.html b/src/components/sortmenu/sortmenu.template.html index 3f523c295..da7da9837 100644 --- a/src/components/sortmenu/sortmenu.template.html +++ b/src/components/sortmenu/sortmenu.template.html @@ -19,4 +19,4 @@
-
\ No newline at end of file +
diff --git a/src/components/subtitlesettings/subtitleappearancehelper.js b/src/components/subtitlesettings/subtitleappearancehelper.js index 8a40bd134..fdc64f0df 100644 --- a/src/components/subtitlesettings/subtitleappearancehelper.js +++ b/src/components/subtitlesettings/subtitleappearancehelper.js @@ -156,4 +156,4 @@ define([], function () { getStyles: getStyles, applyStyles: applyStyles }; -}); \ No newline at end of file +}); diff --git a/src/components/subtitlesettings/subtitlesettings.js b/src/components/subtitlesettings/subtitlesettings.js index 669b26d27..69de536e4 100644 --- a/src/components/subtitlesettings/subtitlesettings.js +++ b/src/components/subtitlesettings/subtitlesettings.js @@ -219,4 +219,4 @@ define(['require', 'globalize', 'appSettings', 'apphost', 'focusManager', 'loadi }; return SubtitleSettings; -}); \ No newline at end of file +}); diff --git a/src/components/subtitlesettings/subtitlesettings.template.html b/src/components/subtitlesettings/subtitlesettings.template.html index a6ec43d8f..cc2788397 100644 --- a/src/components/subtitlesettings/subtitlesettings.template.html +++ b/src/components/subtitlesettings/subtitlesettings.template.html @@ -91,4 +91,4 @@ - \ No newline at end of file + diff --git a/src/components/subtitlesync/subtitlesync.js b/src/components/subtitlesync/subtitlesync.js index 904c61231..07ce2cb7e 100644 --- a/src/components/subtitlesync/subtitlesync.js +++ b/src/components/subtitlesync/subtitlesync.js @@ -130,7 +130,7 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles SubtitleSync.prototype.toggle = function(action) { if (player && playbackManager.supportSubtitleOffset(player)) { - + /* eslint-disable no-fallthrough */ switch (action) { case undefined: // if showing subtitle sync is enabled @@ -157,7 +157,7 @@ define(['playbackManager', 'text!./subtitlesync.template.html', 'css!./subtitles subtitleSyncContainer.classList.add("hide"); break; } - + /* eslint-enable no-fallthrough */ } } diff --git a/src/components/subtitlesync/subtitlesync.template.html b/src/components/subtitlesync/subtitlesync.template.html index 2aa6b1045..999e4d0bb 100644 --- a/src/components/subtitlesync/subtitlesync.template.html +++ b/src/components/subtitlesync/subtitlesync.template.html @@ -4,4 +4,4 @@
-
\ No newline at end of file +
diff --git a/src/components/tabbedview/tabbedview.js b/src/components/tabbedview/tabbedview.js index 33f1c6e6c..a67e8e0fa 100644 --- a/src/components/tabbedview/tabbedview.js +++ b/src/components/tabbedview/tabbedview.js @@ -120,4 +120,4 @@ define(['backdrop', 'mainTabsManager', 'layoutManager', 'emby-tabs'], function ( }; return TabbedView; -}); \ No newline at end of file +}); diff --git a/src/components/thememediaplayer.js b/src/components/thememediaplayer.js index a8298fad3..94012ba82 100644 --- a/src/components/thememediaplayer.js +++ b/src/components/thememediaplayer.js @@ -108,4 +108,4 @@ define(['playbackManager', 'userSettings', 'connectionManager'], function (playb // } //}); -}); \ No newline at end of file +}); diff --git a/src/components/toast/toast.js b/src/components/toast/toast.js index d8ac40476..22eb53396 100644 --- a/src/components/toast/toast.js +++ b/src/components/toast/toast.js @@ -39,4 +39,4 @@ define(['css!./toast'], function () { }, 300); }; -}); \ No newline at end of file +}); diff --git a/src/components/touchhelper.js b/src/components/touchhelper.js index 0f6d34aac..97455fc96 100644 --- a/src/components/touchhelper.js +++ b/src/components/touchhelper.js @@ -168,4 +168,4 @@ define(['dom', 'events'], function (dom, events) { }; return TouchHelper; -}); \ No newline at end of file +}); diff --git a/src/components/tunerpicker.js b/src/components/tunerpicker.js index ec6087b89..4dd5ecd3d 100644 --- a/src/components/tunerpicker.js +++ b/src/components/tunerpicker.js @@ -1,4 +1,4 @@ -define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize", "loading", "browser", "material-icons", "formDialogStyle", "emby-button", "emby-itemscontainer", "cardStyle"], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser) { +define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize", "loading", "browser", "focusManager", "scrollHelper", "material-icons", "formDialogStyle", "emby-button", "emby-itemscontainer", "cardStyle"], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser, focusManager, scrollHelper) { "use strict"; var enableFocusTransform = !browser.slow && !browser.edge; @@ -152,14 +152,14 @@ define(["dialogHelper", "dom", "layoutManager", "connectionManager", "globalize" }); if (layoutManager.tv) { - centerFocus(dlg.querySelector(".formDialogContent"), false, true); + scrollHelper.centerFocus.on(dlg.querySelector(".formDialogContent"), false); } var apiClient = connectionManager.getApiClient(options.serverId); discoverDevices(dlg, apiClient); if (layoutManager.tv) { - centerFocus(dlg.querySelector(".formDialogContent"), false, false); + scrollHelper.centerFocus.off(dlg.querySelector(".formDialogContent"), false); } return dialogHelper.open(dlg).then(function () { diff --git a/src/components/tvproviders/schedulesdirect.template.html b/src/components/tvproviders/schedulesdirect.template.html index da593ef56..3cfba06fe 100644 --- a/src/components/tvproviders/schedulesdirect.template.html +++ b/src/components/tvproviders/schedulesdirect.template.html @@ -70,4 +70,4 @@
-
\ No newline at end of file +
diff --git a/src/components/upnextdialog/upnextdialog.js b/src/components/upnextdialog/upnextdialog.js index 80e7d807b..225859e0b 100644 --- a/src/components/upnextdialog/upnextdialog.js +++ b/src/components/upnextdialog/upnextdialog.js @@ -131,7 +131,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l var secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0); - console.log('up next seconds remaining: ' + secondsRemaining); + console.debug('up next seconds remaining: ' + secondsRemaining); var timeText = '' + globalize.translate('HeaderSecondsValue', secondsRemaining) + ''; @@ -332,4 +332,4 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l }; return UpNextDialog; -}); \ No newline at end of file +}); diff --git a/src/components/userdatabuttons/emby-playstatebutton.js b/src/components/userdatabuttons/emby-playstatebutton.js index eaed12893..4c3e5b6b6 100644 --- a/src/components/userdatabuttons/emby-playstatebutton.js +++ b/src/components/userdatabuttons/emby-playstatebutton.js @@ -156,4 +156,4 @@ define(['connectionManager', 'serverNotifications', 'events', 'globalize', 'emby prototype: EmbyPlaystateButtonPrototype, extends: 'button' }); -}); \ No newline at end of file +}); diff --git a/src/components/viewsettings/viewsettings.template.html b/src/components/viewsettings/viewsettings.template.html index 07cbc35e9..8aea2fac2 100644 --- a/src/components/viewsettings/viewsettings.template.html +++ b/src/components/viewsettings/viewsettings.template.html @@ -38,4 +38,4 @@
-
\ No newline at end of file +
diff --git a/src/components/visibleinviewport.js b/src/components/visibleinviewport.js index 376874017..a48dbd3a1 100644 --- a/src/components/visibleinviewport.js +++ b/src/components/visibleinviewport.js @@ -38,4 +38,4 @@ define(['dom'], function (dom) { } return visibleInViewport; -}); \ No newline at end of file +}); diff --git a/src/components/youtubeplayer/plugin.js b/src/components/youtubeplayer/plugin.js index a2478cd3f..fd9c05292 100644 --- a/src/components/youtubeplayer/plugin.js +++ b/src/components/youtubeplayer/plugin.js @@ -1,5 +1,6 @@ define(['require', 'events', 'browser', 'appRouter', 'loading'], function (require, events, browser, appRouter, loading) { "use strict"; + /* globals YT */ function zoomIn(elem, iterations) { var keyframes = [ @@ -405,4 +406,4 @@ define(['require', 'events', 'browser', 'appRouter', 'loading'], function (requi }; return YoutubePlayer; -}); \ No newline at end of file +}); diff --git a/src/controllers/dashboard/dashboard.js b/src/controllers/dashboard/dashboard.js index 1b7d12393..2530d7a9a 100644 --- a/src/controllers/dashboard/dashboard.js +++ b/src/controllers/dashboard/dashboard.js @@ -741,21 +741,15 @@ define(["datetime", "events", "itemHelper", "serverNotifications", "dom", "globa }; return function (view, params) { function onRestartRequired(evt, apiClient) { - if (apiClient.serverId() === serverId) { - renderHasPendingRestart(view, apiClient, true); - } + console.debug('onRestartRequired not implemented', evt, apiClient); } function onServerShuttingDown(evt, apiClient) { - if (apiClient.serverId() === serverId) { - renderHasPendingRestart(view, apiClient, true); - } + console.debug('onServerShuttingDown not implemented', evt, apiClient); } function onServerRestarting(evt, apiClient) { - if (apiClient.serverId() === serverId) { - renderHasPendingRestart(view, apiClient, true); - } + console.debug('onServerRestarting not implemented', evt, apiClient); } function onPackageInstalling(evt, apiClient) { diff --git a/src/controllers/dashboard/general.js b/src/controllers/dashboard/general.js index 7eed35232..a434e4624 100644 --- a/src/controllers/dashboard/general.js +++ b/src/controllers/dashboard/general.js @@ -56,6 +56,12 @@ define(["jQuery", "loading", "fnchecked", "emby-checkbox", "emby-textarea", "emb } }); }); + }, function () { + require(["alert"], function (alert) { + alert(Globalize.translate("DefaultErrorMessage")); + }); + + Dashboard.processServerConfigurationUpdateResult(); }); }); return false; diff --git a/src/controllers/dashboard/logs.js b/src/controllers/dashboard/logs.js index f5866f344..144e21fc9 100644 --- a/src/controllers/dashboard/logs.js +++ b/src/controllers/dashboard/logs.js @@ -30,4 +30,4 @@ define(["datetime", "loading", "apphost", "listViewStyle", "emby-button", "flexS }); }); } -}); \ No newline at end of file +}); diff --git a/src/controllers/dashboard/notifications/notifications.js b/src/controllers/dashboard/notifications/notifications.js index 466728210..8f63753bf 100644 --- a/src/controllers/dashboard/notifications/notifications.js +++ b/src/controllers/dashboard/notifications/notifications.js @@ -31,14 +31,14 @@ define(["loading", "libraryMenu", "globalize", "listViewStyle", "emby-button"], } itemHtml += ''; if (notification.Enabled) { - itemHtml += 'notifications_active'; + itemHtml += ''; } else { - itemHtml += 'notifications_off'; + itemHtml += ''; } itemHtml += '
'; itemHtml += '
' + notification.Name + "
"; itemHtml += "
"; - itemHtml += ''; + itemHtml += ''; itemHtml += "
"; return itemHtml; }).join(""); diff --git a/src/controllers/dashboard/plugins/add.js b/src/controllers/dashboard/plugins/add.js index 7930d6927..72a7134fa 100644 --- a/src/controllers/dashboard/plugins/add.js +++ b/src/controllers/dashboard/plugins/add.js @@ -122,7 +122,7 @@ define(["jQuery", "loading", "libraryMenu", "globalize", "connectionManager", "e confirm(msg, globalize.translate("HeaderConfirmPluginInstallation")).then(function () { alertCallback(); }, function () { - console.log('plugin not installed'); + console.debug('plugin not installed'); }); }); } else { diff --git a/src/controllers/devices.js b/src/controllers/devices.js index 4ddb4d4d2..3fd2be983 100644 --- a/src/controllers/devices.js +++ b/src/controllers/devices.js @@ -80,7 +80,7 @@ define(["loading", "dom", "libraryMenu", "globalize", "scripts/imagehelper", "hu deviceHtml += '
"; deviceHtml += "
"; } else { - deviceHtml += 'tablet_android'; + deviceHtml += ''; } deviceHtml += ""; diff --git a/src/controllers/dlnaprofiles.js b/src/controllers/dlnaprofiles.js index eae529c53..e1719ea59 100644 --- a/src/controllers/dlnaprofiles.js +++ b/src/controllers/dlnaprofiles.js @@ -32,7 +32,7 @@ define(["jQuery", "globalize", "loading", "libraryMenu", "listViewStyle", "emby- for (var i = 0, length = profiles.length; i < length; i++) { var profile = profiles[i]; html += '
'; - html += 'live_tv'; + html += ''; html += '
'; html += ""; html += "
" + profile.Name + "
"; diff --git a/src/controllers/encodingsettings.js b/src/controllers/encodingsettings.js index 24cf656d6..ff140ed53 100644 --- a/src/controllers/encodingsettings.js +++ b/src/controllers/encodingsettings.js @@ -15,6 +15,7 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo page.querySelector("#selectEncoderPreset").value = config.EncoderPreset || ""; page.querySelector("#txtH264Crf").value = config.H264Crf || ""; page.querySelector("#chkEnableSubtitleExtraction").checked = config.EnableSubtitleExtraction || false; + page.querySelector("#chkEnableThrottling").checked = config.EnableThrottling || false; page.querySelector("#selectVideoDecoder").dispatchEvent(new CustomEvent("change", { bubbles: true })); @@ -58,6 +59,7 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo config.EncoderPreset = form.querySelector("#selectEncoderPreset").value; config.H264Crf = parseInt(form.querySelector("#txtH264Crf").value || "0"); config.EnableSubtitleExtraction = form.querySelector("#chkEnableSubtitleExtraction").checked; + config.EnableThrottling = form.querySelector("#chkEnableThrottling").checked; config.HardwareDecodingCodecs = Array.prototype.map.call(Array.prototype.filter.call(form.querySelectorAll(".chkDecodeCodec"), function (c) { return c.checked; }), function (c) { @@ -66,6 +68,12 @@ define(["jQuery", "loading", "globalize", "dom", "libraryMenu"], function ($, lo config.EnableHardwareEncoding = form.querySelector("#chkHardwareEncoding").checked; ApiClient.updateNamedConfiguration("encoding", config).then(function () { updateEncoder(form); + }, function () { + require(["alert"], function (alert) { + alert(globalize.translate("DefaultErrorMessage")); + }); + + Dashboard.processServerConfigurationUpdateResult(); }); }); }; diff --git a/src/controllers/favorites.js b/src/controllers/favorites.js index a4f2af64d..c06b0bd8f 100644 --- a/src/controllers/favorites.js +++ b/src/controllers/favorites.js @@ -253,7 +253,7 @@ define(["appRouter", "cardBuilder", "dom", "globalize", "connectionManager", "ap } html += "
"; - html += '
'; + html += '
'; html += "
"; } diff --git a/src/controllers/itemdetailpage.js b/src/controllers/itemdetailpage.js index 990de87b6..e18311048 100644 --- a/src/controllers/itemdetailpage.js +++ b/src/controllers/itemdetailpage.js @@ -1,4 +1,4 @@ -define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuilder", "datetime", "mediaInfo", "backdrop", "listView", "itemContextMenu", "itemHelper", "dom", "indicators", "apphost", "imageLoader", "libraryMenu", "globalize", "browser", "events", "scrollHelper", "playbackManager", "libraryBrowser", "scrollStyles", "emby-itemscontainer", "emby-checkbox", "emby-button", "emby-playstatebutton", "emby-ratingbutton", "emby-scroller", "emby-select"], function (loading, appRouter, layoutManager, connectionManager, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, dom, indicators, appHost, imageLoader, libraryMenu, globalize, browser, events, scrollHelper, playbackManager, libraryBrowser) { +define(["loading", "appRouter", "layoutManager", "connectionManager", "userSettings", "cardBuilder", "datetime", "mediaInfo", "backdrop", "listView", "itemContextMenu", "itemHelper", "dom", "indicators", "imageLoader", "libraryMenu", "globalize", "browser", "events", "playbackManager", "scrollStyles", "emby-itemscontainer", "emby-checkbox", "emby-button", "emby-playstatebutton", "emby-ratingbutton", "emby-scroller", "emby-select"], function (loading, appRouter, layoutManager, connectionManager, userSettings, cardBuilder, datetime, mediaInfo, backdrop, listView, itemContextMenu, itemHelper, dom, indicators, imageLoader, libraryMenu, globalize, browser, events, playbackManager) { "use strict"; function getPromise(apiClient, params) { @@ -60,8 +60,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild return options; } - function getProgramScheduleHtml(items, options) { - options = options || {}; + function getProgramScheduleHtml(items) { var html = ""; html += '
'; html += listView.getListViewHtml({ @@ -445,7 +444,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild } } - function renderBackdrop(page, item, apiClient) { + function renderBackdrop(item) { if (dom.getWindowSize().innerWidth >= 1000) { backdrop.setBackdrops([item]); } else { @@ -455,7 +454,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild function renderDetailPageBackdrop(page, item, apiClient) { var imgUrl; - var screenWidth = screen.availWidth; var hasbackdrop = false; var itemBackdropElement = page.querySelector("#itemBackdrop"); var usePrimaryImage = item.MediaType === "Video" && item.Type !== "Movie" && item.Type !== "Trailer" || @@ -464,13 +462,17 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild item.Type === "MusicArtist" || item.Type === "Person"; + if (!layoutManager.mobile && !userSettings.enableBackdrops()) { + return false; + } + if ("Program" === item.Type && item.ImageTags && item.ImageTags.Thumb) { imgUrl = apiClient.getScaledImageUrl(item.Id, { type: "Thumb", index: 0, tag: item.ImageTags.Thumb }); - itemBackdropElement.classList.remove("noBackdrop"); + page.classList.remove("noBackdrop"); imageLoader.lazyImage(itemBackdropElement, imgUrl, false); hasbackdrop = true; } else if (usePrimaryImage && item.ImageTags && item.ImageTags.Primary) { @@ -479,7 +481,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild index: 0, tag: item.ImageTags.Primary }); - itemBackdropElement.classList.remove("noBackdrop"); + page.classList.remove("noBackdrop"); imageLoader.lazyImage(itemBackdropElement, imgUrl, false); hasbackdrop = true; } else if (item.BackdropImageTags && item.BackdropImageTags.length) { @@ -488,7 +490,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild index: 0, tag: item.BackdropImageTags[0] }); - itemBackdropElement.classList.remove("noBackdrop"); + page.classList.remove("noBackdrop"); imageLoader.lazyImage(itemBackdropElement, imgUrl, false); hasbackdrop = true; } else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) { @@ -497,7 +499,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild index: 0, tag: item.ParentBackdropImageTags[0] }); - itemBackdropElement.classList.remove("noBackdrop"); + page.classList.remove("noBackdrop"); imageLoader.lazyImage(itemBackdropElement, imgUrl, false); hasbackdrop = true; } else if (item.ImageTags && item.ImageTags.Thumb) { @@ -506,15 +508,16 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild index: 0, tag: item.ImageTags.Thumb }); - itemBackdropElement.classList.remove("noBackdrop"); + page.classList.remove("noBackdrop"); imageLoader.lazyImage(itemBackdropElement, imgUrl, false); hasbackdrop = true; } else { - itemBackdropElement.classList.add("noBackdrop"); itemBackdropElement.style.backgroundImage = ""; } if ("Person" === item.Type) { + // FIXME: This hides the backdrop on all persons to fix a margin issue. Ideally, a proper fix should be made. + page.classList.add('noBackdrop'); itemBackdropElement.classList.add("personBackdrop"); } else { itemBackdropElement.classList.remove("personBackdrop"); @@ -526,6 +529,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild function reloadFromItem(instance, page, params, item, user) { var context = params.context; page.querySelector(".detailPagePrimaryContainer").classList.add("detailSticky"); + renderName(item, page.querySelector(".nameContainer"), false, context); var apiClient = connectionManager.getApiClient(item.ServerId); renderSeriesTimerEditor(page, item, apiClient, user); @@ -536,7 +540,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild setInitialCollapsibleState(page, item, apiClient, context, user); renderDetails(page, item, apiClient, context); renderTrackSelections(page, instance, item); - renderBackdrop(page, item, apiClient); + renderBackdrop(item); renderDetailPageBackdrop(page, item, apiClient); var canPlay = reloadPlayButtons(page, item); @@ -647,7 +651,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild function setTitle(item, apiClient) { var url = logoImageUrl(item, apiClient, {}); - if (url = null) { + if (url != null) { var pageTitle = document.querySelector(".pageTitle"); pageTitle.style.backgroundImage = "url('" + url + "')"; pageTitle.classList.add("pageTitleWithLogo"); @@ -663,7 +667,9 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild }); var detailLogo = page.querySelector(".detailLogo"); - if (url) { + if (!layoutManager.mobile && !userSettings.enableBackdrops()) { + detailLogo.classList.add("hide"); + } else if (url) { detailLogo.classList.remove("hide"); detailLogo.classList.add("lazy"); detailLogo.setAttribute("data-src", url); @@ -817,7 +823,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild if (editable) { html += ""; } else if (!editable && url === undefined) { - html += "
" + html += "
"; } var progressHtml = item.IsFolder || !item.UserData ? "" : indicators.getProgressBarHtml(item); @@ -873,7 +879,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild elem.querySelector(".detailImageProgressContainer").innerHTML = indicators.getProgressBarHtml(item); } - function refreshImage(page, item, user) { + function refreshImage(page, item) { refreshDetailImageUserData(page.querySelector(".detailImageContainer"), item); } @@ -922,10 +928,10 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild if ("Playlist" == item.Type) { page.querySelector("#childrenCollapsible").classList.remove("hide"); - renderPlaylistItems(page, item, user); + renderPlaylistItems(page, item); } else if ("Studio" == item.Type || "Person" == item.Type || "Genre" == item.Type || "MusicGenre" == item.Type || "MusicArtist" == item.Type) { page.querySelector("#childrenCollapsible").classList.remove("hide"); - renderItemsByName(page, item, user); + renderItemsByName(page, item); } else if (item.IsFolder) { if ("BoxSet" == item.Type) { page.querySelector("#childrenCollapsible").classList.add("hide"); @@ -937,7 +943,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild } if ("Series" == item.Type) { - renderSeriesSchedule(page, item, user); + renderSeriesSchedule(page, item); renderNextUp(page, item, user); } else { page.querySelector(".nextUpSection").classList.add("hide"); @@ -952,7 +958,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild page.querySelector("#specialsCollapsible").classList.add("hide"); } - renderCast(page, item, context, enableScrollX() ? null : 12); + renderCast(page, item); if (item.PartCount && item.PartCount > 1) { page.querySelector("#additionalPartsCollapsible").classList.remove("hide"); @@ -988,7 +994,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild } } - function renderGenres(page, item, apiClient, context, isStatic) { + function renderGenres(page, item, context) { context = context || inferContext(item); var type; var genres = item.GenreItems || []; @@ -1022,7 +1028,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild } } - function renderDirector(page, item, apiClient, context, isStatic) { + function renderDirector(page, item, context) { var directors = (item.People || []).filter(function (p) { return "Director" === p.Type; }); @@ -1050,8 +1056,8 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild renderSimilarItems(page, item, context); renderMoreFromSeason(page, item, apiClient); renderMoreFromArtist(page, item, apiClient); - renderDirector(page, item, apiClient, context, isStatic); - renderGenres(page, item, apiClient, context, isStatic); + renderDirector(page, item, context); + renderGenres(page, item, context); renderChannelGuide(page, apiClient, item); var taglineElement = page.querySelector(".tagline"); @@ -1125,14 +1131,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild return scrollX ? "overflowSquare" : "square"; } - function getThumbShape(scrollX) { - if (null == scrollX) { - scrollX = enableScrollX(); - } - - return scrollX ? "overflowBackdrop" : "backdrop"; - } - function renderMoreFromSeason(view, item, apiClient) { var section = view.querySelector(".moreFromSeasonSection"); @@ -1508,13 +1506,13 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild } } - function renderItemsByName(page, item, user) { + function renderItemsByName(page, item) { require("scripts/itembynamedetailpage".split(","), function () { window.ItemsByName.renderItems(page, item); }); } - function renderPlaylistItems(page, item, user) { + function renderPlaylistItems(page, item) { require("scripts/playlistedit".split(","), function () { PlaylistViewer.render(page, item); }); @@ -1594,7 +1592,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild } } - function renderSeriesSchedule(page, item, user) { + function renderSeriesSchedule(page, item) { var apiClient = connectionManager.getApiClient(item.ServerId); apiClient.getLiveTvPrograms({ UserId: apiClient.getCurrentUserId(), @@ -1661,7 +1659,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild function canPlaySomeItemInCollection(items) { var i = 0; - for (length = items.length; i < length; i++) { + for (var length = items.length; i < length; i++) { if (playbackManager.canPlay(items[i])) { return true; } @@ -1844,7 +1842,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild }); } - function renderCast(page, item, context, limit, isStatic) { + function renderCast(page, item) { var people = (item.People || []).filter(function (p) { return "Director" !== p.Type; }); @@ -1934,7 +1932,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild playbackManager.play(playOptions); } - function playTrailer(page) { + function playTrailer() { playbackManager.playTrailers(currentItem); } @@ -1991,11 +1989,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild } function onPlayTrailerClick() { - playTrailer(view); - } - - function onDownloadChange() { - reload(self, view, params); + playTrailer(); } function onDownloadClick() { @@ -2050,9 +2044,7 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild if (userData) { currentItem.UserData = userData; reloadPlayButtons(view, currentItem); - apiClient.getCurrentUser().then(function (user) { - refreshImage(view, currentItem, user); - }); + refreshImage(view, currentItem); } } } @@ -2083,11 +2075,9 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "cardBuild }); view.addEventListener("click", function (e) { if (dom.parentWithClass(e.target, "moreScenes")) { - apiClient.getCurrentUser().then(function (user) { - renderScenes(view, currentItem); - }); + renderScenes(view, currentItem); } else if (dom.parentWithClass(e.target, "morePeople")) { - renderCast(view, currentItem, params.context); + renderCast(view, currentItem); } else if (dom.parentWithClass(e.target, "moreSpecials")) { apiClient.getCurrentUser().then(function (user) { renderSpecials(view, currentItem, user); diff --git a/src/controllers/librarydisplay.js b/src/controllers/librarydisplay.js index 10a0eb945..55986a4b7 100644 --- a/src/controllers/librarydisplay.js +++ b/src/controllers/librarydisplay.js @@ -68,4 +68,4 @@ define(["globalize", "loading", "libraryMenu", "emby-checkbox", "emby-button", " }); }); } -}); \ No newline at end of file +}); diff --git a/src/controllers/metadataimagespage.js b/src/controllers/metadataimagespage.js index 3a6656e4b..a4932e9bb 100644 --- a/src/controllers/metadataimagespage.js +++ b/src/controllers/metadataimagespage.js @@ -61,4 +61,4 @@ define(["jQuery", "dom", "loading", "libraryMenu", "listViewStyle"], function($, }).on("pageshow", "#metadataImagesConfigurationPage", function() { libraryMenu.setTabs("metadata", 2, getTabs), loading.show(), loadPage(this) }) -}); \ No newline at end of file +}); diff --git a/src/controllers/movies/moviesrecommended.js b/src/controllers/movies/moviesrecommended.js index 8b7184443..7e19af4b9 100644 --- a/src/controllers/movies/moviesrecommended.js +++ b/src/controllers/movies/moviesrecommended.js @@ -203,7 +203,7 @@ define(["events", "layoutManager", "inputManager", "userSettings", "libraryMenu" function loadSuggestionsTab(view, params, tabContent) { var parentId = params.topParentId; var userId = ApiClient.getCurrentUserId(); - console.log("loadSuggestionsTab"); + console.debug("loadSuggestionsTab"); loadResume(tabContent, userId, parentId); loadLatest(tabContent, userId, parentId); loadSuggestions(tabContent, userId, parentId); diff --git a/src/controllers/music/musicrecommended.js b/src/controllers/music/musicrecommended.js index 556877aa1..8b87dff26 100644 --- a/src/controllers/music/musicrecommended.js +++ b/src/controllers/music/musicrecommended.js @@ -155,7 +155,7 @@ define(["browser", "layoutManager", "userSettings", "inputManager", "loading", " } function loadSuggestionsTab(page, tabContent, parentId) { - console.log("loadSuggestionsTab"); + console.debug("loadSuggestionsTab"); loadLatest(tabContent, parentId); loadRecentlyPlayed(tabContent, parentId); loadFrequentlyPlayed(tabContent, parentId); diff --git a/src/controllers/playback/videoosd.js b/src/controllers/playback/videoosd.js index 27652958d..c02c9b417 100644 --- a/src/controllers/playback/videoosd.js +++ b/src/controllers/playback/videoosd.js @@ -575,7 +575,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med } function onPlaybackStart(e, state) { - console.log("nowplaying event: " + e.type); + console.debug("nowplaying event: " + e.type); var player = this; onStateChanged.call(player, e, state); resetUpNextDialog(); @@ -594,7 +594,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med function onPlaybackStopped(e, state) { currentRuntimeTicks = null; resetUpNextDialog(); - console.log("nowplaying event: " + e.type); + console.debug("nowplaying event: " + e.type); if ("Video" !== state.NextMediaType) { view.removeEventListener("viewbeforehide", onViewHideStopPlayback); @@ -725,14 +725,14 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med var endDate = datetime.parseISO8601Date(program.EndDate); if (new Date().getTime() >= endDate.getTime()) { - console.log("program info needs to be refreshed"); + console.debug("program info needs to be refreshed"); var state = playbackManager.getPlayerState(player); onStateChanged.call(player, { type: "init" }, state); } } catch (e) { - console.log("Error parsing date: " + program.EndDate); + console.error("error parsing date: " + program.EndDate); } } } @@ -1218,7 +1218,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med return null; } - let playPauseClickTimeout; + var playPauseClickTimeout; function onViewHideStopPlayback() { if (playbackManager.isPlayingVideo()) { require(['shell'], function (shell) { @@ -1388,7 +1388,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med clearTimeout(playPauseClickTimeout); playPauseClickTimeout = 0; } else { - playPauseClickTimeout = setTimeout(() => { + playPauseClickTimeout = setTimeout(function() { playbackManager.playPause(currentPlayer); showOsd(); playPauseClickTimeout = 0; diff --git a/src/controllers/shows/tvupcoming.js b/src/controllers/shows/tvupcoming.js index f85278195..249d932d3 100644 --- a/src/controllers/shows/tvupcoming.js +++ b/src/controllers/shows/tvupcoming.js @@ -58,7 +58,7 @@ define(["layoutManager", "loading", "datetime", "libraryBrowser", "cardBuilder", day: "numeric" }); } catch (err) { - console.log('error parsing timestamp for upcoming tv shows'); + console.error('error parsing timestamp for upcoming tv shows'); } } diff --git a/src/controllers/streamingsettings.js b/src/controllers/streamingsettings.js index 6c8503445..14e5e028a 100644 --- a/src/controllers/streamingsettings.js +++ b/src/controllers/streamingsettings.js @@ -13,6 +13,7 @@ define(["jQuery", "libraryMenu", "loading"], function ($, libraryMenu, loading) config.RemoteClientBitrateLimit = parseInt(1e6 * parseFloat($("#txtRemoteClientBitrateLimit", form).val() || "0")); ApiClient.updateServerConfiguration(config).then(Dashboard.processServerConfigurationUpdateResult); }); + return false; } @@ -30,24 +31,6 @@ define(["jQuery", "libraryMenu", "loading"], function ($, libraryMenu, loading) } $(document).on("pageinit", "#streamingSettingsPage", function () { - var page = this; - $("#btnSelectTranscodingTempPath", page).on("click.selectDirectory", function () { - require(["directorybrowser"], function (directoryBrowser) { - var picker = new directoryBrowser(); - picker.show({ - callback: function (path) { - if (path) { - $("#txtTranscodingTempPath", page).val(path); - } - - picker.close(); - }, - validateWriteable: true, - header: Globalize.translate("HeaderSelectTranscodingPath"), - instruction: Globalize.translate("HeaderSelectTranscodingPathHelp") - }); - }); - }); $(".streamingSettingsForm").off("submit", onSubmit).on("submit", onSubmit); }).on("pageshow", "#streamingSettingsPage", function () { loading.show(); diff --git a/src/controllers/wizard/user.js b/src/controllers/wizard/user.js index d29be37c1..270953b24 100644 --- a/src/controllers/wizard/user.js +++ b/src/controllers/wizard/user.js @@ -10,7 +10,7 @@ define(["loading", "globalize", "dashboardcss", "emby-input", "emby-button", "em } function onUpdateUserComplete(result) { - console.log(result); + console.debug("user update complete: " + result); loading.hide(); nextWizardPage(); } diff --git a/src/elements/emby-checkbox/emby-checkbox.css b/src/elements/emby-checkbox/emby-checkbox.css index e69434257..42a920756 100644 --- a/src/elements/emby-checkbox/emby-checkbox.css +++ b/src/elements/emby-checkbox/emby-checkbox.css @@ -68,7 +68,8 @@ color: #fff; } -.checkboxIcon-checked { +.checkboxIcon-checked, +.emby-checkbox-label .checkboxIcon-checked { display: none; } diff --git a/src/elements/emby-collapse/emby-collapse.js b/src/elements/emby-collapse/emby-collapse.js index 764e525a2..600af5551 100644 --- a/src/elements/emby-collapse/emby-collapse.js +++ b/src/elements/emby-collapse/emby-collapse.js @@ -97,4 +97,4 @@ define(['browser', 'css!./emby-collapse', 'registerElement', 'emby-button'], fun prototype: EmbyButtonPrototype, extends: 'div' }); -}); \ No newline at end of file +}); diff --git a/src/elements/emby-input/emby-input.js b/src/elements/emby-input/emby-input.js index 7d2ea63a0..03ba2b93a 100644 --- a/src/elements/emby-input/emby-input.js +++ b/src/elements/emby-input/emby-input.js @@ -123,4 +123,4 @@ define(['layoutManager', 'browser', 'dom', 'css!./emby-input', 'registerElement' prototype: EmbyInputPrototype, extends: 'input' }); -}); \ No newline at end of file +}); diff --git a/src/elements/emby-progressring/emby-progressring.js b/src/elements/emby-progressring/emby-progressring.js index 80c545852..edc635947 100644 --- a/src/elements/emby-progressring/emby-progressring.js +++ b/src/elements/emby-progressring/emby-progressring.js @@ -98,4 +98,4 @@ define(['require', 'css!./emby-progressring', 'registerElement'], function (requ }); return EmbyProgressRing; -}); \ No newline at end of file +}); diff --git a/src/elements/emby-progressring/emby-progressring.template.html b/src/elements/emby-progressring/emby-progressring.template.html index bebefe5f5..a1be620b3 100644 --- a/src/elements/emby-progressring/emby-progressring.template.html +++ b/src/elements/emby-progressring/emby-progressring.template.html @@ -20,4 +20,4 @@
-
\ No newline at end of file +
diff --git a/src/elements/emby-radio/emby-radio.js b/src/elements/emby-radio/emby-radio.js index 3c72f9152..9b9159105 100644 --- a/src/elements/emby-radio/emby-radio.js +++ b/src/elements/emby-radio/emby-radio.js @@ -45,4 +45,4 @@ define(['css!./emby-radio', 'registerElement'], function () { prototype: EmbyRadioPrototype, extends: 'input' }); -}); \ No newline at end of file +}); diff --git a/src/elements/emby-textarea/emby-textarea.js b/src/elements/emby-textarea/emby-textarea.js index c500db6e1..e0ce77aa5 100644 --- a/src/elements/emby-textarea/emby-textarea.js +++ b/src/elements/emby-textarea/emby-textarea.js @@ -135,4 +135,4 @@ define(['layoutManager', 'browser', 'css!./emby-textarea', 'registerElement', 'e prototype: EmbyTextAreaPrototype, extends: 'textarea' }); -}); \ No newline at end of file +}); diff --git a/src/elements/emby-toggle/emby-toggle.js b/src/elements/emby-toggle/emby-toggle.js index 08597164b..bd7eba307 100644 --- a/src/elements/emby-toggle/emby-toggle.js +++ b/src/elements/emby-toggle/emby-toggle.js @@ -47,4 +47,4 @@ define(['css!./emby-toggle', 'registerElement'], function () { prototype: EmbyTogglePrototype, extends: 'input' }); -}); \ No newline at end of file +}); diff --git a/src/encodingsettings.html b/src/encodingsettings.html index 7d7c3a8c6..bcdd86544 100644 --- a/src/encodingsettings.html +++ b/src/encodingsettings.html @@ -144,6 +144,14 @@
${AllowOnTheFlySubtitleExtractionHelp}
+
+ +
${AllowFfmpegThrottlingHelp}
+
+
-
\ No newline at end of file +
diff --git a/src/itemdetails.html b/src/itemdetails.html index 100e3f968..a1966afe0 100644 --- a/src/itemdetails.html +++ b/src/itemdetails.html @@ -1,5 +1,5 @@ -
-
+
+
@@ -31,7 +31,7 @@ @@ -94,7 +94,7 @@ @@ -182,21 +182,21 @@

-
+

-
+

${HeaderCastCrew}

-
+
@@ -218,14 +218,14 @@

${HeaderScenes}

-
+

${HeaderMoreLikeThis}

-
+
diff --git a/src/legacy/dashboard.js b/src/legacy/dashboard.js index 11ba3177b..0268806f2 100644 --- a/src/legacy/dashboard.js +++ b/src/legacy/dashboard.js @@ -17,4 +17,4 @@ Dashboard.confirm = function(message, title, callback) { require(["loading"], function(loading) { loading.hide() }) -}; \ No newline at end of file +}; diff --git a/src/legacy/fnchecked.js b/src/legacy/fnchecked.js index 120f6e148..4f24990f4 100644 --- a/src/legacy/fnchecked.js +++ b/src/legacy/fnchecked.js @@ -7,4 +7,4 @@ define(["jQuery"], function($) { }, $.fn.checkboxradio = function() { return this } -}); \ No newline at end of file +}); diff --git a/src/legacy/selectmenu.js b/src/legacy/selectmenu.js index bc211b966..ba8c68851 100644 --- a/src/legacy/selectmenu.js +++ b/src/legacy/selectmenu.js @@ -3,4 +3,4 @@ define(["jQuery"], function($) { $.fn.selectmenu = function() { return this } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/apiclient.js b/src/libraries/apiclient/apiclient.js index 06d9cf086..d848358c3 100644 --- a/src/libraries/apiclient/apiclient.js +++ b/src/libraries/apiclient/apiclient.js @@ -233,4 +233,4 @@ define(["libraries/apiclient/apiclientcore", "localassetmanager"], function(ApiC } return ApiClient.prototype.getItemDownloadUrl.call(this, itemId) }, ApiClientEx -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/apiclientcore.js b/src/libraries/apiclient/apiclientcore.js index b6c98ebbd..ec1a329b1 100644 --- a/src/libraries/apiclient/apiclientcore.js +++ b/src/libraries/apiclient/apiclientcore.js @@ -59,8 +59,23 @@ define(["events", "appStorage"], function(events, appStorage) { } function ApiClient(serverAddress, appName, appVersion, deviceName, deviceId, devicePixelRatio) { - if (!serverAddress) throw new Error("Must supply a serverAddress"); - console.log("ApiClient serverAddress: " + serverAddress), console.log("ApiClient appName: " + appName), console.log("ApiClient appVersion: " + appVersion), console.log("ApiClient deviceName: " + deviceName), console.log("ApiClient deviceId: " + deviceId), this._serverInfo = {}, this._serverAddress = serverAddress, this._deviceId = deviceId, this._deviceName = deviceName, this._appName = appName, this._appVersion = appVersion, this._devicePixelRatio = devicePixelRatio + if (!serverAddress) { + throw new Error("Must supply a serverAddress"); + } + + console.debug("ApiClient serverAddress: " + serverAddress); + console.debug("ApiClient appName: " + appName); + console.debug("ApiClient appVersion: " + appVersion); + console.debug("ApiClient deviceName: " + deviceName); + console.debug("ApiClient deviceId: " + deviceId); + + this._serverInfo = {}; + this._serverAddress = serverAddress; + this._deviceId = deviceId; + this._deviceName = deviceName; + this._appName = appName; + this._appVersion = appVersion; + this._devicePixelRatio = devicePixelRatio; } function setSavedEndpointInfo(instance, info) { @@ -68,13 +83,14 @@ define(["events", "appStorage"], function(events, appStorage) { } function getTryConnectPromise(instance, url, state, resolve, reject) { - console.log("getTryConnectPromise " + url), fetchWithTimeout(instance.getUrl("system/info/public", null, url), { + console.debug("getTryConnectPromise " + url); + fetchWithTimeout(instance.getUrl("system/info/public", null, url), { method: "GET", accept: "application/json" }, 15e3).then(function() { - state.resolved || (state.resolved = !0, console.log("Reconnect succeeded to " + url), instance.serverAddress(url), resolve()) + state.resolved || (state.resolved = !0, console.debug("Reconnect succeeded to " + url), instance.serverAddress(url), resolve()) }, function() { - state.resolved || (console.log("Reconnect failed to " + url), ++state.rejects >= state.numAddresses && reject()) + state.resolved || (console.error("Reconnect failed to " + url), ++state.rejects >= state.numAddresses && reject()) }) } @@ -91,7 +107,7 @@ define(["events", "appStorage"], function(events, appStorage) { }), addressesStrings.push(addresses[addresses.length - 1].url)), serverInfo.RemoteAddress && -1 === addressesStrings.indexOf(serverInfo.RemoteAddress) && (addresses.push({ url: serverInfo.RemoteAddress, timeout: 200 - }), addressesStrings.push(addresses[addresses.length - 1].url)), console.log("tryReconnect: " + addressesStrings.join("|")), new Promise(function(resolve, reject) { + }), addressesStrings.push(addresses[addresses.length - 1].url)), console.debug("tryReconnect: " + addressesStrings.join("|")), new Promise(function(resolve, reject) { var state = {}; state.numAddresses = addresses.length, state.rejects = 0, addresses.map(function(url) { setTimeout(function() { @@ -103,7 +119,7 @@ define(["events", "appStorage"], function(events, appStorage) { function tryReconnect(instance, retryCount) { return retryCount = retryCount || 0, retryCount >= 20 ? Promise.reject() : tryReconnectInternal(instance).catch(function(err) { - return console.log("error in tryReconnectInternal: " + (err || "")), new Promise(function(resolve, reject) { + return console.error("error in tryReconnectInternal: " + (err || "")), new Promise(function(resolve, reject) { setTimeout(function() { tryReconnect(instance, retryCount + 1).then(resolve, reject) }, 500) @@ -139,7 +155,7 @@ define(["events", "appStorage"], function(events, appStorage) { function onWebSocketOpen() { var instance = this; - console.log("web socket connection opened"), events.trigger(instance, "websocketopen") + console.debug("web socket connection opened"), events.trigger(instance, "websocketopen") } function onWebSocketError() { @@ -149,7 +165,12 @@ define(["events", "appStorage"], function(events, appStorage) { function setSocketOnClose(apiClient, socket) { socket.onclose = function() { - console.log("web socket closed"), apiClient._webSocket === socket && (console.log("nulling out web socket"), apiClient._webSocket = null), setTimeout(function() { + console.debug("web socket closed"); + if (apiClient._webSocket === socket) { + console.debug("nulling out web socket"); + apiClient._webSocket = null; + } + setTimeout(function() { events.trigger(apiClient, "websocketclose") }, 0) } @@ -244,24 +265,24 @@ define(["events", "appStorage"], function(events, appStorage) { var lowered = url.toLowerCase(); return "/" !== name.charAt(0) && (url += "/"), url += name, params && (params = paramsToString(params)) && (url += "?" + params), url }, ApiClient.prototype.fetchWithFailover = function(request, enableReconnection) { - console.log("Requesting " + request.url), request.timeout = 3e4; + console.debug("Requesting " + request.url), request.timeout = 3e4; var instance = this; return getFetchPromise(request).then(function(response) { return instance.lastFetch = (new Date).getTime(), response.status < 400 ? "json" === request.dataType || "application/json" === request.headers.accept ? response.json() : "text" === request.dataType || 0 === (response.headers.get("Content-Type") || "").toLowerCase().indexOf("text/") ? response.text() : response : (onFetchFail(instance, request.url, response), Promise.reject(response)) }, function(error) { - if (error ? console.log("Request failed to " + request.url + " " + (error.status || "") + " " + error.toString()) : console.log("Request timed out to " + request.url), error && error.status || !enableReconnection) throw console.log("Reporting request failure"), onFetchFail(instance, request.url, {}), error; - console.log("Attempting reconnection"); + if (error ? console.error("Request failed to " + request.url + " " + (error.status || "") + " " + error.toString()) : console.error("Request timed out to " + request.url), error && error.status || !enableReconnection) throw console.error("Reporting request failure"), onFetchFail(instance, request.url, {}), error; + console.debug("Attempting reconnection"); var previousServerAddress = instance.serverAddress(); return tryReconnect(instance).then(function() { - return console.log("Reconnect succeesed"), request.url = request.url.replace(previousServerAddress, instance.serverAddress()), instance.fetchWithFailover(request, !1) + return console.debug("Reconnect succeesed"), request.url = request.url.replace(previousServerAddress, instance.serverAddress()), instance.fetchWithFailover(request, !1) }, function(innerError) { - throw console.log("Reconnect failed"), onFetchFail(instance, request.url, {}), innerError + throw console.error("Reconnect failed"), onFetchFail(instance, request.url, {}), innerError }) }) }, ApiClient.prototype.fetch = function(request, includeAuthorization) { if (!request) throw new Error("Request cannot be null"); if (request.headers = request.headers || {}, !1 !== includeAuthorization && this.setRequestHeaders(request.headers), !1 === this.enableAutomaticNetworking || "GET" !== request.type) { - console.log("Requesting url without automatic networking: " + request.url); + console.debug("Requesting url without automatic networking: " + request.url); var instance = this; return getFetchPromise(request).then(function(response) { return instance.lastFetch = (new Date).getTime(), response.status < 400 ? "json" === request.dataType || "application/json" === request.headers.accept ? response.json() : "text" === request.dataType || 0 === (response.headers.get("Content-Type") || "").toLowerCase().indexOf("text/") ? response.text() : response : (onFetchFail(instance, request.url, response), Promise.reject(response)) @@ -340,7 +361,7 @@ define(["events", "appStorage"], function(events, appStorage) { if (!this.isWebSocketOpenOrConnecting() && this.isWebSocketSupported()) try { this.openWebSocket() } catch (err) { - console.log("Error opening web socket: " + err) + console.error("error opening web socket: " + err) } }; var messageIdsReceived = {}; @@ -348,14 +369,14 @@ define(["events", "appStorage"], function(events, appStorage) { var accessToken = this.accessToken(); if (!accessToken) throw new Error("Cannot open web socket without access token."); var url = this.getUrl("socket"); - url = replaceAll(url, "emby/socket", "embywebsocket"), url = replaceAll(url, "https:", "wss:"), url = replaceAll(url, "http:", "ws:"), url += "?api_key=" + accessToken, url += "&deviceId=" + this.deviceId(), console.log("opening web socket with url: " + url); + url = replaceAll(url, "emby/socket", "embywebsocket"), url = replaceAll(url, "https:", "wss:"), url = replaceAll(url, "http:", "ws:"), url += "?api_key=" + accessToken, url += "&deviceId=" + this.deviceId(), console.debug("opening web socket with url: " + url); var webSocket = new WebSocket(url); webSocket.onmessage = onWebSocketMessage.bind(this), webSocket.onopen = onWebSocketOpen.bind(this), webSocket.onerror = onWebSocketError.bind(this), setSocketOnClose(this, webSocket), this._webSocket = webSocket }, ApiClient.prototype.closeWebSocket = function() { var socket = this._webSocket; socket && socket.readyState === WebSocket.OPEN && socket.close() }, ApiClient.prototype.sendWebSocketMessage = function(name, data) { - console.log("Sending web socket message: " + name); + console.debug("Sending web socket message: " + name); var msg = { MessageType: name }; @@ -387,7 +408,7 @@ define(["events", "appStorage"], function(events, appStorage) { }, ApiClient.prototype.updateServerInfo = function(server, serverUrl) { if (null == server) throw new Error("server cannot be null"); if (this.serverInfo(server), !serverUrl) throw new Error("serverUrl cannot be null. serverInfo: " + JSON.stringify(server)); - console.log("Setting server address to " + serverUrl), this.serverAddress(serverUrl) + console.debug("Setting server address to " + serverUrl), this.serverAddress(serverUrl) }, ApiClient.prototype.isWebSocketSupported = function() { try { return null != WebSocket diff --git a/src/libraries/apiclient/appStorage.js b/src/libraries/apiclient/appStorage.js index 6083bb495..dacf38822 100644 --- a/src/libraries/apiclient/appStorage.js +++ b/src/libraries/apiclient/appStorage.js @@ -2,7 +2,7 @@ define([], function() { "use strict"; function onCachePutFail(e) { - console.log(e); + console.error("cannot put to a cache: " + e); } function updateCache(instance) { @@ -45,9 +45,9 @@ define([], function() { self.caches.open("embydata").then(onCacheOpened.bind(this)); } } catch (err) { - console.log("Error opening cache: " + err); + console.error("error opening cache: " + err); } } return new MyStore; -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/connectionmanager.js b/src/libraries/apiclient/connectionmanager.js index 7e7d578cb..a8e389bd0 100644 --- a/src/libraries/apiclient/connectionmanager.js +++ b/src/libraries/apiclient/connectionmanager.js @@ -95,18 +95,18 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } function fetchWithTimeout(url, options, timeoutMs) { - console.log("fetchWithTimeout: timeoutMs: " + timeoutMs + ", url: " + url); + console.debug("fetchWithTimeout: timeoutMs: " + timeoutMs + ", url: " + url); return new Promise(function (resolve, reject) { var timeout = setTimeout(reject, timeoutMs); options = options || {}; options.credentials = "same-origin"; fetch(url, options).then(function (response) { clearTimeout(timeout); - console.log("fetchWithTimeout: succeeded connecting to url: " + url); + console.debug("fetchWithTimeout: succeeded connecting to url: " + url); resolve(response); }, function (error) { clearTimeout(timeout); - console.log("fetchWithTimeout: timed out connecting to url: " + url); + console.error("fetchWithTimeout: timed out connecting to url: " + url); reject(); }); }); @@ -118,9 +118,9 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } request.headers = request.headers || {}; - console.log("ConnectionManager requesting url: " + request.url); + console.debug("ConnectionManager requesting url: " + request.url); return getFetchPromise(request).then(function (response) { - console.log("ConnectionManager response status: " + response.status + ", url: " + request.url); + console.debug("ConnectionManager response status: " + response.status + ", url: " + request.url); if (response.status < 400) { if ("json" === request.dataType || "application/json" === request.headers.accept) { @@ -132,7 +132,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory return Promise.reject(response); }, function (err) { - console.log("ConnectionManager request failed to url: " + request.url); + console.error("ConnectionManager request failed to url: " + request.url); throw err; }); } @@ -227,7 +227,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory apiClient.enableAutomaticBitrateDetection = options.enableAutomaticBitrateDetection; if (false !== options.enableWebSocket) { - console.log("calling apiClient.ensureWebSocket"); + console.debug("calling apiClient.ensureWebSocket"); apiClient.ensureWebSocket(); } } @@ -333,7 +333,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } function getTryConnectPromise(url, connectionMode, state, resolve, reject) { - console.log("getTryConnectPromise " + url); + console.debug("getTryConnectPromise " + url); ajax({ url: getEmbyServerUrl(url, "system/info/public"), timeout: defaultTimeout, @@ -342,7 +342,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }).then(function (result) { if (!state.resolved) { state.resolved = true; - console.log("Reconnect succeeded to " + url); + console.debug("Reconnect succeeded to " + url); resolve({ url: url, connectionMode: connectionMode, @@ -351,7 +351,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } }, function () { if (!state.resolved) { - console.log("Reconnect failed to " + url); + console.error("Reconnect failed to " + url); if (++state.rejects >= state.numAddresses) { reject(); @@ -391,7 +391,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory addressesStrings.push(addresses[addresses.length - 1].url); } - console.log("tryReconnect: " + addressesStrings.join("|")); + console.debug("tryReconnect: " + addressesStrings.join("|")); return new Promise(function (resolve, reject) { var state = {}; state.numAddresses = addresses.length; @@ -458,7 +458,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory } } - console.log("Begin ConnectionManager constructor"); + console.debug("Begin ConnectionManager constructor"); var self = this; this._apiClients = []; self._minServerVersion = "3.2.33"; @@ -530,7 +530,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.clearData = function () { - console.log("connection manager clearing data"); + console.debug("connection manager clearing data"); var credentials = credentialProvider.credentials(); credentials.Servers = []; credentialProvider.credentials(credentials); @@ -550,7 +550,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory events.trigger(self, "apiclientcreated", [apiClient]); } - console.log("returning instance from getOrAddApiClient"); + console.debug("returning instance from getOrAddApiClient"); return apiClient; }; @@ -592,7 +592,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.logout = function () { - console.log("begin connectionManager loguot"); + console.debug("begin connectionManager loguot"); var promises = []; for (var i = 0, length = self._apiClients.length; i < length; i++) { @@ -628,7 +628,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.getAvailableServers = function () { - console.log("Begin getAvailableServers"); + console.debug("begin getAvailableServers"); var credentials = credentialProvider.credentials(); return Promise.all([findServers()]).then(function (responses) { var foundServers = responses[0]; @@ -644,7 +644,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.connectToServers = function (servers, options) { - console.log("Begin connectToServers, with " + servers.length + " servers"); + console.debug("begin connectToServers, with " + servers.length + " servers"); var firstServer = servers.length ? servers[0] : null; if (firstServer) { @@ -653,7 +653,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory result.State = "ServerSelection"; } - console.log("resolving connectToServers with result.State: " + result.State); + console.debug("resolving connectToServers with result.State: " + result.State); return result; }); } @@ -665,7 +665,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; self.connectToServer = function (server, options) { - console.log("begin connectToServer"); + console.debug("begin connectToServer"); return new Promise(function (resolve, reject) { options = options || {}; tryReconnect(server).then(function (result) { @@ -674,14 +674,14 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory result = result.data; if (1 === compareVersions(self.minServerVersion(), result.Version)) { - console.log("minServerVersion requirement not met. Server version: " + result.Version); + console.debug("minServerVersion requirement not met. Server version: " + result.Version); resolve({ State: "ServerUpdateNeeded", Servers: [server] }); } else { if (server.Id && result.Id !== server.Id) { - console.log("http request succeeded, but found a different server Id than what was expected"); + console.debug("http request succeeded, but found a different server Id than what was expected"); resolveFailure(self, resolve); } else { onSuccessfulConnection(server, result, connectionMode, serverUrl, options, resolve); @@ -695,7 +695,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory self.connectToAddress = function (address, options) { function onFail() { - console.log("connectToAddress " + address + " failed"); + console.error("connectToAddress " + address + " failed"); return Promise.resolve({ State: "Unavailable", }); @@ -741,7 +741,7 @@ define(["events", "apiclient", "appStorage"], function (events, apiClientFactory }; ConnectionManager.prototype.connect = function (options) { - console.log("Begin connect"); + console.debug("begin connect"); var instance = this; return instance.getAvailableServers().then(function (servers) { return instance.connectToServers(servers, options); diff --git a/src/libraries/apiclient/credentialprovider.js b/src/libraries/apiclient/credentialprovider.js index 471f2b5ef..4ae809cac 100644 --- a/src/libraries/apiclient/credentialprovider.js +++ b/src/libraries/apiclient/credentialprovider.js @@ -4,7 +4,7 @@ define(["events", "appStorage"], function(events, appStorage) { function ensure(instance, data) { if (!instance._credentials) { var json = appStorage.getItem(instance.key) || "{}"; - console.log("credentials initialized with: " + json), instance._credentials = JSON.parse(json), instance._credentials.Servers = instance._credentials.Servers || [] + console.debug("credentials initialized with: " + json), instance._credentials = JSON.parse(json), instance._credentials.Servers = instance._credentials.Servers || [] } } @@ -26,4 +26,4 @@ define(["events", "appStorage"], function(events, appStorage) { })[0]; return existing ? (existing.DateLastAccessed = Math.max(existing.DateLastAccessed || 0, server.DateLastAccessed || 0), existing.UserLinkType = server.UserLinkType, server.AccessToken && (existing.AccessToken = server.AccessToken, existing.UserId = server.UserId), server.ExchangeToken && (existing.ExchangeToken = server.ExchangeToken), server.RemoteAddress && (existing.RemoteAddress = server.RemoteAddress), server.ManualAddress && (existing.ManualAddress = server.ManualAddress), server.LocalAddress && (existing.LocalAddress = server.LocalAddress), server.Name && (existing.Name = server.Name), null != server.LastConnectionMode && (existing.LastConnectionMode = server.LastConnectionMode), server.ConnectServerId && (existing.ConnectServerId = server.ConnectServerId), existing) : (list.push(server), server) }, Credentials -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/events.js b/src/libraries/apiclient/events.js index 6204dc4d4..c109ee9c4 100644 --- a/src/libraries/apiclient/events.js +++ b/src/libraries/apiclient/events.js @@ -27,4 +27,4 @@ define([], function() { }) } } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/localassetmanager.js b/src/libraries/apiclient/localassetmanager.js index fbe74aae5..6fb1d4722 100644 --- a/src/libraries/apiclient/localassetmanager.js +++ b/src/libraries/apiclient/localassetmanager.js @@ -2,7 +2,7 @@ define(["filerepository", "itemrepository", "useractionrepository", "transferman "use strict"; function getLocalItem(serverId, itemId) { - return console.log("[lcoalassetmanager] Begin getLocalItem"), itemrepository.get(serverId, itemId) + return console.debug("localassetmanager: begin getLocalItem"), itemrepository.get(serverId, itemId) } function recordUserAction(action) { @@ -25,7 +25,7 @@ define(["filerepository", "itemrepository", "useractionrepository", "transferman } function getServerItems(serverId) { - return console.log("[localassetmanager] Begin getServerItems"), itemrepository.getAll(serverId) + return console.debug("localassetmanager: begin getServerItems"), itemrepository.getAll(serverId) } function getItemsFromIds(serverId, ids) { diff --git a/src/libraries/apiclient/package.json b/src/libraries/apiclient/package.json index 0069cfc6b..67f9d4975 100644 --- a/src/libraries/apiclient/package.json +++ b/src/libraries/apiclient/package.json @@ -1,3 +1,3 @@ { "main": "apiclient.js" -} \ No newline at end of file +} diff --git a/src/libraries/apiclient/sync/filerepository.js b/src/libraries/apiclient/sync/filerepository.js index 198967469..5b7088af3 100644 --- a/src/libraries/apiclient/sync/filerepository.js +++ b/src/libraries/apiclient/sync/filerepository.js @@ -42,4 +42,4 @@ define([], function() { getItemFileSize: getItemFileSize, getImageUrl: getImageUrl } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/itemrepository.js b/src/libraries/apiclient/sync/itemrepository.js index 5330d5d1a..db1f96287 100644 --- a/src/libraries/apiclient/sync/itemrepository.js +++ b/src/libraries/apiclient/sync/itemrepository.js @@ -120,4 +120,4 @@ define([], function() { getAll: getAll, getServerItemTypes: getServerItemTypes } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/localsync.js b/src/libraries/apiclient/sync/localsync.js index cea244de0..14e9ff9c0 100644 --- a/src/libraries/apiclient/sync/localsync.js +++ b/src/libraries/apiclient/sync/localsync.js @@ -3,7 +3,7 @@ define(["connectionManager"], function(connectionManager) { var isSyncing; return { sync: function(options) { - return console.log("localSync.sync starting..."), isSyncing ? Promise.resolve() : (isSyncing = !0, new Promise(function(resolve, reject) { + return console.debug("localSync.sync starting..."), isSyncing ? Promise.resolve() : (isSyncing = !0, new Promise(function(resolve, reject) { require(["multiserversync", "appSettings"], function(MultiServerSync, appSettings) { options = options || {}, options.cameraUploadServers = appSettings.cameraUploadServers(), (new MultiServerSync).sync(connectionManager, options).then(function() { isSyncing = null, resolve() @@ -14,4 +14,4 @@ define(["connectionManager"], function(connectionManager) { })) } } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/mediasync.js b/src/libraries/apiclient/sync/mediasync.js index 24220561a..e6d9e781f 100644 --- a/src/libraries/apiclient/sync/mediasync.js +++ b/src/libraries/apiclient/sync/mediasync.js @@ -2,9 +2,9 @@ define(["localassetmanager"], function(localassetmanager) { "use strict"; function processDownloadStatus(apiClient, serverInfo, options) { - return console.log("[mediasync] Begin processDownloadStatus"), localassetmanager.resyncTransfers().then(function() { + return console.debug("mediasync: begin processDownloadStatus"), localassetmanager.resyncTransfers().then(function() { return localassetmanager.getServerItems(serverInfo.Id).then(function(items) { - console.log("[mediasync] Begin processDownloadStatus getServerItems completed"); + console.debug("mediasync: begin processDownloadStatus getServerItems completed"); var p = Promise.resolve(), cnt = 0; return items.filter(function(item) { @@ -14,7 +14,9 @@ define(["localassetmanager"], function(localassetmanager) { return reportTransfer(apiClient, item) }), cnt++ }), p.then(function() { - return console.log("[mediasync] Exit processDownloadStatus. Items reported: " + cnt.toString()), Promise.resolve() + console.debug("mediasync: exit processDownloadStatus"); + console.debug("items reported: " + cnt.toString()); + return Promise.resolve(); }) }) }) @@ -23,39 +25,39 @@ define(["localassetmanager"], function(localassetmanager) { function reportTransfer(apiClient, item) { return localassetmanager.getItemFileSize(item.LocalPath).then(function(size) { return size > 0 ? apiClient.reportSyncJobItemTransferred(item.SyncJobItemId).then(function() { - return item.SyncStatus = "synced", console.log("[mediasync] reportSyncJobItemTransferred called for " + item.LocalPath), localassetmanager.addOrUpdateLocalItem(item) + return item.SyncStatus = "synced", console.debug("mediasync: reportSyncJobItemTransferred called for " + item.LocalPath), localassetmanager.addOrUpdateLocalItem(item) }, function(error) { - return console.error("[mediasync] Mediasync error on reportSyncJobItemTransferred", error), item.SyncStatus = "error", localassetmanager.addOrUpdateLocalItem(item) + return console.error("mediasync: mediasync error on reportSyncJobItemTransferred", error), item.SyncStatus = "error", localassetmanager.addOrUpdateLocalItem(item) }) : localassetmanager.isDownloadFileInQueue(item.LocalPath).then(function(result) { - return result ? Promise.resolve() : (console.log("[mediasync] reportTransfer: Size is 0 and download no longer in queue. Deleting item."), localassetmanager.removeLocalItem(item).then(function() { - return console.log("[mediasync] reportTransfer: Item deleted."), Promise.resolve() + return result ? Promise.resolve() : (console.debug("mediasync: reportTransfer: Size is 0 and download no longer in queue. Deleting item."), localassetmanager.removeLocalItem(item).then(function() { + return console.debug("mediasync: reportTransfer: Item deleted."), Promise.resolve() }, function(err2) { - return console.log("[mediasync] reportTransfer: Failed to delete item.", err2), Promise.resolve() + return console.debug("mediasync: reportTransfer: Failed to delete item.", err2), Promise.resolve() })) }) }, function(error) { - return console.error("[mediasync] reportTransfer: error on getItemFileSize. Deleting item.", error), localassetmanager.removeLocalItem(item).then(function() { - return console.log("[mediasync] reportTransfer: Item deleted."), Promise.resolve() + return console.error("mediasync: reportTransfer: error on getItemFileSize. Deleting item.", error), localassetmanager.removeLocalItem(item).then(function() { + return console.debug("mediasync: reportTransfer: Item deleted."), Promise.resolve() }, function(err2) { - return console.log("[mediasync] reportTransfer: Failed to delete item.", err2), Promise.resolve() + return console.error("mediasync: reportTransfer: Failed to delete item.", err2), Promise.resolve() }) }) } function reportOfflineActions(apiClient, serverInfo) { - return console.log("[mediasync] Begin reportOfflineActions"), localassetmanager.getUserActions(serverInfo.Id).then(function(actions) { + return console.debug("mediasync: begin reportOfflineActions"), localassetmanager.getUserActions(serverInfo.Id).then(function(actions) { return actions.length ? apiClient.reportOfflineActions(actions).then(function() { return localassetmanager.deleteUserActions(actions).then(function() { - return console.log("[mediasync] Exit reportOfflineActions (actions reported and deleted.)"), Promise.resolve() + return console.debug("mediasync: exit reportOfflineActions (actions reported and deleted.)"), Promise.resolve() }) }, function(err) { - return console.error("[mediasync] error on apiClient.reportOfflineActions: " + err.toString()), localassetmanager.deleteUserActions(actions) - }) : (console.log("[mediasync] Exit reportOfflineActions (no actions)"), Promise.resolve()) + return console.error("mediasync: error on apiClient.reportOfflineActions: " + err.toString()), localassetmanager.deleteUserActions(actions) + }) : (console.debug("mediasync: exit reportOfflineActions (no actions)"), Promise.resolve()) }) } function syncData(apiClient, serverInfo) { - return console.log("[mediasync] Begin syncData"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { + return console.debug("mediasync: begin syncData"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { var completedItems = items.filter(function(item) { return item && ("synced" === item.SyncStatus || "error" === item.SyncStatus) }), @@ -67,16 +69,16 @@ define(["localassetmanager"], function(localassetmanager) { }; return apiClient.syncData(request).then(function(result) { return afterSyncData(apiClient, serverInfo, result).then(function() { - return console.log("[mediasync] Exit syncData"), Promise.resolve() + return console.debug("mediasync: exit syncData"), Promise.resolve() }, function(err) { - return console.error("[mediasync] Error in syncData: " + err.toString()), Promise.resolve() + return console.error("mediasync: error in syncData: " + err.toString()), Promise.resolve() }) }) }) } function afterSyncData(apiClient, serverInfo, syncDataResult) { - console.log("[mediasync] Begin afterSyncData"); + console.debug("mediasync: begin afterSyncData"); var p = Promise.resolve(); return syncDataResult.ItemIdsToRemove && syncDataResult.ItemIdsToRemove.length > 0 && syncDataResult.ItemIdsToRemove.forEach(function(itemId) { p = p.then(function() { @@ -85,25 +87,25 @@ define(["localassetmanager"], function(localassetmanager) { }), p = p.then(function() { return removeObsoleteContainerItems(serverInfo.Id) }), p.then(function() { - return console.log("[mediasync] Exit afterSyncData"), Promise.resolve() + return console.debug("mediasync: exit afterSyncData"), Promise.resolve() }) } function removeObsoleteContainerItems(serverId) { - return console.log("[mediasync] Begin removeObsoleteContainerItems"), localassetmanager.removeObsoleteContainerItems(serverId) + return console.debug("mediasync: begin removeObsoleteContainerItems"), localassetmanager.removeObsoleteContainerItems(serverId) } function removeLocalItem(itemId, serverId) { - return console.log("[mediasync] Begin removeLocalItem"), localassetmanager.getLocalItem(serverId, itemId).then(function(item) { + return console.debug("mediasync: begin removeLocalItem"), localassetmanager.getLocalItem(serverId, itemId).then(function(item) { return item ? localassetmanager.removeLocalItem(item) : Promise.resolve() }, function(err2) { - return console.error("[mediasync] removeLocalItem: Failed: ", err2), Promise.resolve() + return console.error("mediasync: removeLocalItem: Failed: ", err2), Promise.resolve() }) } function getNewMedia(apiClient, downloadCount) { - return console.log("[mediasync] Begin getNewMedia"), apiClient.getReadySyncItems(apiClient.deviceId()).then(function(jobItems) { - console.log("[mediasync] getReadySyncItems returned " + jobItems.length + " items"); + return console.debug("mediasync: begin getNewMedia"), apiClient.getReadySyncItems(apiClient.deviceId()).then(function(jobItems) { + console.debug("mediasync: getReadySyncItems returned " + jobItems.length + " items"); var p = Promise.resolve(), currentCount = downloadCount; return jobItems.forEach(function(jobItem) { @@ -111,15 +113,15 @@ define(["localassetmanager"], function(localassetmanager) { return getNewItem(jobItem, apiClient) })) }), p.then(function() { - return console.log("[mediasync] Exit getNewMedia"), Promise.resolve() + return console.debug("mediasync: exit getNewMedia"), Promise.resolve() }) }, function(err) { - return console.error("[mediasync] getReadySyncItems: Failed: ", err), Promise.resolve() + return console.error("mediasync: getReadySyncItems: Failed: ", err), Promise.resolve() }) } function afterMediaDownloaded(apiClient, jobItem, localItem) { - return console.log("[mediasync] Begin afterMediaDownloaded"), getImages(apiClient, jobItem, localItem).then(function() { + return console.debug("mediasync: begin afterMediaDownloaded"), getImages(apiClient, jobItem, localItem).then(function() { var libraryItem = jobItem.Item; return downloadParentItems(apiClient, jobItem, libraryItem).then(function() { return getSubtitles(apiClient, jobItem, localItem) @@ -128,21 +130,21 @@ define(["localassetmanager"], function(localassetmanager) { } function createLocalItem(libraryItem, jobItem) { - console.log("[localassetmanager] Begin createLocalItem"); + console.debug("localassetmanager: begin createLocalItem"); var item = { Item: libraryItem, ItemId: libraryItem.Id, ServerId: libraryItem.ServerId, Id: libraryItem.Id }; - return jobItem && (item.SyncJobItemId = jobItem.SyncJobItemId), console.log("[localassetmanager] End createLocalItem"), item + return jobItem && (item.SyncJobItemId = jobItem.SyncJobItemId), console.debug("localassetmanager: end createLocalItem"), item } function getNewItem(jobItem, apiClient) { - console.log("[mediasync] Begin getNewItem"); + console.debug("mediasync: begin getNewItem"); var libraryItem = jobItem.Item; return localassetmanager.getLocalItem(libraryItem.ServerId, libraryItem.Id).then(function(existingItem) { - if (existingItem && ("queued" === existingItem.SyncStatus || "transferring" === existingItem.SyncStatus || "synced" === existingItem.SyncStatus) && (console.log("[mediasync] getNewItem: getLocalItem found existing item"), localassetmanager.enableBackgroundCompletion())) return Promise.resolve(); + if (existingItem && ("queued" === existingItem.SyncStatus || "transferring" === existingItem.SyncStatus || "synced" === existingItem.SyncStatus) && (console.debug("mediasync: getNewItem: getLocalItem found existing item"), localassetmanager.enableBackgroundCompletion())) return Promise.resolve(); libraryItem.CanDelete = !1, libraryItem.CanDownload = !1, libraryItem.SupportsSync = !1, libraryItem.People = [], libraryItem.Chapters = [], libraryItem.Studios = [], libraryItem.SpecialFeatureCount = null, libraryItem.LocalTrailerCount = null, libraryItem.RemoteTrailers = []; var localItem = createLocalItem(libraryItem, jobItem); return localItem.SyncStatus = "queued", downloadMedia(apiClient, jobItem, localItem) @@ -169,7 +171,7 @@ define(["localassetmanager"], function(localassetmanager) { return localassetmanager.addOrUpdateLocalItem(localItem).then(function() { return Promise.resolve(localItem) }, function(err) { - return console.error("[mediasync] downloadItem failed: " + err.toString()), Promise.resolve(null) + return console.error("mediasync: downloadItem failed: " + err.toString()), Promise.resolve(null) }) }) } @@ -183,12 +185,12 @@ define(["localassetmanager"], function(localassetmanager) { } function downloadMedia(apiClient, jobItem, localItem) { - console.log("[mediasync] downloadMedia: start."); + console.debug("mediasync: downloadMedia: start."); var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/File", { api_key: apiClient.accessToken() }); return ensureLocalPathParts(localItem, jobItem), localassetmanager.downloadFile(url, localItem).then(function(result) { - console.log("[mediasync] downloadMedia-downloadFile returned path: " + result.path); + console.debug("mediasync: downloadMedia-downloadFile returned path: " + result.path); var localPath = result.path, libraryItem = localItem.Item; if (localPath && libraryItem.MediaSources) @@ -200,18 +202,18 @@ define(["localassetmanager"], function(localassetmanager) { return afterMediaDownloaded(apiClient, jobItem, localItem).then(function() { return result.isComplete ? (localItem.SyncStatus = "synced", reportTransfer(apiClient, localItem)) : Promise.resolve() }, function(err) { - return console.log("[mediasync] downloadMedia: afterMediaDownloaded failed: " + err), Promise.reject(err) + return console.debug("mediasync: downloadMedia: afterMediaDownloaded failed: " + err), Promise.reject(err) }) }, function(err) { - return console.log("[mediasync] downloadMedia: addOrUpdateLocalItem failed: " + err), Promise.reject(err) + return console.debug("mediasync: downloadMedia: addOrUpdateLocalItem failed: " + err), Promise.reject(err) }) }, function(err) { - return console.log("[mediasync] downloadMedia: localassetmanager.downloadFile failed: " + err), Promise.reject(err) + return console.debug("mediasync: downloadMedia: localassetmanager.downloadFile failed: " + err), Promise.reject(err) }) } function getImages(apiClient, jobItem, localItem) { - console.log("[mediasync] Begin getImages"); + console.debug("mediasync: begin getImages"); var p = Promise.resolve(), libraryItem = localItem.Item, serverId = libraryItem.ServerId, @@ -249,15 +251,15 @@ define(["localassetmanager"], function(localassetmanager) { })), libraryItem.ParentPrimaryImageItemId && libraryItem.ParentPrimaryImageTag && (p = p.then(function() { return downloadImage(localItem, apiClient, serverId, libraryItem.ParentPrimaryImageItemId, libraryItem.ParentPrimaryImageTag, "Primary") })), p.then(function() { - return console.log("[mediasync] Finished getImages"), localassetmanager.addOrUpdateLocalItem(localItem) + return console.debug("mediasync: finished getImages"), localassetmanager.addOrUpdateLocalItem(localItem) }, function(err) { - return console.log("[mediasync] Error getImages: " + err.toString()), Promise.resolve() + return console.error("mediasync: error getImages: " + err.toString()), Promise.resolve() }) } function downloadImage(localItem, apiClient, serverId, itemId, imageTag, imageType, index) { return index = index || 0, localassetmanager.hasImage(serverId, itemId, imageType, index).then(function(hasImage) { - if (hasImage) return console.log("[mediasync] downloadImage - skip existing: " + itemId + " " + imageType + "_" + index.toString()), Promise.resolve(); + if (hasImage) return console.debug("mediasync: downloadImage - skip existing: " + itemId + " " + imageType + "_" + index.toString()), Promise.resolve(); var maxWidth = 400; "backdrop" === imageType && (maxWidth = null); var imageUrl = apiClient.getScaledImageUrl(itemId, { @@ -266,18 +268,18 @@ define(["localassetmanager"], function(localassetmanager) { maxWidth: maxWidth, api_key: apiClient.accessToken() }); - return console.log("[mediasync] downloadImage " + itemId + " " + imageType + "_" + index.toString()), localassetmanager.downloadImage(localItem, imageUrl, serverId, itemId, imageType, index).then(function(result) { + return console.debug("mediasync: downloadImage " + itemId + " " + imageType + "_" + index.toString()), localassetmanager.downloadImage(localItem, imageUrl, serverId, itemId, imageType, index).then(function(result) { return Promise.resolve(result) }, function(err) { - return console.log("[mediasync] Error downloadImage: " + err.toString()), Promise.resolve() + return console.error("mediasync: error downloadImage: " + err.toString()), Promise.resolve() }) }, function(err) { - return console.log("[mediasync] Error downloadImage: " + err.toString()), Promise.resolve() + return console.error("mediasync: error downloadImage: " + err.toString()), Promise.resolve() }) } function getSubtitles(apiClient, jobItem, localItem) { - if (console.log("[mediasync] Begin getSubtitles"), !jobItem.Item.MediaSources.length) return console.log("[mediasync] Cannot download subtitles because video has no media source info."), Promise.resolve(); + if (console.debug("mediasync: begin getSubtitles"), !jobItem.Item.MediaSources.length) return console.debug("mediasync: cannot download subtitles because video has no media source info."), Promise.resolve(); var files = jobItem.AdditionalFiles.filter(function(f) { return "Subtitles" === f.Type }), @@ -288,16 +290,16 @@ define(["localassetmanager"], function(localassetmanager) { return getItemSubtitle(file, apiClient, jobItem, localItem, mediaSource) }) }), p.then(function() { - return console.log("[mediasync] Exit getSubtitles"), Promise.resolve() + return console.debug("mediasync: exit getSubtitles"), Promise.resolve() }) } function getItemSubtitle(file, apiClient, jobItem, localItem, mediaSource) { - console.log("[mediasync] Begin getItemSubtitle"); + console.debug("mediasync: begin getItemSubtitle"); var subtitleStream = mediaSource.MediaStreams.filter(function(m) { return "Subtitle" === m.Type && m.Index === file.Index })[0]; - if (!subtitleStream) return console.log("[mediasync] Cannot download subtitles because matching stream info was not found."), Promise.resolve(); + if (!subtitleStream) return console.debug("mediasync: cannot download subtitles because matching stream info was not found."), Promise.resolve(); var url = apiClient.getUrl("Sync/JobItems/" + jobItem.SyncJobItemId + "/AdditionalFiles", { Name: file.Name, api_key: apiClient.accessToken() @@ -311,7 +313,7 @@ define(["localassetmanager"], function(localassetmanager) { } function checkLocalFileExistence(apiClient, serverInfo, options) { - return options.checkFileExistence ? (console.log("[mediasync] Begin checkLocalFileExistence"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { + return options.checkFileExistence ? (console.debug("mediasync: begin checkLocalFileExistence"), localassetmanager.getServerItems(serverInfo.Id).then(function(items) { var completedItems = items.filter(function(item) { return item && ("synced" === item.SyncStatus || "error" === item.SyncStatus) }), @@ -332,13 +334,13 @@ define(["localassetmanager"], function(localassetmanager) { return function() { var self = this; "string" == typeof webWorkerBaseUrl && -1 !== webWorkerBaseUrl.indexOf("ms-appx://") ? self.sync = function(apiClient, serverInfo, options) { - return console.log("[mediasync]************************************* Start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { + return console.debug("mediasync: start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { return processDownloadStatus(apiClient, serverInfo, options).then(function() { return localassetmanager.getDownloadItemCount().then(function(downloadCount) { return !0 === options.syncCheckProgressOnly && downloadCount > 2 ? Promise.resolve() : reportOfflineActions(apiClient, serverInfo).then(function() { return getNewMedia(apiClient, downloadCount).then(function() { return syncData(apiClient, serverInfo).then(function() { - return console.log("[mediasync]************************************* Exit sync"), Promise.resolve() + return console.debug("mediasync: Exit sync"), Promise.resolve() }) }) }) @@ -348,7 +350,7 @@ define(["localassetmanager"], function(localassetmanager) { console.error(err.toString()) }) } : self.sync = function(apiClient, serverInfo, options) { - return console.log("[mediasync]************************************* Start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { + return console.debug("mediasync: Start sync"), checkLocalFileExistence(apiClient, serverInfo, options).then(function() { return syncData(apiClient, serverInfo).then(function() { return processDownloadStatus(apiClient, serverInfo, options).then(function() { return localassetmanager.getDownloadItemCount().then(function(downloadCount) { @@ -365,4 +367,4 @@ define(["localassetmanager"], function(localassetmanager) { }) } } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/multiserversync.js b/src/libraries/apiclient/sync/multiserversync.js index 0654b5615..ff01a5ad1 100644 --- a/src/libraries/apiclient/sync/multiserversync.js +++ b/src/libraries/apiclient/sync/multiserversync.js @@ -3,20 +3,20 @@ define(["serversync"], function(ServerSync) { function syncNext(connectionManager, servers, index, options, resolve, reject) { var length = servers.length; - if (index >= length) return console.log("MultiServerSync.sync complete"), void resolve(); + if (index >= length) return console.debug("MultiServerSync.sync complete"), void resolve(); var server = servers[index]; - console.log("Creating ServerSync to server: " + server.Id), (new ServerSync).sync(connectionManager, server, options).then(function() { - console.log("ServerSync succeeded to server: " + server.Id), syncNext(connectionManager, servers, index + 1, options, resolve, reject) + console.debug("Creating ServerSync to server: " + server.Id), (new ServerSync).sync(connectionManager, server, options).then(function() { + console.debug("ServerSync succeeded to server: " + server.Id), syncNext(connectionManager, servers, index + 1, options, resolve, reject) }, function(err) { - console.log("ServerSync failed to server: " + server.Id + ". " + err), syncNext(connectionManager, servers, index + 1, options, resolve, reject) + console.error("ServerSync failed to server: " + server.Id + ". " + err), syncNext(connectionManager, servers, index + 1, options, resolve, reject) }) } function MultiServerSync() {} return MultiServerSync.prototype.sync = function(connectionManager, options) { - return console.log("MultiServerSync.sync starting..."), new Promise(function(resolve, reject) { + return console.debug("MultiServerSync.sync starting..."), new Promise(function(resolve, reject) { var servers = connectionManager.getSavedServers(); syncNext(connectionManager, servers, 0, options, resolve, reject) }) }, MultiServerSync -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/serversync.js b/src/libraries/apiclient/sync/serversync.js index 34a1b11e8..887b829ce 100644 --- a/src/libraries/apiclient/sync/serversync.js +++ b/src/libraries/apiclient/sync/serversync.js @@ -2,11 +2,11 @@ define([], function() { "use strict"; function performSync(connectionManager, server, options) { - console.log("ServerSync.performSync to server: " + server.Id), options = options || {}; + console.debug("ServerSync.performSync to server: " + server.Id), options = options || {}; var cameraUploadServers = options.cameraUploadServers || []; - console.log("ServerSync cameraUploadServers: " + JSON.stringify(cameraUploadServers)); + console.debug("ServerSync cameraUploadServers: " + JSON.stringify(cameraUploadServers)); var uploadPhotos = -1 !== cameraUploadServers.indexOf(server.Id); - return console.log("ServerSync uploadPhotos: " + uploadPhotos), (uploadPhotos ? uploadContent(connectionManager, server, options) : Promise.resolve()).then(function() { + return console.debug("ServerSync uploadPhotos: " + uploadPhotos), (uploadPhotos ? uploadContent(connectionManager, server, options) : Promise.resolve()).then(function() { return syncMedia(connectionManager, server, options) }) } @@ -26,7 +26,7 @@ define([], function() { function ServerSync() {} return ServerSync.prototype.sync = function(connectionManager, server, options) { - if (!server.AccessToken && !server.ExchangeToken) return console.log("Skipping sync to server " + server.Id + " because there is no saved authentication information."), Promise.resolve(); + if (!server.AccessToken && !server.ExchangeToken) return console.debug("Skipping sync to server " + server.Id + " because there is no saved authentication information."), Promise.resolve(); var connectionOptions = { updateDateLastAccessed: !1, enableWebSocket: !1, @@ -34,9 +34,9 @@ define([], function() { enableAutomaticBitrateDetection: !1 }; return connectionManager.connectToServer(server, connectionOptions).then(function(result) { - return "SignedIn" === result.State ? performSync(connectionManager, server, options) : (console.log("Unable to connect to server id: " + server.Id), Promise.reject()) + return "SignedIn" === result.State ? performSync(connectionManager, server, options) : (console.error("Unable to connect to server id: " + server.Id), Promise.reject()) }, function(err) { - throw console.log("Unable to connect to server id: " + server.Id), err + throw console.error("Unable to connect to server id: " + server.Id), err }) }, ServerSync -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/transfermanager.js b/src/libraries/apiclient/sync/transfermanager.js index 162a6a122..d9889fffb 100644 --- a/src/libraries/apiclient/sync/transfermanager.js +++ b/src/libraries/apiclient/sync/transfermanager.js @@ -27,4 +27,4 @@ define([], function() { resyncTransfers: resyncTransfers, getDownloadItemCount: getDownloadItemCount } -}); \ No newline at end of file +}); diff --git a/src/libraries/apiclient/sync/useractionrepository.js b/src/libraries/apiclient/sync/useractionrepository.js index 8612b05be..7b33ba1c3 100644 --- a/src/libraries/apiclient/sync/useractionrepository.js +++ b/src/libraries/apiclient/sync/useractionrepository.js @@ -105,4 +105,4 @@ define([], function() { getAll: getAll, getByServerId: getByServerId } -}); \ No newline at end of file +}); diff --git a/src/libraries/pagejs/page.js b/src/libraries/pagejs/page.js index ce96fd185..be5c8aee9 100644 --- a/src/libraries/pagejs/page.js +++ b/src/libraries/pagejs/page.js @@ -1074,4 +1074,4 @@ define([], function () { return page; -}); \ No newline at end of file +}); diff --git a/src/libraries/query-string/index.js b/src/libraries/query-string/index.js index 515b745bf..cc63f52b8 100644 --- a/src/libraries/query-string/index.js +++ b/src/libraries/query-string/index.js @@ -15,4 +15,4 @@ window.queryString = {}, window.queryString.extract = function(maybeUrl) { return encodeURIComponent(key) + "=" + encodeURIComponent(val2) }).join("&") : encodeURIComponent(key) + "=" + encodeURIComponent(val) }).join("&") : "" -}; \ No newline at end of file +}; diff --git a/src/libraries/query-string/test.js b/src/libraries/query-string/test.js index 4e16ad17c..072a33fb1 100644 --- a/src/libraries/query-string/test.js +++ b/src/libraries/query-string/test.js @@ -80,4 +80,4 @@ describe(".parse()", function() { qs.extract(void 0) }, TypeError) }) -}); \ No newline at end of file +}); diff --git a/src/library.html b/src/library.html index 7e313c170..398613f9e 100644 --- a/src/library.html +++ b/src/library.html @@ -12,4 +12,4 @@
-
\ No newline at end of file +
diff --git a/src/livetvsettings.html b/src/livetvsettings.html index d853063ab..1b1557889 100644 --- a/src/livetvsettings.html +++ b/src/livetvsettings.html @@ -99,4 +99,4 @@
-
\ No newline at end of file +
diff --git a/src/log.html b/src/log.html index dd98b0d33..5943f5dc0 100644 --- a/src/log.html +++ b/src/log.html @@ -5,4 +5,4 @@
-
\ No newline at end of file +
diff --git a/src/metadataimages.html b/src/metadataimages.html index 825057201..8ad129256 100644 --- a/src/metadataimages.html +++ b/src/metadataimages.html @@ -22,4 +22,4 @@
-
\ No newline at end of file +
diff --git a/src/metadatanfo.html b/src/metadatanfo.html index 7263952b4..4005c74f6 100644 --- a/src/metadatanfo.html +++ b/src/metadatanfo.html @@ -46,4 +46,4 @@
-
\ No newline at end of file +
diff --git a/src/mypreferencesdisplay.html b/src/mypreferencesdisplay.html index 799681f06..bee49754a 100644 --- a/src/mypreferencesdisplay.html +++ b/src/mypreferencesdisplay.html @@ -1,4 +1,4 @@
-
\ No newline at end of file +
diff --git a/src/mypreferenceshome.html b/src/mypreferenceshome.html index f45a6478b..79c5ccc4b 100644 --- a/src/mypreferenceshome.html +++ b/src/mypreferenceshome.html @@ -1,4 +1,4 @@
-
\ No newline at end of file +
diff --git a/src/mypreferencesmenu.html b/src/mypreferencesmenu.html index f7948a078..41fcd1b75 100644 --- a/src/mypreferencesmenu.html +++ b/src/mypreferencesmenu.html @@ -32,7 +32,7 @@ \ No newline at end of file +
diff --git a/src/nowplaying.html b/src/nowplaying.html index 690aa2f5f..59b6a4b78 100644 --- a/src/nowplaying.html +++ b/src/nowplaying.html @@ -12,7 +12,7 @@
-
+
@@ -63,7 +63,7 @@
@@ -87,10 +87,10 @@

diff --git a/src/playbackconfiguration.html b/src/playbackconfiguration.html index 81a42231e..9deeeebbc 100644 --- a/src/playbackconfiguration.html +++ b/src/playbackconfiguration.html @@ -27,4 +27,4 @@
-
\ No newline at end of file +
diff --git a/src/robots.txt b/src/robots.txt index 77470cb39..1f53798bb 100644 --- a/src/robots.txt +++ b/src/robots.txt @@ -1,2 +1,2 @@ User-agent: * -Disallow: / \ No newline at end of file +Disallow: / diff --git a/src/scripts/apploader.js b/src/scripts/apploader.js index 4b5d2e8ee..e8a63217a 100644 --- a/src/scripts/apploader.js +++ b/src/scripts/apploader.js @@ -19,11 +19,23 @@ document.head.appendChild(script); } - injectScriptElement( - self.Promise ? "./libraries/alameda.js" : "./libraries/require.js", - function() { - // onload of require library - injectScriptElement("./scripts/site.js"); - } - ); + function loadSite() { + injectScriptElement( + "./libraries/alameda.js", + function() { + // onload of require library + injectScriptElement("./scripts/site.js"); + } + ); + } + + if (!self.Promise) { + // Load Promise polyfill if they are not natively supported + injectScriptElement( + "./libraries/npo.js", + loadSite + ); + } else { + loadSite(); + } })(); diff --git a/src/scripts/autobackdrops.js b/src/scripts/autobackdrops.js index 73042f83c..09f89fad6 100644 --- a/src/scripts/autobackdrops.js +++ b/src/scripts/autobackdrops.js @@ -10,7 +10,7 @@ define(["backdrop", "userSettings", "libraryMenu"], function (backdrop, userSett var data = cache[key]; if (data) { - console.log("Found backdrop id list in cache. Key: " + key); + console.debug("Found backdrop id list in cache. Key: " + key); data = JSON.parse(data); return Promise.resolve(data); } diff --git a/src/scripts/browser.js b/src/scripts/browser.js index 66c3051c8..791ac7411 100644 --- a/src/scripts/browser.js +++ b/src/scripts/browser.js @@ -311,4 +311,4 @@ define([], function () { browser.chromecast = browser.chrome && userAgent.toLowerCase().indexOf('crkey') !== -1; return browser; -}); \ No newline at end of file +}); diff --git a/src/scripts/browserdeviceprofile.js b/src/scripts/browserdeviceprofile.js index 9d91a691d..b45bdc59b 100644 --- a/src/scripts/browserdeviceprofile.js +++ b/src/scripts/browserdeviceprofile.js @@ -92,7 +92,7 @@ define(['browser'], function (browser) { return true; } - if (!!videoTestElement.canPlayType) { + if (videoTestElement.canPlayType) { return videoTestElement.canPlayType('application/x-mpegurl; codecs="avc1.42E01E, ac-3"').replace(/no/, '') || videoTestElement.canPlayType('application/vnd.apple.mpegURL; codecs="avc1.42E01E, ac-3"').replace(/no/, ''); } @@ -302,9 +302,9 @@ define(['browser'], function (browser) { try { var isTizenUhd = webapis.productinfo.isUdPanelSupported(); isTizenFhd = !isTizenUhd; - console.log("isTizenFhd = " + isTizenFhd); + console.debug("isTizenFhd = " + isTizenFhd); } catch (error) { - console.log("isUdPanelSupported() error code = " + error.code); + console.error("isUdPanelSupported() error code = " + error.code); } } @@ -761,7 +761,7 @@ define(['browser'], function (browser) { videoTestElement.canPlayType('video/mp4; codecs="avc1.6e0033"').replace(/no/, '')) { // These tests are passing in safari, but playback is failing - if (!browser.safari && !browser.iOS && !browser.web0s && !browser.edge) { + if (!browser.safari && !browser.iOS && !browser.web0s && !browser.edge && !browser.mobile) { h264Profiles += '|high 10'; } } diff --git a/src/scripts/datetime.js b/src/scripts/datetime.js index a7ee1d946..8a7666844 100644 --- a/src/scripts/datetime.js +++ b/src/scripts/datetime.js @@ -279,4 +279,4 @@ define(['globalize'], function (globalize) { return toLocaleTimeStringSupportsLocales; } }; -}); \ No newline at end of file +}); diff --git a/src/scripts/editorsidebar.js b/src/scripts/editorsidebar.js index 1a9b9775e..b7cb4b5c5 100644 --- a/src/scripts/editorsidebar.js +++ b/src/scripts/editorsidebar.js @@ -49,7 +49,7 @@ define(["datetime", "jQuery", "material-icons"], function (datetime, $) { } else if (item.MediaType === "Audio") { htmlName += 'audiotrack'; } else if (item.Type === "TvChannel") { - htmlName += 'live_tv'; + htmlName += ''; } else if (item.MediaType === "Photo") { htmlName += 'photo'; } else if (item.MediaType === "Book") { diff --git a/src/scripts/globalize.js b/src/scripts/globalize.js index aa3a2ef0f..69bb3aee2 100644 --- a/src/scripts/globalize.js +++ b/src/scripts/globalize.js @@ -38,7 +38,7 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana try { culture = userSettings.language(); } catch (err) { - console.log('no language set in user settings'); + console.error('no language set in user settings'); } culture = culture || getDefaultLanguage(); @@ -48,7 +48,7 @@ define(['connectionManager', 'userSettings', 'events'], function (connectionMana try { dateTimeCulture = userSettings.dateTimeLocale(); } catch (err) { - console.log('no date format set in user settings'); + console.error('no date format set in user settings'); } if (dateTimeCulture) { diff --git a/src/scripts/librarybrowser.js b/src/scripts/librarybrowser.js index 4aab16b2e..bd8980aed 100644 --- a/src/scripts/librarybrowser.js +++ b/src/scripts/librarybrowser.js @@ -92,7 +92,7 @@ define(["userSettings"], function (userSettings) { if (showControls) { html += ''; - html += ''; + html += ''; } if (options.addLayoutButton) { diff --git a/src/scripts/librarymenu.js b/src/scripts/librarymenu.js index 0abcf697b..001c75787 100644 --- a/src/scripts/librarymenu.js +++ b/src/scripts/librarymenu.js @@ -12,6 +12,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " html += "
"; html += '
'; html += ''; + html += ''; html += ''; html += ''; html += ''; @@ -27,6 +28,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " headerHomeButton = skinHeader.querySelector(".headerHomeButton"); headerUserButton = skinHeader.querySelector(".headerUserButton"); headerCastButton = skinHeader.querySelector(".headerCastButton"); + headerAudioPlayerButton = skinHeader.querySelector(".headerAudioPlayerButton"); headerSearchButton = skinHeader.querySelector(".headerSearchButton"); lazyLoadViewMenuBarImages(); @@ -116,6 +118,10 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " Dashboard.navigate("home.html"); } + function showAudioPlayer() { + return appRouter.showNowPlaying(); + } + function bindMenuEvents() { mainDrawerButton = document.querySelector(".mainDrawerButton"); @@ -140,9 +146,27 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " headerCastButton.addEventListener("click", onCastButtonClicked); } + headerAudioPlayerButton.addEventListener("click", showAudioPlayer); + if (layoutManager.mobile) { initHeadRoom(skinHeader); } + events.on(playbackManager, 'playbackstart', onPlaybackStart); + events.on(playbackManager, 'playbackstop', onPlaybackStop); + } + + function onPlaybackStart(e) { + if (playbackManager.isPlayingAudio() && layoutManager.tv) { + headerAudioPlayerButton.classList.remove("hide"); + } else { + headerAudioPlayerButton.classList.add("hide"); + } + } + + function onPlaybackStop(e, stopInfo) { + if (stopInfo.nextMediaType != 'Audio') { + headerAudioPlayerButton.classList.add("hide"); + } } function onCastButtonClicked() { @@ -205,7 +229,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " html += globalize.translate("HeaderAdmin"); html += ""; html += 'dashboard' + globalize.translate("TabDashboard") + ""; - html += 'mode_edit' + globalize.translate("Metadata") + ""; + html += '' + globalize.translate("Metadata") + ""; html += "
"; } @@ -219,7 +243,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " html += 'wifi' + globalize.translate("ButtonSelectServer") + ""; } - html += 'exit_to_app' + globalize.translate("ButtonSignOut") + ""; + html += '' + globalize.translate("ButtonSignOut") + ""; html += "
"; } @@ -763,6 +787,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", " var currentUser; var headerCastButton; var headerSearchButton; + var headerAudioPlayerButton; var enableLibraryNavDrawer = !layoutManager.tv; var skinHeader = document.querySelector(".skinHeader"); var requiresUserRefresh = true; diff --git a/src/scripts/livetvcomponents.js b/src/scripts/livetvcomponents.js index 4215de4cb..61ffc66fb 100644 --- a/src/scripts/livetvcomponents.js +++ b/src/scripts/livetvcomponents.js @@ -34,7 +34,7 @@ define(["layoutManager", "datetime", "cardBuilder", "apphost"], function (layout day: "numeric" }); } catch (err) { - console.log("Error parsing premiereDate:" + item.StartDate + "; error: " + err); + console.error("error parsing premiereDate:" + item.StartDate + "; error: " + err); } } diff --git a/src/scripts/routes.js b/src/scripts/routes.js index b726aaf87..9c3db58a7 100644 --- a/src/scripts/routes.js +++ b/src/scripts/routes.js @@ -16,12 +16,12 @@ define([ function defineRoute(newRoute) { var path = newRoute.path; - console.log("defining route: " + path); + console.debug("defining route: " + path); newRoute.dictionary = "core"; Emby.Page.addRoute(path, newRoute); } - console.log("defining core routes"); + console.debug("defining core routes"); defineRoute({ path: "/addplugin.html", diff --git a/src/scripts/site.js b/src/scripts/site.js index 0cf65158d..fc18ae950 100644 --- a/src/scripts/site.js +++ b/src/scripts/site.js @@ -286,10 +286,10 @@ var AppInfo = {}; bindConnectionManagerEvents(connectionManager, events, userSettings); if (!AppInfo.isNativeApp) { - console.log("loading ApiClient singleton"); + console.debug("loading ApiClient singleton"); return require(["apiclient"], function (apiClientFactory) { - console.log("creating ApiClient singleton"); + console.debug("creating ApiClient singleton"); var apiClient = new apiClientFactory(Dashboard.serverAddress(), apphost.appName(), apphost.appVersion(), apphost.deviceName(), apphost.deviceId(), window.devicePixelRatio); @@ -301,7 +301,7 @@ var AppInfo = {}; window.ApiClient = apiClient; localApiClient = apiClient; - console.log("loaded ApiClient singleton"); + console.debug("loaded ApiClient singleton"); }); } @@ -335,7 +335,7 @@ var AppInfo = {}; try { playbackManager.onAppClose(); } catch (err) { - console.log("error in onAppClose: " + err); + console.error("error in onAppClose: " + err); } }); return playbackManager; @@ -393,7 +393,7 @@ var AppInfo = {}; } function onRequireJsError(requireType, requireModules) { - console.log("RequireJS error: " + (requireType || "unknown") + ". Failed modules: " + (requireModules || []).join(",")); + console.error("RequireJS error: " + (requireType || "unknown") + ". Failed modules: " + (requireModules || []).join(",")); } function defineResizeObserver() { @@ -481,7 +481,7 @@ var AppInfo = {}; Promise.all(promises).then(function () { createConnectionManager().then(function () { - console.log("initAfterDependencies promises resolved"); + console.debug("initAfterDependencies promises resolved"); require(["globalize", "browser"], function (globalize, browser) { window.Globalize = globalize; @@ -492,6 +492,7 @@ var AppInfo = {}; require(["keyboardnavigation"], function(keyboardnavigation) { keyboardnavigation.enable(); }); + require(["mouseManager"]); require(["focusPreventScroll"]); require(["autoFocuser"], function(autoFocuser) { autoFocuser.enable(); @@ -525,10 +526,10 @@ var AppInfo = {}; document.title = Globalize.translateDocument(document.title, "core"); if (browser.tv && !browser.android) { - console.log("Using system fonts with explicit sizes"); + console.debug("using system fonts with explicit sizes"); require(["systemFontsSizedCss"]); } else { - console.log("Using default fonts"); + console.debug("using default fonts"); require(["systemFontsCss"]); } @@ -540,7 +541,7 @@ var AppInfo = {}; } function loadPlugins(appHost, browser, shell) { - console.log("Loading installed plugins"); + console.debug("loading installed plugins"); var list = [ "components/playback/playaccessvalidation", "components/playback/experimentalwarnings", @@ -582,13 +583,13 @@ var AppInfo = {}; } function onAppReady(browser) { - console.log("Begin onAppReady"); + console.debug("begin onAppReady"); // ensure that appHost is loaded in this point require(['apphost', 'appRouter'], function (appHost, appRouter) { window.Emby = {}; - console.log("onAppReady - loading dependencies"); + console.debug("onAppReady: loading dependencies"); if (browser.iOS) { require(['css!assets/css/ios.css']); } @@ -659,7 +660,7 @@ var AppInfo = {}; try { navigator.serviceWorker.register("serviceworker.js"); } catch (err) { - console.log("Error registering serviceWorker: " + err); + console.error("error registering serviceWorker: " + err); } } } @@ -671,11 +672,7 @@ var AppInfo = {}; AppInfo.isNativeApp = true; } - if (!window.Promise || browser.web0s) { - require(["native-promise-only"], init); - } else { - init(); - } + init(); } var localApiClient; @@ -908,9 +905,10 @@ var AppInfo = {}; define("htmlMediaHelper", [componentsPath + "/htmlMediaHelper"], returnFirstDependency); define("viewContainer", [componentsPath + "/viewContainer"], returnFirstDependency); define("dialogHelper", [componentsPath + "/dialogHelper/dialogHelper"], returnFirstDependency); - define("serverNotifications", [componentsPath + "/serverNotifications/serverNotifications"], returnFirstDependency); + define("serverNotifications", [componentsPath + "/serverNotifications"], returnFirstDependency); define("skinManager", [componentsPath + "/skinManager"], returnFirstDependency); - define("keyboardnavigation", [componentsPath + "/keyboardnavigation"], returnFirstDependency); + define("keyboardnavigation", [componentsPath + "/input/keyboardnavigation"], returnFirstDependency); + define("mouseManager", [componentsPath + "/input/mouseManager"], returnFirstDependency); define("scrollManager", [componentsPath + "/scrollManager"], returnFirstDependency); define("autoFocuser", [componentsPath + "/autoFocuser"], returnFirstDependency); define("connectionManager", [], function () { @@ -989,10 +987,6 @@ var AppInfo = {}; Dashboard.navigate("mypreferencesmenu.html"); }; - appRouter.showNowPlaying = function () { - Dashboard.navigate("nowplaying.html"); - }; - appRouter.setTitle = function (title) { LibraryMenu.setTitle(title); }; diff --git a/src/scripts/userpassword.js b/src/scripts/userpassword.js deleted file mode 100644 index 52e06e6ce..000000000 --- a/src/scripts/userpassword.js +++ /dev/null @@ -1,30 +0,0 @@ -define(["jQuery", "loading", "libraryMenu"], function ($, loading, libraryMenu) { - "use strict"; - - function loadUser(page, user) { - libraryMenu.setTitle(user.Name); - - if ("Guest" == user.ConnectLinkType) { - $(".connectMessage", page).show(); - } else { - $(".connectMessage", page).hide(); - } - - loading.hide(); - } - - function loadData(page) { - loading.show(); - var userId = getParameterByName("userId"); - ApiClient.getUser(userId).then(function (user) { - loadUser(page, user); - }); - } - - $(document).on("pageinit", "#userPasswordPage", function () { - $(".adminUpdatePasswordForm").off("submit", UpdatePasswordPage.onSubmit).on("submit", UpdatePasswordPage.onSubmit); - $(".adminLocalAccessForm").off("submit", UpdatePasswordPage.onLocalAccessSubmit).on("submit", UpdatePasswordPage.onLocalAccessSubmit); - }).on("pagebeforeshow", "#userPasswordPage", function () { - loadData(this); - }); -}); diff --git a/src/selectserver.html b/src/selectserver.html index dd52467bf..2c8452517 100644 --- a/src/selectserver.html +++ b/src/selectserver.html @@ -3,7 +3,7 @@

${HeaderSelectServer}

-
+
diff --git a/src/serviceworker.js b/src/serviceworker.js index 4d9e12ee6..c43d1f4b4 100644 --- a/src/serviceworker.js +++ b/src/serviceworker.js @@ -1 +1,2 @@ -importScripts("components/serviceworker/notifications.js"); \ No newline at end of file +/* eslint-env serviceworker */ +importScripts("components/serviceworker/notifications.js"); diff --git a/src/strings/cs.json b/src/strings/cs.json index 346215407..23f4d624e 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -554,7 +554,7 @@ "LabelH264Crf": "H264 kĂłdovĂĄnĂ­ CRF:", "LabelEncoderPreset": "PƙednastavenĂ­ H264 kĂłdovĂĄnĂ­:", "LabelHardwareAccelerationType": "HardwarovĂĄ akcelerace:", - "LabelHardwareAccelerationTypeHelp": "Toto je experimentĂĄlnĂ­ funkce dostupnĂĄ pouze v podporovanĂœch systĂ©mech.", + "LabelHardwareAccelerationTypeHelp": "HardwarovĂĄ akcelerace vyĆŸaduje dalĆĄĂ­ konfiguraci.", "LabelHomeScreenSectionValue": "Sekce domovskĂ© obrazovky {0}:", "LabelHttpsPort": "LokĂĄlnĂ­ HTTPS port:", "LabelHttpsPortHelp": "Číslo portu TCP, ke kterĂ©mu by se měl pƙipojit HTTPS server Jellyfin.", @@ -1567,5 +1567,8 @@ "EnableFastImageFadeIn": "RychlĂ© zmizenĂ­ obrazu", "LabelPlayerDimensions": "ZobrazenĂ© rozliĆĄenĂ­:", "LabelDroppedFrames": "VynechanĂ© snĂ­mky:", - "LabelCorruptedFrames": "PoĆĄkozenĂ© snĂ­mky:" + "LabelCorruptedFrames": "PoĆĄkozenĂ© snĂ­mky:", + "OptionForceRemoteSourceTranscoding": "Vynutit transkĂłdovĂĄnĂ­ vzdĂĄlenĂœch zdrojĆŻ mĂ©diĂ­ (jako napƙ. ĆŸivĂĄ TV)", + "NoCreatedLibraries": "ZdĂĄ se, ĆŸe jste dosud nevytvoƙili ĆŸĂĄdnou knihovnu. {0}Chtěli byste nějakou vytvoƙit nynĂ­?{1}", + "AskAdminToCreateLibrary": "PoĆŸĂĄdejte administrĂĄtora o vytvoƙenĂ­ knihovny." } diff --git a/src/strings/de.json b/src/strings/de.json index ac5b84ae7..1c5b4243b 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -260,7 +260,7 @@ "EncoderPresetHelp": "WĂ€hle einen schnelleren Wert um die Performance zu verbessern oder einen langsameren Wert um die QualitĂ€t zu verbessern.", "HDPrograms": "HD Programme", "HandledByProxy": "Verwaltet vom Reverse Proxy", - "HardwareAccelerationWarning": "Das Aktivieren der Hardwarebeschleunigung kann auf einigen Systemen zu InstabilitĂ€t fĂŒhren. Stellen Sie sicher, dass Ihr Betriebssystem sowie Ihre Grafikkarten-Treiber auf dem aktuellsten Stand sind. Wenn Sie nach der Aktivierung Probleme mit der Wiedergabe von Videos haben, mĂŒssen Sie diese Einstellung zurĂŒck auf \"Auto\" stellen.", + "HardwareAccelerationWarning": "Das Aktivieren der Hardwarebeschleunigung kann auf einigen Systemen zu InstabilitĂ€t fĂŒhren. Stellen Sie sicher, dass Ihr Betriebssystem sowie Ihre Grafikkarten-Treiber auf dem aktuellsten Stand sind. Wenn Sie nach der Aktivierung Probleme mit der Wiedergabe von Videos haben, mĂŒssen Sie diese Einstellung zurĂŒck auf \"Keine\" stellen.", "HeaderAccessSchedule": "Zugangsplan", "HeaderAccessScheduleHelp": "Erstelle einen Zugangsplan, um den Zugriff auf bestimmte Zeiten zu limitieren.", "HeaderActiveDevices": "Aktive GerĂ€te", @@ -593,7 +593,7 @@ "LabelGroupMoviesIntoCollectionsHelp": "Wenn Filmlisten angezeigt werden, dann werden Filme, die zu einer Collection gehören, als ein gruppiertes Element angezeigt.", "LabelEncoderPreset": "H264 Encoding Voreinstellung:", "LabelHardwareAccelerationType": "Hardware Beschleunigung:", - "LabelHardwareAccelerationTypeHelp": "Dies ist eine experimentelle Funktion und nur auf unterstĂŒtzten Systemen verfĂŒgbar.", + "LabelHardwareAccelerationTypeHelp": "Hardwarebeschleunigung benötigt zusĂ€tzliche Konfiguration.", "LabelHomeNetworkQuality": "HeimnetzwerkqualitĂ€t:", "LabelHomeScreenSectionValue": "Startseitenbereich {0}:", "LabelHttpsPort": "Lokale HTTPS-Portnummer:", @@ -1486,5 +1486,7 @@ "LabelPlayerDimensions": "Playerabmessungen:", "LabelDroppedFrames": "Verlorene Frames:", "LabelCorruptedFrames": "Fehlerhafte Frames:", - "OptionForceRemoteSourceTranscoding": "Transkodieren von externen Medienquellen erzwingen (z.B. LiveTV)" + "OptionForceRemoteSourceTranscoding": "Transkodieren von externen Medienquellen erzwingen (z.B. LiveTV)", + "AskAdminToCreateLibrary": "Bitten Sie einen Administrator, eine Bibliothek zu erstellen.", + "NoCreatedLibraries": "Sieht so aus als hĂ€ttest du bis jetzt keine Bibliothek erstellt. {0}Möchtest du jetzt eine Bibliothek erstellen?{1}" } diff --git a/src/strings/en-us.json b/src/strings/en-us.json index d7e404eba..72894707d 100644 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -24,6 +24,8 @@ "AllowMediaConversionHelp": "Grant or deny access to the convert media feature.", "AllowOnTheFlySubtitleExtraction": "Allow subtitle extraction on the fly", "AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.", + "AllowFfmpegThrottling": "Throttle Transcodes", + "AllowFfmpegThrottlingHelp": "When a transcode or remux gets far enough ahead from the current playback position, pause the process so it will consume less resources. This is most useful when watching without seeking often. Turn this off if you experience playback issues.", "AllowRemoteAccess": "Allow remote connections to this Jellyfin Server.", "AllowRemoteAccessHelp": "If unchecked, all remote connections will be blocked.", "AllowedRemoteAddressesHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be allowed to connect remotely. If left blank, all remote addresses will be allowed.", @@ -282,7 +284,7 @@ "EncoderPresetHelp": "Choose a faster value to improve performance, or a slower value to improve quality.", "HDPrograms": "HD programs", "HandledByProxy": "Handled by reverse proxy", - "HardwareAccelerationWarning": "Enabling hardware acceleration may cause instability in some environments. Ensure that your operating system and video drivers are fully up to date. If you have difficulty playing video after enabling this, you'll need to change the setting back to Auto.", + "HardwareAccelerationWarning": "Enabling hardware acceleration may cause instability in some environments. Ensure that your operating system and video drivers are fully up to date. If you have difficulty playing video after enabling this, you'll need to change the setting back to None.", "HeaderAccessSchedule": "Access Schedule", "HeaderAccessScheduleHelp": "Create an access schedule to limit access to certain hours.", "HeaderActiveDevices": "Active Devices", diff --git a/src/strings/es_DO.json b/src/strings/es_DO.json index 70f9f52d4..7c42778a1 100644 --- a/src/strings/es_DO.json +++ b/src/strings/es_DO.json @@ -2,5 +2,15 @@ "Add": "Añadir", "Actor": "Actor", "AccessRestrictedTryAgainLater": "El acceso estĂĄ restringido actualmente. IntĂ©ntelo de nuevo mĂĄs tarde.", - "Absolute": "Absoluto" + "Absolute": "Absoluto", + "HeaderAlbumArtists": "Artistas del Álbum", + "HeaderContinueWatching": "Continuar Viendo", + "Genres": "GĂ©neros", + "Folders": "Carpetas", + "Favorites": "Favoritos", + "Collections": "Colecciones", + "Books": "Libros", + "Albums": "Álbumes", + "Artists": "Artistas", + "Channels": "Canales" } diff --git a/src/strings/he.json b/src/strings/he.json index e94a916b0..d2e726317 100644 --- a/src/strings/he.json +++ b/src/strings/he.json @@ -66,7 +66,7 @@ "Edit": "ŚąŚšŚ•Śš", "EditImages": "ŚąŚšŚ•Śš ŚȘŚžŚ•Ś Ś•ŚȘ", "EditSubtitles": "ŚąŚšŚ•Śš Ś›ŚȘڕڑڙڕŚȘ", - "EnableColorCodedBackgrounds": "ŚŚ€Ś©Śš ŚšŚ§Śą Ś‘ŚŠŚ‘Śą ŚžŚ§Ś•Ś“Ś“", + "EnableColorCodedBackgrounds": "ŚšŚ§Śą Ś‘ŚŠŚ‘Śą ŚžŚ§Ś•Ś“Ś“", "Ended": "Ś”ŚĄŚȘŚ™Ś™Ś", "EndsAtValue": "ŚžŚĄŚȘŚ™Ś™Ś Ś‘ {0}", "Favorite": "ŚžŚ•ŚąŚ“ŚŁ", @@ -550,5 +550,47 @@ "AllowOnTheFlySubtitleExtraction": "ŚŚ€Ś©Śš Ś—Ś™ŚœŚ•Ś„ Ś›ŚȘڕڑڙڕŚȘ Ś‘Ś–ŚžŚŸ ŚŚžŚȘ", "AllowHWTranscodingHelp": "ŚŚ€Ś©Śš ŚœŚžŚœŚ§Ś˜ ŚœŚ§Ś•Ś“Ś“ Ś”Ś–ŚšŚžŚ•ŚȘ Ś‘Ś–ŚžŚŸ ŚŚžŚȘ. Ś–Ś” ŚąŚ©Ś•Ś™ ŚœŚąŚ–Ś•Śš ڑڔڀڗŚȘŚȘ ڔڧڙړڕړ Ś©Ś ŚąŚ©Ś” Śą\"Ś™ Ś”Ś©ŚšŚȘ.", "AllComplexFormats": "Ś›Śœ Ś”Ś€Ś•ŚšŚžŚ˜Ś™Ś Ś”ŚžŚ•ŚšŚ›Ś‘Ś™Ś (ASS, SSA, VOBSUB, PGS, SUB\\IDX Ś•Ś›Ś“Ś•ŚžŚ”)", - "AddItemToCollectionHelp": "Ś”Ś•ŚĄŚŁ Ś€ŚšŚ™Ś˜Ś™Ś ŚœŚŚ•ŚĄŚ€Ś™Ś Śą\"Ś™ Ś—Ś™Ś€Ś•Ś©Ś Ś•Ś©Ś™ŚžŚ•Ś© Ś‘ŚœŚ—ŚŠŚŸ Ś™ŚžŚ Ś™ ڐڕ ڔڧکڔ ŚąŚœ Ś”ŚȘŚ€ŚšŚ™Ś˜ ڛړڙ ŚœŚ”Ś•ŚĄŚ™ŚŁ ڐڕŚȘŚ ŚœŚŚ•ŚĄŚŁ." + "AddItemToCollectionHelp": "Ś”Ś•ŚĄŚŁ Ś€ŚšŚ™Ś˜Ś™Ś ŚœŚŚ•ŚĄŚ€Ś™Ś Śą\"Ś™ Ś—Ś™Ś€Ś•Ś©Ś Ś•Ś©Ś™ŚžŚ•Ś© Ś‘ŚœŚ—ŚŠŚŸ Ś™ŚžŚ Ś™ ڐڕ ڔڧکڔ ŚąŚœ Ś”ŚȘŚ€ŚšŚ™Ś˜ ڛړڙ ŚœŚ”Ś•ŚĄŚ™ŚŁ ڐڕŚȘŚ ŚœŚŚ•ŚĄŚŁ.", + "Songs": "Ś©Ś™ŚšŚ™Ś", + "Shows": "ŚĄŚ“ŚšŚ•ŚȘ", + "DownloadsValue": "{0} Ś”Ś•ŚšŚ“Ś•ŚȘ", + "DisplayMissingEpisodesWithinSeasons": "Ś”ŚŠŚ’ Ś€ŚšŚ§Ś™Ś Ś—ŚĄŚšŚ™Ś Ś‘ŚȘŚ•Śš Ś”ŚąŚ•Ś Ś•ŚȘ", + "DisplayInMyMedia": "Ś”ŚŠŚ’ Ś‘ŚąŚžŚ•Ś“ ڔڑڙŚȘ", + "Disconnect": "Ś”ŚȘŚ ŚȘڧ", + "DirectorsValue": "Ś‘ŚžŚŚ™Ś: {0}", + "DirectorValue": "Ś‘ŚžŚŚ™: {0}", + "Descending": "ŚĄŚ“Śš Ś™Ś•ŚšŚ“", + "Default": "Ś‘ŚšŚ™ŚšŚȘ ŚžŚ—Ś“Śœ", + "DeathDateValue": "Ś Ś€Ś˜Śš: {0}", + "DatePlayed": "ŚȘŚŚšŚ™Śš Ś Ś™Ś’Ś•ŚŸ", + "DateAdded": "ŚȘŚŚšŚ™Śš Ś”Ś•ŚĄŚ€Ś”", + "CriticRating": "Ś“Ś™ŚšŚ•Ś’ ŚžŚ‘Ś§ŚšŚ™Ś", + "ContinueWatching": "Ś”ŚžŚ©Śš ŚœŚŠŚ€Ś•ŚȘ", + "ButtonUninstall": "Ś”ŚĄŚš Ś”ŚȘڧڠڔ", + "ButtonTrailer": "Ś§Ś“Ś™ŚžŚ•ŚŸ", + "ButtonSubtitles": "Ś›ŚȘڕڑڙڕŚȘ", + "ButtonSplit": "Ś€Ś™ŚŠŚ•Śœ", + "ButtonStop": "ŚąŚŠŚ•Śš", + "ButtonSettings": "Ś”Ś’Ś“ŚšŚ•ŚȘ", + "ButtonSend": "Ś©ŚœŚ—", + "ButtonSelectView": "Ś‘Ś—Śš ŚȘŚŠŚ•Ś’Ś”", + "ButtonSelectServer": "Ś‘Ś—Śš Ś©ŚšŚȘ", + "ButtonRename": "کڠڔ Ś©Ś", + "ButtonPause": "ڔکڔڔ", + "ButtonParentalControl": "Ś‘Ś§ŚšŚȘ Ś”Ś•ŚšŚ™Ś", + "ButtonNetwork": "ŚšŚ©ŚȘ", + "ButtonMore": "ŚąŚ•Ś“", + "ButtonLearnMore": "ŚœŚžŚ“ ŚąŚ•Ś“", + "ButtonInfo": "ŚžŚ™Ś“Śą", + "ButtonHome": "ڑڙŚȘ", + "ButtonHelp": "ŚąŚ–ŚšŚ”", + "ButtonFullscreen": "ŚžŚĄŚš ŚžŚœŚ", + "ButtonEditImages": "ŚąŚšŚ•Śš ŚȘŚžŚ•Ś Ś•ŚȘ", + "ButtonConnect": "Ś”ŚȘŚ—Ś‘Śš", + "ButtonAddServer": "Ś”Ś•ŚĄŚŁ Ś©ŚšŚȘ", + "ButtonAddMediaLibrary": "Ś”Ś•ŚĄŚŁ ŚĄŚ€ŚšŚ™Ś™ŚȘ ŚžŚ“Ś™Ś”", + "ButtonAddImage": "Ś”Ś•ŚĄŚŁ ŚȘŚžŚ•Ś Ś”", + "AskAdminToCreateLibrary": "ڑڧک ŚžŚžŚ Ś”Śœ ŚœŚ™ŚŠŚ•Śš ŚĄŚ€ŚšŚ™Ś™Ś”.", + "Ascending": "ŚĄŚ“Śš ŚąŚ•ŚœŚ”", + "Photos": "ŚȘŚžŚ•Ś Ś•ŚȘ" } diff --git a/src/strings/hu.json b/src/strings/hu.json index 541323e90..f7a170081 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -267,7 +267,7 @@ "LabelGroupMoviesIntoCollections": "Filmek csoportosĂ­tĂĄsa gyƱjtemĂ©nyekbe", "LabelEncoderPreset": "H264 enkĂłder beĂĄllĂ­tĂĄsok:", "LabelHardwareAccelerationType": "Hardveres gyorsĂ­tĂĄs:", - "LabelHardwareAccelerationTypeHelp": "Ez egy kĂ­sĂ©rleti szolgĂĄltatĂĄs, amely csak a tĂĄmogatott rendszereken Ă©rhetƑ el.", + "LabelHardwareAccelerationTypeHelp": "A hardveres gyorsĂ­tĂĄs tovĂĄbbi konfigurĂĄlĂĄst igĂ©nyel.", "LabelHomeScreenSectionValue": "{0}. kezdƑkĂ©pernyƑ blokk:", "LabelImageType": "KĂ©p tĂ­pusa:", "LabelKodiMetadataDateFormat": "MegjelenĂ©si dĂĄtum formĂĄtuma:", @@ -602,7 +602,7 @@ "Backdrops": "HĂĄttĂ©r", "Banner": "Banner", "BirthLocation": "SzĂŒletĂ©si hely", - "Box": "Box", + "Box": "Doboz", "AlwaysPlaySubtitlesHelp": "A nyelvi beĂĄllĂ­tĂĄsoknak megfelelƑ feliratok az audiĂł nyelvĂ©tƑl fĂŒggetlenĂŒl kerĂŒlnek betöltĂ©sre.", "Artists": "ElƑadĂłk", "Blacklist": "Feketelista", @@ -659,7 +659,7 @@ "DirectPlaying": "Közvetlen lejĂĄtszĂĄs", "DirectStreamHelp1": "Az adathordozĂł kompatibilis a kĂ©szĂŒlĂ©kkel a felbontĂĄs Ă©s a mĂ©diatĂ­pus (H.264, AC3, stb.) tekintetĂ©ben, de nem kompatibilis a fĂĄjltĂĄrolĂłban (.mkv, .avi, .wmv, stb.). A videĂłfelvĂ©tel Ășjra csomagolĂĄsra kerĂŒl, mielƑtt azt a kĂ©szĂŒlĂ©kre tovĂĄbbĂ­tanĂĄ.", "DirectStreamHelp2": "A fĂĄjl közvetlen közvetĂ­tĂ©se (Direct Streaming) nagyon kevĂ©s feldolgozĂĄsi erƑforrĂĄst hasznĂĄl, ennek ellenĂ©re a videĂł nem veszĂ­t a minƑsĂ©gĂ©bƑl.", - "DirectStreaming": "Direct streaming", + "DirectStreaming": "Közvetlen streaming", "Disabled": "Tiltva", "Disc": "Lemez", "Disconnect": "SzĂ©tkapcsol", @@ -702,7 +702,7 @@ "EncoderPresetHelp": "VĂĄlassz egy gyorsabb Ă©rtĂ©ket a teljesĂ­tmĂ©ny javĂ­tĂĄsa Ă©rdekĂ©ben, vagy egy lassabb Ă©rtĂ©ket a minƑsĂ©g javĂ­tĂĄsa Ă©rdekĂ©ben.", "HDPrograms": "HD programok", "HandledByProxy": "Reverse proxy segĂ­tsĂ©gĂ©vel kezelhetƑ", - "HardwareAccelerationWarning": "A hardveres gyorsĂ­tĂĄs engedĂ©lyezĂ©se bizonyos környezetekben instabilitĂĄst okozhat. GyƑzƑdj meg rĂłla, hogy az operĂĄciĂłs rendszer Ă©s a videĂł-illesztƑprogramok teljesen naprakĂ©szek. Ha a beĂĄllĂ­tĂĄs utĂĄn problĂ©mĂĄba ĂŒtközik a videĂłlejĂĄtszĂĄs, akkor vissza kell ĂĄllĂ­tani a beĂĄllĂ­tĂĄst Auto-ra.", + "HardwareAccelerationWarning": "A hardveres gyorsĂ­tĂĄs engedĂ©lyezĂ©se bizonyos környezetekben instabilitĂĄst okozhat. GyƑzƑdj meg rĂłla, hogy az operĂĄciĂłs rendszer Ă©s a videĂł-illesztƑprogramok teljesen naprakĂ©szek. Ha a beĂĄllĂ­tĂĄs utĂĄn problĂ©mĂĄba ĂŒtközik a videĂłlejĂĄtszĂĄs, akkor vissza kell ĂĄllĂ­tani a beĂĄllĂ­tĂĄst Nincs-re.", "HeaderAccessSchedule": "HozzĂĄfĂ©rĂ©si ÜtemezĂ©s", "HeaderAccessScheduleHelp": "Hozz lĂ©tre hozzĂĄfĂ©rĂ©si ĂŒtemezĂ©st, hogy korlĂĄtozd a hozzĂĄfĂ©rĂ©st bizonyos idƑben.", "HeaderActiveRecordings": "AktĂ­v FelvĂ©telek", @@ -748,7 +748,7 @@ "HeaderIdentificationCriteriaHelp": "Adj meg legalĂĄbb egy azonosĂ­tĂĄsi kritĂ©riumot.", "HeaderIdentificationHeader": "AzonosĂ­tĂł fejlĂ©c", "HeaderImageOptions": "KĂ©pbeĂĄllĂ­tĂĄsok", - "HeaderInstantMix": "Instant Mix", + "HeaderInstantMix": "Azonnali keverĂ©s", "HeaderItems": "Elemek", "HeaderKeepRecording": "FelvĂ©tel kĂ©szĂ­tĂ©se", "HeaderKodiMetadataHelp": "Az Nfo metaadatok engedĂ©lyezĂ©sĂ©hez vagy letiltĂĄsĂĄhoz szerkeszd a könyvtĂĄrat a Jellyfin MĂ©diatĂĄr beĂĄllĂ­tĂĄsaiban Ă©s keresd meg a metaadat letöltƑ rĂ©szt.", @@ -816,11 +816,11 @@ "HeaderXmlDocumentAttribute": "XML dokumentum attribĂștum", "HeaderXmlDocumentAttributes": "XML dokumentum attribĂștumok", "HeaderXmlSettings": "XML beĂĄllĂ­tĂĄsok", - "Hide": "Elrejt", + "Hide": "ElrejtĂ©s", "Horizontal": "VĂ­zszintes", "HttpsRequiresCert": "A biztonsĂĄgos kapcsolatok engedĂ©lyezĂ©sĂ©hez megbĂ­zhatĂł SSL-tanĂșsĂ­tvĂĄnyt kell hasznĂĄlni, mint pĂ©ldĂĄul a Let's Encrypt. KĂ©rlek add meg a tanĂșsĂ­tvĂĄnyt, vagy tiltsd le a biztonsĂĄgos kapcsolatokat.", "ImportMissingEpisodesHelp": "Ha engedĂ©lyezve van, a hiĂĄnyzĂł epizĂłdokra vonatkozĂł informĂĄciĂłk a Jellyfin adatbĂĄzisĂĄba kerĂŒlnek importĂĄlĂĄsra Ă©s megjelenĂ­tĂ©sre kerĂŒlnek az Ă©vadokban Ă©s sorozatokban. Ez jelentƑsen hosszabb könyvtĂĄrvizsgĂĄlatot okozhat.", - "InstantMix": "Instant mix", + "InstantMix": "Azonnali keverĂ©s", "ItemCount": "{0} elem", "Items": "Elemek", "Kids": "Gyerekek", @@ -1440,5 +1440,36 @@ "LabelCorruptedFrames": "SĂ©rĂŒlt kĂ©pkockĂĄk:", "HeaderKeepSeries": "Sorozat megtartĂĄsa", "ErrorGettingTvLineups": "Hiba törtĂ©nt a TV kĂ­nĂĄlat letöltĂ©se sorĂĄn. KĂ©rjĂŒk ellenƑrizd a megadott informĂĄciĂłkat Ă©s prĂłbĂĄld Ășjra.", - "LabelTranscodes": "ÁtkĂłdolĂĄsok:" + "LabelTranscodes": "ÁtkĂłdolĂĄsok:", + "AskAdminToCreateLibrary": "KĂ©rj meg egy adminisztrĂĄtort könyvtĂĄr lĂ©trehozĂĄsĂĄra.", + "LabelXDlnaDoc": "X-DLNA doc:", + "LabelXDlnaCap": "X-DLNA cap:", + "MapChannels": "CsatornĂĄk feltĂ©rkĂ©pezĂ©se", + "PasswordResetProviderHelp": "VĂĄlassz egy jelszĂł-visszaĂĄllĂ­tĂĄsi szolgĂĄltatĂłt, amelyet akkor kell hasznĂĄlni, amikor a felhasznĂĄlĂł jelszĂł-visszaĂĄllĂ­tĂĄst kĂ©r", + "OptionResElement": "res elem", + "OptionReportByteRangeSeekingWhenTranscodingHelp": "Erre olyan kĂ©szĂŒlĂ©kek esetĂ©ben van szĂŒksĂ©g, amelyek idƑigĂ©nye nem nagyon jĂł.", + "OptionPlainVideoItemsHelp": "Ha engedĂ©lyezve van, akkor az összes videĂłt a DIDL-ben \"object.item.videoItem\" -kĂ©nt ĂĄbrĂĄzolja, nem pedig egy specifikusabb tĂ­puskĂ©nt, pĂ©ldĂĄul \"object.item.videoItem.movie\" .", + "OptionPlainStorageFoldersHelp": "Ha engedĂ©lyezve van, akkor az összes mappa a DIDL-ben \"object.container.storageFolder\" lesz, nem pedig egy specifikusabb tĂ­puskĂ©nt, pĂ©ldĂĄul \"object.container.person.musicArtist\".", + "OptionHlsSegmentedSubtitles": "HLS szegmentĂĄlt feliratok", + "OptionEquals": "EgyenlƑ", + "OptionForceRemoteSourceTranscoding": "A tĂĄvoli mĂ©diaforrĂĄsok (pĂ©ldĂĄul az Ă©lƑ TV) ĂĄtkĂłdolĂĄsĂĄnak kĂ©nyszerĂ­tĂ©se", + "NoCreatedLibraries": "Úgy tƱnik mĂ©g nem hoztĂĄl lĂ©tre egy könyvtĂĄrat sem. {0}SzeretnĂ©l lĂ©trehozni egyet most?{1}", + "MessageDirectoryPickerBSDInstruction": "A BSD esetĂ©ben valĂłszĂ­nƱleg konfigurĂĄlni kell a FreeNAS Jailben lĂ©vƑ tĂĄrolĂłt, hogy a Jellyfin hozzĂĄfĂ©rhest kapjon.", + "LabelXDlnaDocHelp": "MeghatĂĄrozza az X_DLNADOC elem tartalmĂĄt az urn: schemas-dlna-org: device-1-0 nĂ©vtĂ©rben.", + "LabelXDlnaCapHelp": "MeghatĂĄrozza az X_DLNACAP elem tartalmĂĄt az urn: schemas-dlna-org: eszköz-1-0 nĂ©vtĂ©rben.", + "LabelVaapiDeviceHelp": "Ez a render csomĂłpont, amelyet a hardveres gyorsĂ­tĂĄshoz hasznĂĄlunk.", + "LabelTriggerType": "Trigger tĂ­pusa:", + "LabelTranscodingProgress": "ÁtkĂłdolĂĄs folyamatban:", + "LabelTranscodingFramerate": "ÁtkĂłdolĂĄs framerate:", + "LabelTranscodePath": "ÁtkĂłdolĂĄsi Ăștvonal:", + "LabelSonyAggregationFlagsHelp": "MeghatĂĄrozza az aggregationFlags elem tartalmĂĄt az urn: schemas-sonycom: av nĂ©vtĂ©rben.", + "LabelPostProcessorArguments": "UtĂłfeldolgozĂĄsi parancssori paramĂ©terek:", + "LabelPlayerDimensions": "LejĂĄtszĂł mĂ©retei:", + "LabelParentNumber": "SzĂŒlƑ szĂĄma:", + "LabelMetadataReadersHelp": "Rangsorold az elƑnyben rĂ©szesĂ­tett metaadat forrĂĄsokat. Az a forrĂĄs kerĂŒl sorsolĂĄsra, amelyben elƑször talĂĄlunk informĂĄciĂłt.", + "LabelLineup": "Felhozatal:", + "LabelBaseUrlHelp": "Ide hozzĂĄadhatsz egy egyĂ©ni alkönyvtĂĄrat, hogy a szerverhez egyedibb URL-cĂ­mrƑl fĂ©rj hozzĂĄ.", + "ErrorPleaseSelectLineup": "KĂ©rjĂŒk, vĂĄlassz ki egy felhozatalt, Ă©s prĂłbĂĄld Ășjra. Ha nem ĂĄllnak rendelkezĂ©sre felsorolĂĄsok, akkor ellenƑrizd, hogy helyes-e felhasznĂĄlĂłneved, jelszavad Ă©s irĂĄnyĂ­tĂłszĂĄmod.", + "ErrorAddingListingsToSchedulesDirect": "Hiba törtĂ©nt a felhozatal hozzĂĄadĂĄsa közben a Schedules Direct fiĂłkhoz. A Schedules Direct csak korlĂĄtozott szĂĄmĂș fiĂłk hozzĂĄadĂĄsĂĄt tĂĄmogatja. LehetsĂ©ges, hogy be kell jelentkezned a Schedules Direct weboldalĂĄn Ă©s eltĂĄvolĂ­tani nĂ©hĂĄny mĂĄs listĂĄt a fiĂłkodrĂłl mielƑtt tovĂĄbblĂ©psz.", + "DeviceAccessHelp": "Ez csak azokra az eszközökre alkalmazhatĂł, amelyek egyedileg vannak azonosĂ­tva Ă©s nem gĂĄtoljĂĄk meg a böngĂ©szƑbƑl valĂł elĂ©rĂ©st. A felhasznĂĄlĂłi eszközök kiszƱrĂ©se meg fogja akadĂĄlyozni az Ășj eszközök hasznĂĄlatĂĄt addig, amĂ­g itt nem engedĂ©lyezed Ƒket." } diff --git a/src/strings/id.json b/src/strings/id.json index 81d82159f..1a6113ecd 100644 --- a/src/strings/id.json +++ b/src/strings/id.json @@ -200,5 +200,7 @@ "Sync": "Sinkron", "Shows": "Tayangan", "Photos": "Foto", - "Movies": "Film" + "Movies": "Film", + "Alerts": "Peringatan", + "AddedOnValue": "Ditambahkan {0}" } diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 36eba8ff7..70fc89119 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -232,24 +232,66 @@ "ButtonResetPassword": "Endurstilla lykilorð", "ButtonOpen": "Opna", "Songs": "Lög", - "ButtonProfile": "", - "ButtonPreviousTrack": "", - "ButtonPause": "", - "ButtonRemove": "", - "ButtonResume": "", - "ButtonQuickStartGuide": "", - "ConfirmDeleteImage": "", - "ButtonRename": "", + "ButtonProfile": "PrĂłfĂ­ll", + "ButtonPreviousTrack": "Fyrra lag", + "ButtonPause": "PĂĄsa", + "ButtonRemove": "FjarlĂŠgja", + "ButtonResume": "Halda ĂĄfram", + "ButtonQuickStartGuide": "Byrjunar leiðarvĂ­sir", + "ConfirmDeleteImage": "Eyða mynd?", + "ButtonRename": "Endurnefna", "Sync": "Samstilla", "Never": "", "News": "", - "ButtonRevoke": "", - "ButtonRepeat": "", + "ButtonRevoke": "Afturkalla", + "ButtonRepeat": "Endurtaka", "MusicArtist": "", "MusicAlbum": "", "No": "", - "Monday": "", + "Monday": "MĂĄnudagur", "Name": "", "Mute": "", - "MusicVideo": "" + "MusicVideo": "", + "ButtonRefresh": "Endurhlaða", + "ButtonParentalControl": "Foreldraeftirlit", + "ButtonOff": "Af", + "ButtonNextTrack": "NĂŠsta lag", + "ButtonNetwork": "Net", + "ButtonMore": "Meira", + "ButtonManualLogin": "Handvirkt Auðkenni", + "ButtonLibraryAccess": "Aðgangur að safni", + "ButtonLearnMore": "LĂŠra meira", + "ButtonInfo": "UpplĂœsingar", + "ButtonHome": "Heim", + "ButtonHelp": "HjĂĄlp", + "ButtonGuide": "SjĂłnvarpsvĂ­sir", + "ButtonGotIt": "Skilið", + "ButtonFullscreen": "Fylla upp Ă­ skjĂĄ", + "ButtonForgotPassword": "Gleymt Lykilorð", + "ButtonFilter": "SĂ­a", + "ButtonEditOtherUserPreferences": "Breyta stillingum notanda, mynd og persĂłnulegum stillingum.", + "ButtonEditImages": "Breyta myndum", + "ButtonEdit": "Breyta", + "ButtonDownload": "SĂŠkja", + "ButtonDown": "Niður", + "ButtonDeleteImage": "Eyða Mynd", + "ButtonDelete": "Eyða", + "ButtonConnect": "Tengjast", + "ButtonChangeServer": "Skipta um ĂŸjĂłn", + "ButtonBack": "Til baka", + "ButtonAudioTracks": "Hljóðspor", + "BookLibraryHelp": "Hljóð og texta bĂŠkur eru stuttar. Lesið {0}book naming guide{1}.", + "Backdrops": "Bakgrunnar", + "Backdrop": "Bakgrunnur", + "AuthProviderHelp": "Veljið vottunaraðila til ĂŸess að sannvotta lykilorð notanta.", + "AskAdminToCreateLibrary": "Biðjið stjĂłrnanda að gera nĂœtt gagnasafn.", + "MoreFromValue": "Meira frĂĄ {0}", + "AlwaysPlaySubtitlesHelp": "Allir textar sem samsvara við tĂșngumĂĄli valið verða alltaf hlaðnir Ăłhåð hljóðmĂĄls tĂșngumĂĄli.", + "AllowedRemoteAddressesHelp": "Kommu aðskilinn listi yfir ip tölur eða ip-nĂșmeramĂĄt fyrir net sem mega fjartengjas. Ef ĂŸetta er autt eru allar fjartengingar leyfðar.", + "AllowHWTranscodingHelp": "Leyfa viðtĂŠki að umbreyta straumi Ă­ rauntĂ­ma.Þetta getur minnkað ĂĄlag ĂĄ ĂŸjĂłn.", + "ValueSpecialEpisodeName": "SĂ©rstakt - {0}", + "Shows": "Þéttir", + "Playlists": "Spilunarlisti", + "ButtonScanAllLibraries": "Skanna Öll Gagnasöfn", + "AllLibraries": "Öll gagnasöfn" } diff --git a/src/strings/kk.json b/src/strings/kk.json index ebb3d22b9..73ea163b2 100644 --- a/src/strings/kk.json +++ b/src/strings/kk.json @@ -637,7 +637,7 @@ "LabelH264Crf": "H264 kodtaĂœ CRF mĂĄni:", "LabelEncoderPreset": "H264 kodtaĂœ daıyndamasy:", "LabelHardwareAccelerationType": "Apparatyq jedeldetĂœ:", - "LabelHardwareAccelerationTypeHelp": "Bul tĂĄjirıbelik mĂșmkindik tek qoldaĂœ kĂłrsetiletin jĂșıelerde qoljetimdi.", + "LabelHardwareAccelerationTypeHelp": "Apparattyq jedeldetĂœ Ășshin qosymsha konfıgĂœrasĂœa qajet.", "LabelHomeNetworkQuality": "Úılik jeli sapasy:", "LabelHomeScreenSectionValue": "Basqy bet {0}-bĂłlim:", "LabelHttpsPort": "Jergilikti HTTPS-port nĂłmiri:", @@ -1485,5 +1485,21 @@ "FetchingData": "Qosymsha derekterdi shyÇ”aryp alĂœ", "ButtonAddImage": "SĂœret ĂșsteĂœ", "MusicLibraryHelp": "{0}MĂœzyka ataĂœ nusqaĂœlyÇ”yn{1} qarap shyÇ”Ăœ.", - "HeaderFavoritePeople": "TaƄdaĂœly adamdar" + "HeaderFavoritePeople": "TaƄdaĂœly adamdar", + "NoCreatedLibraries": "Eshqandaı tasyÇ”yshhanany jasamaÇ”anyƄyz sıaqty. {0}Qazir bireĂœin jasaısyz ba?{1}", + "SelectAdminUsername": "Ákimshi tirkelgisi Ășshin paıdalanĂœshy atyn taƄdaƄyz.", + "OptionRandom": "Kezdeısoq", + "OptionForceRemoteSourceTranscoding": "AlystaÇ”y tasyÇ”yshderekter kĂłzin qaıta kodtaĂœdy mĂĄjbĂșrleĂœ (efırlik TD sıaqty)", + "MessageConfirmAppExit": "ShyÇ”Ăœdy qalaısyz ba?", + "LabelVideoResolution": "Beıne ajyratymdylyÇ”y:", + "LabelStreamType": "AÇ”yn tĂșri:", + "EnableFastImageFadeInHelp": "JĂșktelgen sĂœretter Ășshin shapshan kĂłrsetilĂœin qosĂœ", + "EnableFastImageFadeIn": "SĂœrettiƄ shapshan kĂłrsetilĂœi", + "LabelPlayerDimensions": "Oınatqysh Ăłlshemderi:", + "LabelDroppedFrames": "Ótkizilgen kadrlar:", + "LabelCorruptedFrames": "BĂșlingen kadrlar:", + "HeaderNavigation": "SharlaĂœ", + "CopyStreamURLError": "URL kĂłshirgende qate oryn aldy.", + "ButtonSplit": "BĂłlĂœ", + "AskAdminToCreateLibrary": "TasĂœÇ”yshanany jasaĂœ Ășshin ĂĄkimshiden suraĂœ." } diff --git a/src/strings/ko.json b/src/strings/ko.json index 8e2e438d8..9cfacb6c3 100644 --- a/src/strings/ko.json +++ b/src/strings/ko.json @@ -94,7 +94,7 @@ "DeleteMedia": "ëŻžë””ì–Ž 제거", "DeleteUser": "ì‚Źìš©ìž 제거", "DeleteUserConfirmation": "읎 ì‚Źìš©ìžë„Œ 제거하êČ ìŠ”ë‹ˆêčŒ?", - "DeviceAccessHelp": "읎êČƒì€ êł ìœ í•˜êȌ ì‹ëł„í•  수 ìžˆêł  람띌우저 접귌을 방핎하지 않는 임ìč˜ì—ë§Œ 적용됩니닀. ì‚Źìš©ìž 임ìč˜ ì ‘ê·Œì„ 필터링하멎 ì—Źêž°ì—ì„œ ìŠč읞될 때êčŒì§€ 새 임ìč˜ë„Œ ì‚Źìš©í•  수 없êȌ 됩니닀.", + "DeviceAccessHelp": "읎êČƒì€ êł ìœ í•˜êȌ ì‹ëł„í•  수 있는 임ìč˜ì—ë§Œ ì ìš©ë˜ëŻ€ëĄœ 람띌우저넌 톔한 접귌은 찚닚할 수 없슔니닀. ì‚Źìš©ìž 임ìč˜ ì ‘ê·Œì„ 필터링하멎 ìŽêłłì—ì„œ ìŠč읞될 때êčŒì§€ 새 임ìč˜ë„Œ ì‚Źìš©í•  수 없êȌ 됩니닀.", "Director": "감독", "Dislike": "ì‹«ì–Žìš”", "Download": "ë‹€ìšŽëĄœë“œ", @@ -1285,5 +1285,15 @@ "Identify": "ì‹ëł„ìž", "HeaderMoreLikeThis": "ëč„슷한 작품", "DirectorsValue": "감독: {0}", - "ButtonSplit": "나누Ʞ" + "ButtonSplit": "나누Ʞ", + "HeaderContainerProfileHelp": "컚테읎너 í”„ëĄœíŒŒìŒì€ ì‚Źìš©ìžì˜ 디바읎슀에서 ìžŹìƒ 가늄한 파음 형식을 나타냅니닀. 닀읎렉튞 플레읎가 섀정된 êČœìš°ì—ë„ 디바읎슀에서 지원되지 않는 형식읎띌멎 튞랜슀윔딩읎 적용됩니닀.", + "HeaderCodecProfileHelp": "윔덱 í”„ëĄœíŒŒìŒì€ ì‚Źìš©ìžì˜ 디바읎슀에서 ìžŹìƒ 가늄한 윔덱을 ê°€ëŠŹí‚”ë‹ˆë‹€. 닀읎렉튞 플레읎가 섀정된 êČœìš°ì—ë„ 디바읎슀에서 지원되지 않는 윔덱읎띌멎 튞랜슀윔딩읎 적용됩니닀.", + "HeaderAppearsOn": "표시", + "HandledByProxy": "늏ëČ„ìŠ€ í”„ëĄì‹œëĄœ ìȘ늏", + "Features": "Ʞ늄", + "ErrorPleaseSelectLineup": "띌읞업을 ì„ íƒí•˜êł  닀시 시도하십시였. 읎용 가늄한 띌읞업읎 없윌멎 êł„ì •, ëč„ë°€ëȈ혞, 우펞ëČˆí˜žê°€ 정확한지 확읞하십시였.", + "ErrorAddingListingsToSchedulesDirect": "Schedules Direct êł„ì •ì— 띌읞업을 추가하는 쀑에 였넘가 발생했슔니닀. Schedules Direct는 êł„ì • ë‹č 제한된 수의 띌읞업만읎 허용됩니닀. êł„ì†í•˜ë €ë©Ž Schedules Direct ì›čì‚ŹìŽíŠžì— ëĄœê·žìží•˜ì—Ź 닀넞 항ëȘ©ì„ 삭제핎알 할 수 있슔니닀.", + "CopyStreamURLError": "URL을 ëł”ì‚Źí•˜ëŠ” 쀑에 였넘가 발생했슔니닀.", + "ColorTransfer": "ì»ŹëŸŹ 변환", + "AskAdminToCreateLibrary": "ëŒìŽëžŒëŸŹëŠŹë„Œ 생성하렀멎 êŽ€ëŠŹìžì—êȌ ëŹžì˜í•˜ì‹­ì‹œì˜€." } diff --git a/src/strings/ms.json b/src/strings/ms.json index 9f959b957..c377e52af 100644 --- a/src/strings/ms.json +++ b/src/strings/ms.json @@ -35,14 +35,14 @@ "AllowOnTheFlySubtitleExtractionHelp": "Sarikata-sarikata yang sedia ada dapat diekstrak dari video-video dan dihantar ke aplikasi Jellyfin dalam teks biasa. Ini untuk menghindari video daripada transkoding. Pada sistem-sistem lain, ia dapat mengambil masa panjang dan menyebabkan video main balik terhenti semasa proses pengekstrakan. Ciri ini dapat dimatikan supaya sarikata yang sedia ada akan dibakar bersama video transkoding, jika ianya tidak disokong secara asal oleh peranti klien.", "AllowRemoteAccess": "Membenarkan persambungan jauh ke pelayan Jellyfin ini.", "AllowRemoteAccessHelp": "Jika tidak disemak, semua persambungan jauh akan disekat.", - "AllowHWTranscodingHelp": "Jika diaktifkan, penala dibolehkan untuk transkod strim dengan serta-merta. Ini dapat bantu mengurangkan transkoding yang diperlukan dari pelayan Jellyfin.", + "AllowHWTranscodingHelp": "Benarkan penala untuk transkod strim serta-merta. Ini mungkin dapat bantu kurangkan kadar transkod yang diperlukan dari pelayan.", "AlwaysPlaySubtitles": "Sentiasa main sarikata", "AlwaysPlaySubtitlesHelp": "Sarikata sepadan dengan bahasa yang dipilih akan masih dimuatkan tanpa mengira bahasa audio.", "AnyLanguage": "Mana-mana bahasa", "Anytime": "Pada bila masa saja", "AroundTime": "Sekitar {0}", "Art": "Seni", - "Artists": "Artis-artis", + "Artists": "Artis", "AsManyAsPossible": "Sebanyak mungkin", "Ascending": "Susunan menaik", "AspectRatio": "Nisbah aspek", diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index 8f9a9b022..1ea78320d 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -1451,5 +1451,18 @@ "MusicLibraryHelp": "Verifique o {0}guia de nomes de mĂșsicas{1}.", "ButtonAddImage": "Adicionar Imagem", "HeaderFavoritePeople": "Pessoas Favoritas", - "OptionRandom": "AleatĂłrio" + "OptionRandom": "AleatĂłrio", + "SelectAdminUsername": "Por favor selecione um nome de usuĂĄrio para a conta de administrador.", + "OptionForceRemoteSourceTranscoding": "Forçar transcodificação em fontes de mĂ­dia remotas (como LiveTV)", + "NoCreatedLibraries": "Parece que vocĂȘ ainda nĂŁo criou nenhuma biblioteca. {0}Gostaria de criar uma agora?{1}", + "MessageConfirmAppExit": "VocĂȘ quer sair?", + "LabelVideoResolution": "Resolução de vĂ­deo:", + "LabelStreamType": "Tipo de stream:", + "EnableFastImageFadeIn": "Fade-in rĂĄpido da imagem", + "LabelPlayerDimensions": "DimensĂ”es do player:", + "LabelCorruptedFrames": "Quadros corrompidos:", + "HeaderNavigation": "Navegação", + "CopyStreamURLError": "Houve um erro ao copiar a URL.", + "ButtonSplit": "Dividir", + "AskAdminToCreateLibrary": "Peça a um administrador para criar uma biblioteca." } diff --git a/src/strings/pt-pt.json b/src/strings/pt-pt.json index 2cf5193bd..089345ad5 100644 --- a/src/strings/pt-pt.json +++ b/src/strings/pt-pt.json @@ -351,7 +351,7 @@ "LabelGroupMoviesIntoCollections": "Agrupar filmes em coleçÔes", "LabelGroupMoviesIntoCollectionsHelp": "Ao mostrar listas de filmes, filmes que pertençam a uma coleção serĂŁo mostrados como um Ășnico item agrupado.", "LabelHardwareAccelerationType": "Aceleração por hardware:", - "LabelHardwareAccelerationTypeHelp": "Esta funcionalidade Ă© experimental e estĂĄ disponĂ­vel apenas em sistemas suportados.", + "LabelHardwareAccelerationTypeHelp": "Aceleração via Hardware requer configuraçÔes adicionais.", "LabelHttpsPort": "NĂșmero do porto HTTPS local:", "LabelHttpsPortHelp": "NĂșmero do porto TCP em que o servidor HTTPS do Jellyfin ficarĂĄ Ă  escuta.", "LabelIconMaxHeight": "Altura mĂĄxima do Ă­cone:", @@ -1442,5 +1442,9 @@ "EnableStreamLooping": "Auto-cĂ­clico de streams ao vivo", "Down": "Baixo", "CopyStreamURLError": "Ocorreu um erro a copiar o URL.", - "ButtonSplit": "Dividir" + "ButtonSplit": "Dividir", + "NoCreatedLibraries": "Oh NĂŁo! Parece que vocĂȘ ainda nĂŁo criou nenhuma biblioteca por enquanto. {0} Gostaria de criar uma biblioteca agora? {1}", + "AskAdminToCreateLibrary": "Pergunte a um administrador para criar uma biblioteca.", + "LabelVideoResolution": "Resolução de vĂ­deo:", + "LabelPlayerDimensions": "DimensĂ”es de leitor:" } diff --git a/src/strings/ro.json b/src/strings/ro.json index b8e87e0d3..3880d14d1 100644 --- a/src/strings/ro.json +++ b/src/strings/ro.json @@ -809,7 +809,7 @@ "LabelHttpsPort": "Portul local HTTPS:", "LabelHomeScreenSectionValue": "Secțiunea ecranului de pornire {0}:", "LabelHomeNetworkQuality": "Calitatea pe rețeaua de domiciliu:", - "LabelHardwareAccelerationTypeHelp": "Aceasta este o caracteristică experimentală disponibilă doar pe sistemele acceptate.", + "LabelHardwareAccelerationTypeHelp": "Accelerarea hardware necesită configurare suplimentară.", "LabelHardwareAccelerationType": "Accelerare hardware:", "LabelEncoderPreset": "H264 encoding presetat:", "LabelH264Crf": "CRF codare H264:", @@ -1463,5 +1463,7 @@ "LabelPlayerDimensions": "Dimensiunile soft redare:", "LabelDroppedFrames": "Cadre abandonate:", "LabelCorruptedFrames": "Cadre corupte:", - "OptionForceRemoteSourceTranscoding": "Forțați transcodarea surselor media distante (cum ar fi LiveTV)" + "OptionForceRemoteSourceTranscoding": "Forțați transcodarea surselor media distante (cum ar fi LiveTV)", + "NoCreatedLibraries": "Se pare că nu ați creat Ăźncă biblioteci. {0} Doriți să creați una acum? {1}", + "AskAdminToCreateLibrary": "Cereți unui administrator să creeze o bibliotecă." } diff --git a/src/strings/ru.json b/src/strings/ru.json index b90aaa90b..5ef7fb302 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -622,7 +622,7 @@ "LabelH264Crf": "Đ—ĐœĐ°Ń‡Đ”ĐœĐžĐ” CRF H264-ĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐžŃ:", "LabelEncoderPreset": "ĐŸŃ€Đ”ĐŽŃƒŃŃ‚Đ°ĐœĐŸĐČĐșа H264-ĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐžŃ:", "LabelHardwareAccelerationType": "ĐĐżĐżĐ°Ń€Đ°Ń‚ĐœĐŸĐ” усĐșĐŸŃ€Đ”ĐœĐžĐ”:", - "LabelHardwareAccelerationTypeHelp": "Đ­Ń‚ĐŸ эĐșŃĐżĐ”Ń€ĐžĐŒĐ”ĐœŃ‚Đ°Đ»ŃŒĐœĐ°Ń Ń„ŃƒĐœĐșцоя, ĐžĐŒĐ”ŃŽŃ‰Đ°ŃŃŃ Ń‚ĐŸĐ»ŃŒĐșĐŸ ĐœĐ° ĐżĐŸĐŽĐŽĐ”Ń€Đ¶ĐžĐČĐ°Đ”ĐŒŃ‹Ń… ŃĐžŃŃ‚Đ”ĐŒĐ°Ń….", + "LabelHardwareAccelerationTypeHelp": "ĐĐżĐżĐ°Ń€Đ°Ń‚ĐœĐŸĐ” усĐșĐŸŃ€Đ”ĐœĐžĐ” Ń‚Ń€Đ”Đ±ŃƒĐ”Ń‚ ĐŽĐŸĐżĐŸĐ»ĐœĐžŃ‚Đ”Đ»ŃŒĐœĐŸĐč ĐșĐŸĐœŃ„ĐžĐłŃƒŃ€Đ°Ń†ĐžĐž.", "LabelHomeNetworkQuality": "КачДстĐČĐŸ ĐČ ĐŽĐŸĐŒĐ°ŃˆĐœĐ”Đč сДтО:", "LabelHomeScreenSectionValue": "ГлаĐČĐœĐ°Ń ŃŃ‚Ń€Đ°ĐœĐžŃ†Đ° - разЎДл {0}:", "LabelHttpsPort": "ĐĐŸĐŒĐ”Ń€ Đ»ĐŸĐșĐ°Đ»ŃŒĐœĐŸĐłĐŸ HTTPS-ĐżĐŸŃ€Ń‚Đ°:", @@ -1458,10 +1458,13 @@ "HeaderNavigation": "НаĐČогацоя", "LabelVideoResolution": "Đ Đ°Đ·Ń€Đ”ŃˆĐ”ĐœĐžĐ” ĐČĐžĐŽĐ”ĐŸ:", "LabelStreamType": "йОп ĐżĐŸŃ‚ĐŸĐșа:", - "EnableFastImageFadeInHelp": "ВĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ Đ±Ń‹ŃŃ‚Ń€ĐŸĐ” ĐłĐ°ŃˆĐ”ĐœĐžĐ” Đ°ĐœĐžĐŒĐ°Ń†ĐžĐž ĐŽĐ»Ń Đ·Đ°ĐłŃ€ŃƒĐ¶Đ”ĐœĐœŃ‹Ń… Ń€ĐžŃŃƒĐœĐșĐŸĐČ", - "EnableFastImageFadeIn": "Đ‘Ń‹ŃŃ‚Ń€ĐŸĐ” ĐłĐ°ŃˆĐ”ĐœĐžĐ” Ń€ĐžŃŃƒĐœĐșа", + "EnableFastImageFadeInHelp": "ВĐșĐ»ŃŽŃ‡ĐžŃ‚ŃŒ Đ±Ń‹ŃŃ‚Ń€ĐŸĐ” ĐżĐŸŃĐČĐ»Đ”ĐœĐžĐ” Đ°ĐœĐžĐŒĐ°Ń†ĐžĐž ĐŽĐ»Ń Đ·Đ°ĐłŃ€ŃƒĐ¶Đ”ĐœĐœŃ‹Ń… Ń€ĐžŃŃƒĐœĐșĐŸĐČ", + "EnableFastImageFadeIn": "Đ‘Ń‹ŃŃ‚Ń€ĐŸĐ” ĐżĐŸŃĐČĐ»Đ”ĐœĐžĐ” Ń€ĐžŃŃƒĐœĐșа", "LabelPlayerDimensions": "Đ Đ°Đ·ĐŒĐ”Ń€ĐœĐŸŃŃ‚Đž ĐżŃ€ĐŸĐžĐłŃ€Ń‹ĐČĐ°Ń‚Đ”Đ»Ń:", "LabelDroppedFrames": "ĐŸŃ€ĐŸĐżŃƒŃ‰Đ”ĐœĐœŃ‹Đ” ĐșаЮры:", "LabelCorruptedFrames": "Đ˜ŃĐżĐŸŃ€Ń‡Đ”ĐœĐœŃ‹Đ” ĐșаЮры:", - "CopyStreamURLError": "ĐŸŃ€ĐŸĐžĐ·ĐŸŃˆĐ»Đ° ĐŸŃˆĐžĐ±Đșа про ĐșĐŸĐżĐžŃ€ĐŸĐČĐ°ĐœĐžĐž URL." + "CopyStreamURLError": "ĐŸŃ€ĐŸĐžĐ·ĐŸŃˆĐ»Đ° ĐŸŃˆĐžĐ±Đșа про ĐșĐŸĐżĐžŃ€ĐŸĐČĐ°ĐœĐžĐž URL.", + "OptionForceRemoteSourceTranscoding": "ĐŸŃ€ĐžĐœŃƒĐŽĐžŃ‚Đ”Đ»ŃŒĐœĐŸĐ” пДрДĐșĐŸĐŽĐžŃ€ĐŸĐČĐ°ĐœĐžĐ” ŃƒĐŽĐ°Đ»Ń‘ĐœĐœŃ‹Ń… ĐžŃŃ‚ĐŸŃ‡ĐœĐžĐșĐŸĐČ ĐŒĐ”ĐŽĐžĐ°ĐŽĐ°ĐœĐœŃ‹Ń… (ĐœĐ°ĐżŃ€ĐžĐŒĐ”Ń€, ŃŃ„ĐžŃ€ĐœĐŸĐ” бВ)", + "NoCreatedLibraries": "ĐŸĐŸŃ…ĐŸĐ¶Đ”, ĐČы ДщД ĐœĐ” ŃĐŸĐ·ĐŽĐ°Đ»Đž ĐœĐž ĐŸĐŽĐœĐŸĐč ĐŒĐ”ĐŽĐžĐ°Ń‚Đ”ĐșĐž. {0}ЖДлаДтД ŃĐŸĐ·ĐŽĐ°Ń‚ŃŒ Дё сДĐčчас?{1}", + "AskAdminToCreateLibrary": "ЗапрашоĐČать Đ°ĐŽĐŒĐžĐœĐžŃŃ‚Ń€Đ°Ń‚ĐŸŃ€Đ° ĐŽĐ»Ń ŃĐŸĐ·ĐŽĐ°ĐœĐžŃ ĐŒĐ”ĐŽĐžĐ°Ń‚Đ”ĐșĐž." } diff --git a/src/strings/sk.json b/src/strings/sk.json index a6fce3150..56bbaf04c 100644 --- a/src/strings/sk.json +++ b/src/strings/sk.json @@ -1143,7 +1143,7 @@ "HeaderApp": "Appka", "HeaderApiKeysHelp": "ExternĂ© aplikĂĄcie musia maĆ„ vlastnĂœ API kÄŸĂșč, aby mohli komunikovaĆ„ s Jellyfin Serverom. KÄŸĂșče sĂș vydĂĄvanĂ© pomocou prihlĂĄsenia sa cez Jellyfin Ășčet alebo manuĂĄlnym priradenĂ­m kÄŸĂșča aplikĂĄciĂ­.", "HeaderAdditionalParts": "DodatočnĂ© časti", - "HardwareAccelerationWarning": "Povolenie hardvĂ©rovej akcelerĂĄcie mĂŽĆŸe spĂŽsobiĆ„ nestabilitu v niektorĂœch podmienkach. Uistite sa, ĆŸe vĂĄĆĄ operačnĂœ systĂ©m a grafickĂ© ovlĂĄdače sĂș plne aktualizovanĂ©. PokiaÄŸ mĂĄte po zapnutĂ­ problĂ©my s prehrĂĄvanĂ­m videa, budete musieĆ„ zmeniĆ„ nastavenie spÀƄ na Auto.", + "HardwareAccelerationWarning": "Povolenie hardvĂ©rovej akcelerĂĄcie mĂŽĆŸe spĂŽsobiĆ„ nestabilitu v niektorĂœch podmienkach. Uistite sa, ĆŸe vĂĄĆĄ operačnĂœ systĂ©m a grafickĂ© ovlĂĄdače sĂș plne aktualizovanĂ©. PokiaÄŸ mĂĄte po zapnutĂ­ problĂ©my s prehrĂĄvanĂ­m videa, budete musieĆ„ zmeniĆ„ nastavenie spÀƄ na Ćœiadne.", "AddItemToCollectionHelp": "PridaĆ„ poloĆŸku do kolekcie jej vyhÄŸadanĂ­m a pouĆŸitĂ­m pravĂ©ho tlačítka myĆĄi alebo kliknutĂ­m na tlačidlo ponuky a pridaĆ„ do kolekcie.", "HandledByProxy": "SpracovanĂ© pomocou reverznej proxy", "EncoderPresetHelp": "Vyberte hodnotu faster pre zlepĆĄenie vĂœkonu alebo hodnotu slower pre zlepĆĄenie kvality.", @@ -1465,5 +1465,7 @@ "LabelDroppedFrames": "VynechanĂ© snĂ­mky:", "LabelCorruptedFrames": "PoĆĄkodenĂ© snĂ­mky:", "CopyStreamURLError": "Pri kopĂ­rovanĂ­ URL nastala chyba.", - "OptionForceRemoteSourceTranscoding": "VynĂștiĆ„ transkĂłdovanie vzdialenĂœch mediĂĄlnych zdrojov (ako napr. ĆŸivĂĄ TV)" + "OptionForceRemoteSourceTranscoding": "VynĂștiĆ„ transkĂłdovanie vzdialenĂœch mediĂĄlnych zdrojov (ako napr. ĆŸivĂĄ TV)", + "NoCreatedLibraries": "VyzerĂĄ to tak, ĆŸe ste zatiaÄŸ nevytvorili ĆŸiadnu kniĆŸnicu. {0}Chceli by ste nejakĂș vytvoriĆ„ teraz?{1}", + "AskAdminToCreateLibrary": "PokiaÄŸ chcete vytvoriĆ„ kniĆŸnicu, musĂ­te sa spĂœtaĆ„ administrĂĄtora." } diff --git a/src/strings/sv.json b/src/strings/sv.json index 17556a0f6..524a644f8 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -1,14 +1,14 @@ { - "AccessRestrictedTryAgainLater": "Åtkomst Ă€r begrĂ€nsad. Försök igen senare.", + "AccessRestrictedTryAgainLater": "För nĂ€rvarande Ă€r Ă„tkomst begrĂ€nsad. Försök igen senare.", "Actor": "SkĂ„despelare", "Add": "LĂ€gg till", - "AddItemToCollectionHelp": "LĂ€gg till objekt till samlingar genom att först söka efter dom och sen högerklicka eller tappa upp menyn för att lĂ€gga till dom.", + "AddItemToCollectionHelp": "LĂ€gg till objekt till samlingar genom att först söka efter dem och sen högerklicka eller tappa upp menyn för att lĂ€gga till dem.", "AddToCollection": "LĂ€gg till samling", "AddToPlayQueue": "LĂ€gg till i spelkö", "AddToPlaylist": "LĂ€gg till i spellista", "AddedOnValue": "Tillagd {0}", "AdditionalNotificationServices": "Sök efter fler meddelandetillĂ€gg i tillĂ€ggskatalogen.", - "AirDate": "SĂ€ndningstid", + "AirDate": "SĂ€ndningsdatum", "Aired": "SĂ€ndes", "Albums": "Album", "All": "Alla", @@ -17,7 +17,7 @@ "AllEpisodes": "Alla avsnitt", "AllLanguages": "Alla sprĂ„k", "AllLibraries": "Alla bibliotek", - "AllowHWTranscodingHelp": "Aktivera för att lĂ„ta TV-mottagaren omkoda strömmar. Det kan minska behovet av omkodning pĂ„ Jellyfin Server.", + "AllowHWTranscodingHelp": "TillĂ„t TV-mottagaren att omkoda strömmar. Det kan minska behovet av omkodning pĂ„ Jellyfin Servern.", "AllowOnTheFlySubtitleExtraction": "TillĂ„t undertextsextrahering under uppspelning", "AllowOnTheFlySubtitleExtractionHelp": "InbĂ€ddade undertexter kan extraheras ur videor och skickas till klienter i textformat för att förhindra omkodning. I vissa system kan detta ta en lĂ„ng tid och stoppa videouppspelningen under extraheringsprocessen. Avaktivera detta för att brĂ€nna in inbĂ€ddade undertexter genom omkodning nĂ€r de inte stöds av klienten.", "AllowRemoteAccess": "TillĂ„t fjĂ€rranslutningar till denna Jellyfin-server.", @@ -40,13 +40,13 @@ "BirthDateValue": "Född: {0}", "BirthLocation": "Födelseort", "BirthPlaceValue": "Födelseort:{0}", - "BookLibraryHelp": "Ljud- och textböcker stöds. LĂ€s {0}Jellyfins boknamngivningsguide{1}.", + "BookLibraryHelp": "Ljud- och textböcker stöds. LĂ€s {0}boknamngivningsguide{1}.", "Books": "Böcker", "Box": "Omslag", "BoxRear": "Omslag (baksida)", "Browse": "BlĂ€ddra", "BrowsePluginCatalogMessage": "Besök katalogen för att se tillgĂ€ngliga tillĂ€gg.", - "BurnSubtitlesHelp": "Avgör ifall servern ska \"brĂ€nna in\" undertexterna under videokonverteringen, beroende pĂ„ undertextsformatet. Att undvika inbrĂ€nning av undertexter kommer att förbĂ€ttra prestandan pĂ„ servern. VĂ€lj Automatisk för att brĂ€nna bild-baserade formats (ex. VOBSUB, PGS, SUB/IDX, etc.) men ocksĂ„ vissa ASS/SSA undertexter.", + "BurnSubtitlesHelp": "Avgör ifall servern ska \"brĂ€nna in\" undertexterna under videokonverteringen, beroende pĂ„ undertextsformatet. Att undvika inbrĂ€nning av undertexter kommer att förbĂ€ttra prestandan pĂ„ servern. VĂ€lj Automatisk för att brĂ€nna bild-baserade formats (ex. VOBSUB, PGS, SUB/IDX, etc.) och vissa ASS/SSA undertexter.", "ButtonAdd": "LĂ€gg till", "ButtonAddMediaLibrary": "LĂ€gg till mediabibliotek", "ButtonAddScheduledTaskTrigger": "LĂ€gg till utlösare", @@ -69,25 +69,25 @@ "ButtonEditImages": "Ändra bilder", "ButtonEditOtherUserPreferences": "Ändra den hĂ€r anvĂ€ndarens profil, bild och personliga instĂ€llningar.", "ButtonFilter": "Filtrera", - "ButtonForgotPassword": "Glömt lösenord", + "ButtonForgotPassword": "Glömt Lösenord", "ButtonFullscreen": "FullskĂ€rm", "ButtonGotIt": "Ok", "ButtonHelp": "HjĂ€lp", "ButtonHome": "Hem", "ButtonLearnMore": "LĂ€s mer", "ButtonLibraryAccess": "BiblioteksĂ„tkomst", - "ButtonManualLogin": "Manuell inloggning:", + "ButtonManualLogin": "Manuell inloggning", "ButtonMore": "Mer", "ButtonNetwork": "NĂ€tverk", "ButtonNew": "Nytillkommet", - "ButtonNextTrack": "NĂ€sta spĂ„r:", + "ButtonNextTrack": "NĂ€sta spĂ„r", "ButtonOff": "Av", "ButtonOk": "OK", "ButtonOpen": "Öppna", "ButtonParentalControl": "FörĂ€ldralĂ„s", "ButtonPause": "Paus", "ButtonPlay": "Spela upp", - "ButtonPreviousTrack": "FöregĂ„ende spĂ„r:", + "ButtonPreviousTrack": "FöregĂ„ende spĂ„r", "ButtonProfile": "Profil", "ButtonQuickStartGuide": "Snabbstartguide", "ButtonRefresh": "Uppdatera", @@ -179,14 +179,14 @@ "Down": "Ner", "Download": "Ladda ned", "DownloadsValue": "Nedladdningar: {0}", - "DrmChannelsNotImported": "Kanaler med DRM kommer inte att importeras", - "DropShadow": "Visa skugga", + "DrmChannelsNotImported": "Kanaler med DRM kommer inte att importeras.", + "DropShadow": "Visa 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", "EditMetadata": "Redigera metadata", "EditSubtitles": "Ändra undertexter", - "EnableBackdrops": "Aktivera fondbilder", + "EnableBackdrops": "Fondbilder", "EnableBackdropsHelp": "Visar fondbilder i bakgrunden av vissa sidor vid blĂ€ddring i biblioteket.", "EnableCinemaMode": "BiolĂ€ge", "EnableColorCodedBackgrounds": "FĂ€rgkodade bakgrundsbilder", @@ -198,9 +198,9 @@ "EnableNextVideoInfoOverlayHelp": "Vid slutet av en video, visa information om nĂ€stföljande video i spellistan.", "EnablePhotos": "Visa foton", "EnablePhotosHelp": "Bilder kommer upptĂ€ckas och visas tillsammans med andra mediefiler.", - "EnableThemeSongs": "Aktivera ledmotiv", + "EnableThemeSongs": "Signaturmelodi", "EnableThemeSongsHelp": "Spela ledmotiv i bakgrunden vid blĂ€ddring i biblioteket.", - "EnableThemeVideos": "Aktivera tema-videos", + "EnableThemeVideos": "Tema-videor", "EnableThemeVideosHelp": "Spela tema-videos i bakgrunden vid blĂ€ddring i biblioteket.", "Ended": "Avslutad", "EndsAtValue": "Slutar vid: {0}", @@ -208,13 +208,13 @@ "ErrorAddingMediaPathToVirtualFolder": "Det gick inte att lĂ€gga till sökvĂ€gen. Kontrollera att sökvĂ€gen Ă€r korrekt och att Jellyfin Server har rĂ€ttigheter till sökvĂ€gen.", "ErrorAddingTunerDevice": "Det gick inte att lĂ„gga till den hĂ€r TV-mottagaren. SĂ€kerstĂ€ll att den gĂ„r att nĂ„ och försök igen.", "ErrorDeletingItem": "Det gick inte att ta bort det hĂ€r objektet frĂ„n Jellyfin-servern. Kontrollera att Jellyfin-servern har skrivrĂ€ttigheter till media-mappen och försök igen.", - "ErrorGettingTvLineups": "Ett fel uppstod vid nedladdningen utav tv-sortimentet. Se till sĂ„ att uppgifterna stĂ€mmer och försök igen.", + "ErrorGettingTvLineups": "Ett fel uppstod vid nedladdningen utav TV-sortimentet. Se till sĂ„ att uppgifterna stĂ€mmer och försök igen.", "ErrorMessageStartHourGreaterThanEnd": "Sluttiden mĂ„ste vara senare Ă€n starttiden.", "ErrorPleaseSelectLineup": "VĂ€lj en lineup och försök igen. Om inga lineups finns tillgĂ€ngliga, kolla sĂ„ att anvĂ€ndarnamn, lösenord och postnummer stĂ€mmer.", "ErrorSavingTvProvider": "Ett fel uppstod nĂ€r TV-tjĂ€nsten skulle sparas. Se till att den gĂ„r att nĂ„ och försök igen senare.", "EveryNDays": "Var {0}:e dag", "ExitFullscreen": "Avsluta fullskĂ€rm", - "ExtraLarge": "Extra stor", + "ExtraLarge": "Extra Stor", "ExtractChapterImagesHelp": "Att extrahera kapitelrutor möjliggör för klienter att visa grafiska menyer för kapitelval. Aktiviteten kan vara lĂ„ngsam, resurs-intensiv och kan krĂ€va flera gigabyte i utrymme. Aktiviteten körs nĂ€r nya videofiler upptĂ€cks, och Ă€r Ă€ven schemalagd under nattetid. Schemat gĂ„r att konfigurera under schemalagda aktiviteter. Det Ă€r inte rekommenderat att köra den hĂ€r aktiviteten vid tider med hög belastning.", "FFmpegSavePathNotFound": "Det gick inte att hitta FFmpeg med den angivna sökvĂ€gen. FFprobe mĂ„ste Ă€ven finnas i samma mapp. Dessa komponenter inkluderas normalt i samma nedladdning. Var god undersök sökvĂ€gen och försök igen.", "Favorite": "Favorit", @@ -229,7 +229,7 @@ "FolderTypeMovies": "Filmer", "FolderTypeMusic": "Musik", "FolderTypeMusicVideos": "Musikvideor", - "FolderTypeTvShows": "Serier", + "FolderTypeTvShows": "TV Serier", "FolderTypeUnset": "Blandat InnehĂ„ll", "Folders": "Mappar", "Friday": "Fredag", @@ -287,7 +287,7 @@ "HeaderContainerProfile": "BehĂ„llareprofil", "HeaderContainerProfileHelp": "BehĂ„llareprofiler bestĂ€mmer begrĂ€nsningarna hos en enhet nĂ€r den spelar upp olika filformat. Om en begrĂ€nsning Ă€r aktuell kommer innehĂ„llet att kodas om, Ă€ven om formatet i sig Ă€r instĂ€llt för direkt avspelning.", "HeaderContinueListening": "FortsĂ€tt lyssna pĂ„", - "HeaderContinueWatching": "FortsĂ€tt kolla pĂ„", + "HeaderContinueWatching": "FortsĂ€tt kolla", "HeaderCustomDlnaProfiles": "Anpassade profiler", "HeaderDateIssued": "Utgivningsdatum", "HeaderDefaultRecordingSettings": "Standard inspelningsinstĂ€llningar", @@ -320,9 +320,9 @@ "HeaderFrequentlyPlayed": "Ofta spelade", "HeaderGenres": "Genrer", "HeaderGuideProviders": "KĂ€llor för programguide", - "HeaderHttpHeaders": "Http-rubriker", + "HeaderHttpHeaders": "HTTP headers", "HeaderIdentification": "Identifiering", - "HeaderIdentificationCriteriaHelp": "Var god skriv in minst ett identifieringskriterium", + "HeaderIdentificationCriteriaHelp": "Skriv in minst ett kriterie för identifiering.", "HeaderIdentificationHeader": "ID-rubrik", "HeaderIdentifyItemHelp": "Ange ett eller flera sökkriterier. Ta bort kriterier för att fĂ„ fler trĂ€ffar.", "HeaderImageSettings": "BildinstĂ€llningar", @@ -331,7 +331,7 @@ "HeaderItems": "Objekt", "HeaderKeepRecording": "FortsĂ€tt spela in", "HeaderKeepSeries": "BehĂ„ll serie", - "HeaderKodiMetadataHelp": "Jellyfin har stöd för Nfo-metadatafiler. För att aktivera eller inaktivera Nfo-metadata, anvĂ€nd Metadata-fliken för att konfigurera Nfo-stöd för dina mediatyper.", + "HeaderKodiMetadataHelp": "Jellyfin har stöd för NFO-metadatafiler. För att aktivera eller inaktivera NFO-metadata, anvĂ€nd Metadata-fliken för att konfigurera NFO-stöd för dina mediatyper.", "HeaderLatestEpisodes": "Senaste avsnitten", "HeaderLatestMedia": "Nytillkommet", "HeaderLatestMovies": "Nytillkomna filmer", @@ -350,7 +350,7 @@ "HeaderMetadataSettings": "MetadatainstĂ€llningar", "HeaderMoreLikeThis": "Mer som denna", "HeaderMovies": "Filmer", - "HeaderMusicQuality": "Musikkvalitet:", + "HeaderMusicQuality": "Musikkvalitet", "HeaderMusicVideos": "Musikvideor", "HeaderMyDevice": "Min enhet", "HeaderMyMedia": "Min Media", @@ -358,7 +358,7 @@ "HeaderNewApiKey": "Ny API-nyckel", "HeaderNewDevices": "Nya enheter", "HeaderNextEpisodePlayingInValue": "NĂ€sta avsnitt börjar om {0}", - "HeaderNextUp": "NĂ€sta pĂ„ tur", + "HeaderNextUp": "NĂ€sta", "HeaderNextVideoPlayingInValue": "NĂ€sta video börjar om {0}", "HeaderOnNow": "Visas nu", "HeaderOtherItems": "Övriga objekt", @@ -375,7 +375,7 @@ "HeaderPlaybackError": "Uppspelningsfel", "HeaderPleaseSignIn": "Var god logga in", "HeaderPluginInstallation": "Installation av tillĂ€gg", - "HeaderPreferredMetadataLanguage": "Önskat sprĂ„k för metadata:", + "HeaderPreferredMetadataLanguage": "Önskat sprĂ„k för metadata", "HeaderProfile": "Profil", "HeaderProfileInformation": "Profilinformation", "HeaderProfileServerSettingsHelp": "Dessa instĂ€llningar kontrollerar hur Jellyfin Server presenterar sig för enheten.", @@ -404,7 +404,7 @@ "HeaderSelectTranscodingPath": "VĂ€lj plats för mellanlagring vid omkodning", "HeaderSelectTranscodingPathHelp": "BlĂ€ddra fram till eller ange plats för omkodarens mellanlagring. Katalogen mĂ„ste vara tillgĂ€nglig för skrivning.", "HeaderSendMessage": "Skicka meddelande", - "HeaderSeries": "Serie:", + "HeaderSeries": "Serier", "HeaderSeriesOptions": "Seriealternativ", "HeaderSeriesStatus": "Seriestatus", "HeaderServerSettings": "ServerinstĂ€llningar", @@ -479,7 +479,7 @@ "LabelAllowServerAutoRestart": "TillĂ„t att servern startas om automatiskt efter uppdateringar", "LabelAllowServerAutoRestartHelp": "Servern startas om endast dĂ„ inga anvĂ€ndare Ă€r inloggade.", "LabelAppName": "Appens namn", - "LabelAppNameExample": "Exempel: Sickbeard, NzbDrone", + "LabelAppNameExample": "Exempel: Sickbeard, Sonarr", "LabelArtists": "Artister:", "LabelArtistsHelp": "Separera med vid flera ;", "LabelAudio": "Ljud:", @@ -506,8 +506,8 @@ "LabelCriticRating": "Kritikerbetyg:", "LabelCurrentPassword": "Nuvarande lösenord:", "LabelCustomCertificatePath": "SökvĂ€g för anpassat SSL-certifikat:", - "LabelCustomCertificatePathHelp": "LĂ€gg upp ditt eget SSL-certifkat i .pfx-format", - "LabelCustomCss": "Egen css:", + "LabelCustomCertificatePathHelp": "LĂ€gg upp ditt eget SSL-certifkat i .pfx-format.", + "LabelCustomCss": "Egen CSS:", "LabelCustomCssHelp": "Applicera din egen css till webbgrĂ€nssnittet.", "LabelCustomDeviceDisplayName": "Visningsnamn:", "LabelCustomDeviceDisplayNameHelp": "Ange ett anpassat enhetsnamn. LĂ€mna blankt för att anvĂ€nda det namn enheten sjĂ€lv rapporterar.", @@ -523,7 +523,7 @@ "LabelDefaultUser": "Förvald anvĂ€ndare:", "LabelDefaultUserHelp": "Anger vilket anvĂ€ndarbibliotek som skall visas pĂ„ anslutna enheter. Denna instĂ€llning kan Ă€ndras pĂ„ enhetsbasis med hjĂ€lp av en enhetsprofiler.", "LabelDeviceDescription": "Enhetsbeskrivning", - "LabelDidlMode": "Didl-lĂ€ge:", + "LabelDidlMode": "DIDL-lĂ€ge:", "LabelDiscNumber": "Skivnummer:", "LabelDisplayLanguage": "VisningssprĂ„k:", "LabelDisplayLanguageHelp": "Att översĂ€tta Jellyfin Ă€r ett pĂ„gĂ„ende projekt.", @@ -532,7 +532,7 @@ "LabelDisplayName": "Visningsnamn:", "LabelDisplayOrder": "Visningsordning:", "LabelDisplaySpecialsWithinSeasons": "Visa specialavsnitt i de sĂ€songer de sĂ€ndes i", - "LabelDownMixAudioScale": "Höj nivĂ„n vid nedmixning av ljud", + "LabelDownMixAudioScale": "Höj nivĂ„n vid nedmixning av ljud:", "LabelDownMixAudioScaleHelp": "Höj nivĂ„n vid nedmixning. SĂ€tt vĂ€rdet till 1 för att behĂ„lla den ursprungliga nivĂ„n.", "LabelDownloadLanguages": "SprĂ„k att hĂ€mta:", "LabelDropImageHere": "SlĂ€pp en bild hĂ€r, eller klicka för att blĂ€ddra.", @@ -550,12 +550,12 @@ "LabelEnableDlnaDebugLogging": "Aktivera DLNA felsökningsloggning", "LabelEnableDlnaDebugLoggingHelp": "Detta resulterar i mycket stora loggfiler och rekommenderas bara vid felsökning.", "LabelEnableDlnaPlayTo": "AnvĂ€nd DLNA spela-upp-pĂ„", - "LabelEnableDlnaPlayToHelp": "Jellyfin kan hitta enheter pĂ„ ditt nĂ€tverk och ge dig möjlighet att fjĂ€rrstyra dem.", + "LabelEnableDlnaPlayToHelp": "Hitta enheter pĂ„ ditt nĂ€tverk och ge dig möjlighet att fjĂ€rrstyra dem.", "LabelEnableDlnaServer": "Aktivera DLNA-server", - "LabelEnableDlnaServerHelp": "TillĂ„t att UPnP-enheter pĂ„ ditt nĂ€tverk kan se och spela upp innehĂ„ll frĂ„n din Jellyfin Server.", + "LabelEnableDlnaServerHelp": "TillĂ„t att UPnP-enheter pĂ„ ditt nĂ€tverk kan se och spela upp innehĂ„ll.", "LabelEnableHardwareDecodingFor": "Aktivera hĂ„rdvaruomkodning för:", "LabelEnableRealtimeMonitor": "Aktivera bevakning av mappar i realtid", - "LabelEnableRealtimeMonitorHelp": "FörĂ€ndringar upptĂ€cks omedelbart (i filsystem som stödjer detta)", + "LabelEnableRealtimeMonitorHelp": "FörĂ€ndringar upptĂ€cks omedelbart (i filsystem som stödjer detta).", "LabelEnableSingleImageInDidlLimit": "BegrĂ€nsa till en inbĂ€ddad bild", "LabelEnableSingleImageInDidlLimitHelp": "Visa enheter kommer inte renderas ordentligt om flera bilder bĂ€ddas in i Didl.", "LabelEndDate": "Slutdatum:", @@ -565,11 +565,11 @@ "LabelExtractChaptersDuringLibraryScan": "Extrahera kapitelbildrutor vid genomsökning av biblioteket", "LabelExtractChaptersDuringLibraryScanHelp": "Om aktiverat extraheras kapitelbildrutor nĂ€r videor importeras vid genomsökning av biblioteket. Om avaktiverat kommer extrahering att ske vid schemalagd kapitelbildrutebehandling, för att snabba upp den regelbundna genomsökningen av biblioteket.", "LabelFailed": "Misslyckades", - "LabelFileOrUrl": "Fil eller url:", + "LabelFileOrUrl": "Fil eller URL:", "LabelFinish": "Klart", "LabelFont": "Typsnitt:", "LabelForgotPasswordUsernameHelp": "Skriv ditt anvĂ€ndarnamn, om du kommer ihĂ„g det.", - "LabelFriendlyName": "Visningsnamn", + "LabelFriendlyName": "Visningsnamn:", "LabelServerNameHelp": "Det hĂ€r namnet anvĂ€nds för att identifiera servern, om det lĂ€mnas tomt kommer datorns namn att anvĂ€ndas.", "LabelGroupMoviesIntoCollections": "Gruppera filmer i samlingsboxar", "LabelGroupMoviesIntoCollectionsHelp": "I filmlistor visas filmer som ingĂ„r i en samlingsbox som ett enda objekt.", @@ -579,7 +579,7 @@ "LabelHardwareAccelerationTypeHelp": "Endast tillgĂ€ngligt pĂ„ hĂ„rdvara med stöd.", "LabelHomeNetworkQuality": "HemnĂ€tverkskvalitet:", "LabelHomeScreenSectionValue": "HemskĂ€rmsdel {0}:", - "LabelHttpsPort": "Lokalt portnummer för https:", + "LabelHttpsPort": "Lokalt portnummer för HTTPS:", "LabelHttpsPortHelp": "Den lokala tcp-port som Jellyfin Server ska lyssna pĂ„ https.", "LabelIconMaxHeight": "Maxhöjd pĂ„ ikoner:", "LabelIconMaxHeightHelp": "Högsta upplösning hos ikoner som visas via upnp:icon.", @@ -607,25 +607,25 @@ "LabelLanNetworks": "LAN nĂ€tverk:", "LabelLanguage": "SprĂ„k:", "LabelLineup": "UppsĂ€ttning:", - "LabelLocalHttpServerPortNumber": "Lokalt portnummer för http:", + "LabelLocalHttpServerPortNumber": "Lokalt portnummer för HTTP:", "LabelLocalHttpServerPortNumberHelp": "Den lokala tcp-port som Jellyfin Server ska lyssna pĂ„ http.", "LabelLockItemToPreventChanges": "LĂ„s det hĂ€r objektet för att förhindra Ă€ndringar", "LabelLoginDisclaimer": "AnsvarsbegrĂ€nsning vid inloggning:", "LabelLoginDisclaimerHelp": "Detta visas lĂ€ngst ned pĂ„ inloggningssidan.", "LabelLogs": "Loggfiler:", - "LabelManufacturer": "Tillverkare", + "LabelManufacturer": "Tillverkare:", "LabelManufacturerUrl": "Tillverkarens webaddress", "LabelMatchType": "Matchningstyp:", "LabelMaxBackdropsPerItem": "Högsta antal fondbilder per objekt:", "LabelMaxChromecastBitrate": "Strömningskvalitet för Chromecast:", - "LabelMaxParentalRating": "Högsta tillĂ„tna Ă„ldersgrĂ€ns", - "LabelMaxResumePercentage": "Högsta grĂ€ns för Ă„terupptagande (%)", - "LabelMaxResumePercentageHelp": "Objekt betraktas som fĂ€rdigspelade om uppspelningen stoppas efter denna tidpunkt", + "LabelMaxParentalRating": "Högsta tillĂ„tna Ă„ldersgrĂ€ns:", + "LabelMaxResumePercentage": "Högsta grĂ€ns för Ă„terupptagande i procent:", + "LabelMaxResumePercentageHelp": "Objekt betraktas som fĂ€rdigspelade om uppspelningen stoppas efter denna tidpunkt.", "LabelMaxScreenshotsPerItem": "Högsta antal skĂ€rmdumpar per objekt:", "LabelMaxStreamingBitrate": "Maximal strömningskvalite:", "LabelMaxStreamingBitrateHelp": "Ange högsta bithastighet för strömning.", - "LabelMessageText": "Meddelandetext", - "LabelMessageTitle": "Meddelandetitel", + "LabelMessageText": "Meddelandetext:", + "LabelMessageTitle": "Meddelandetitel:", "LabelMetadataDownloadLanguage": "Önskat sprĂ„k:", "LabelMetadataDownloadersHelp": "Aktivera och rangordna dina hĂ€mtare baserat pĂ„ prioritet. LĂ€gre prioriterade hĂ€mtare anvĂ€nds endast för att fylla i saknad information.", "LabelMetadataPath": "Plats för metadata:", @@ -636,10 +636,10 @@ "LabelMetadataSaversHelp": "VĂ€lj de filformat du vill anvĂ€nda för att spara dina metadata.", "LabelMethod": "Metod:", "LabelMinBackdropDownloadWidth": "HĂ€mta enbart fondbilder bredare Ă€n:", - "LabelMinResumeDuration": "Minsta tid för Ă„terupptagande (s)", - "LabelMinResumeDurationHelp": "Objekt med speltid kortare Ă€n sĂ„ hĂ€r kan ej Ă„terupptas", - "LabelMinResumePercentage": "LĂ€gsta grĂ€ns för Ă„terupptagande (%)", - "LabelMinResumePercentageHelp": "Objekt betraktas som ej spelade om uppspelningen stoppas före denna tidpunkt", + "LabelMinResumeDuration": "Minsta tid för Ă„terupptagande:", + "LabelMinResumeDurationHelp": "Objekt med speltid kortare Ă€n sĂ„ hĂ€r kan ej Ă„terupptas.", + "LabelMinResumePercentage": "LĂ€gsta grĂ€ns för Ă„terupptagande i procent:", + "LabelMinResumePercentageHelp": "Objekt betraktas som ej spelade om uppspelningen stoppas före denna tidpunkt.", "LabelMinScreenshotDownloadWidth": "HĂ€mta enbart skĂ€rmdumpar bredare Ă€n:", "LabelModelDescription": "Modellbeskrivning", "LabelModelName": "Modellnamn", @@ -648,10 +648,10 @@ "LabelMonitorUsers": "Övervaka aktivitet frĂ„n:", "LabelMovieCategories": "Filmkategorier:", "LabelMoviePrefix": "Film prefix:", - "LabelMoviePrefixHelp": "Om ett prefix har lagts till filmertitlarna, skriv in det hĂ€r sĂ„ att Jellyfin kan hantera dessa korrekt.", + "LabelMoviePrefixHelp": "Om ett prefix har lagts till filmertitlarna, skriv in det hĂ€r sĂ„ att servern kan hantera dessa korrekt.", "LabelMovieRecordingPath": "InspelningssökvĂ€g för film (valfri):", "LabelMusicStreamingTranscodingBitrate": "Bithastighet vid omkodning av musik:", - "LabelMusicStreamingTranscodingBitrateHelp": "Ange högsta bithastighet vid strömning av musik", + "LabelMusicStreamingTranscodingBitrateHelp": "Ange högsta bithastighet vid strömning av musik.", "LabelName": "Namn:", "LabelNewName": "Nytt namn:", "LabelNewPassword": "Nytt lösenord:", @@ -660,7 +660,7 @@ "LabelNext": "NĂ€sta", "LabelNotificationEnabled": "Aktivera denna meddelandetyp", "LabelNumber": "Nr:", - "LabelNumberOfGuideDays": "Antal dagars tablĂ„ att hĂ€mta", + "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.", @@ -691,10 +691,10 @@ "LabelProtocol": "Protokoll:", "LabelProtocolInfo": "Protokollinfo:", "LabelProtocolInfoHelp": "VĂ€rde att anvĂ€nda vid svar pĂ„ GetProtocolInfo-begĂ€ran frĂ„n enheter.", - "LabelPublicHttpPort": "Publikt portnummer för http:", - "LabelPublicHttpPortHelp": "Det publika portnumret som ska mappas till den lokala porten för http.", - "LabelPublicHttpsPort": "Publikt portnummer för https:", - "LabelPublicHttpsPortHelp": "Det publika portnumret som ska mappas till den lokala porten för https.", + "LabelPublicHttpPort": "Publikt portnummer för HTTP:", + "LabelPublicHttpPortHelp": "Det publika portnumret som ska mappas till den lokala porten för HTTP.", + "LabelPublicHttpsPort": "Publikt portnummer för HTTPS:", + "LabelPublicHttpsPortHelp": "Det publika portnumret som ska mappas till den lokala porten för HTTPS.", "LabelReadHowYouCanContribute": "Se hur du kan hjĂ€lpa till.", "LabelReasonForTranscoding": "Orsak för omkodning:", "LabelRecord": "Spela in:", @@ -707,7 +707,7 @@ "LabelRuntimeMinutes": "Speltid (min):", "LabelSaveLocalMetadata": "Spara grafik till mediamapparna", "LabelSaveLocalMetadataHelp": "Om grafik sparas tillsammans med media Ă€r de enkelt Ă„tkomliga för redigering.", - "LabelScheduledTaskLastRan": "Senast körd {0}, tog {1}", + "LabelScheduledTaskLastRan": "Senast körd {0}, tog {1}.", "LabelScreensaver": "SkĂ€rmslĂ€ckare:", "LabelSeasonNumber": "SĂ€songsnummer:", "LabelSelectFolderGroups": "Gruppera automatiskt innehĂ„ll frĂ„n dessa mappar i vyer, t ex Filmer, Musik eller TV:", @@ -718,19 +718,19 @@ "LabelSerialNumber": "Serienummer", "LabelSeriesRecordingPath": "InspelningssökvĂ€g för TV-serier (valfri):", "LabelServerHost": "VĂ€rd:", - "LabelServerHostHelp": "192.168.1.100 eller https://min.server.com", - "LabelSimultaneousConnectionLimit": "BegrĂ€nsning för samtidiga strömmar", + "LabelServerHostHelp": "192.168.1.100:8096 eller https://min.server.com", + "LabelSimultaneousConnectionLimit": "BegrĂ€nsning för samtidiga strömmar:", "LabelSkin": "Skal:", "LabelSkipBackLength": "'Hoppa bakĂ„t'-lĂ€ngd:", "LabelSkipForwardLength": "'Hoppa framĂ„t'-lĂ€ngd:", - "LabelSkipIfAudioTrackPresent": "Hoppa över om det förvalda ljudspĂ„rets sprĂ„k Ă€r samma som det hĂ€mtade.", + "LabelSkipIfAudioTrackPresent": "Hoppa över om det förvalda ljudspĂ„rets sprĂ„k Ă€r samma som det hĂ€mtade", "LabelSkipIfAudioTrackPresentHelp": "Bocka ur denna för att ge undertexter Ă„t alla videor oavsett ljudspĂ„rets sprĂ„k.", "LabelSkipIfGraphicalSubsPresent": "Hoppa över om videofilen redan innehĂ„ller inbĂ€ddade undertexter", "LabelSkipIfGraphicalSubsPresentHelp": "Att Ă€ven ha externa undertexter resulterar i en effektivare uppspelning och minskar risken för omkodning.", "LabelSonyAggregationFlags": "\"Aggregation flags\" för Sony:", "LabelSonyAggregationFlagsHelp": "Anger innehĂ„llet i elementet aggregationFlags i namnutrymmet urn:schemas-sonycom:av.", "LabelSortBy": "Sortera efter:", - "LabelSortOrder": "Sortering", + "LabelSortOrder": "Sortering:", "LabelSortTitle": "Sorteringstitel:", "LabelSoundEffects": "Ljudeffekter:", "LabelSource": "KĂ€lla:", @@ -745,7 +745,7 @@ "LabelSubtitles": "Undertexter:", "LabelSupportedMediaTypes": "Mediaformat som stöds:", "LabelTVHomeScreen": "HemskĂ€rm i TV-lĂ€ge:", - "LabelTag": "Etikett", + "LabelTag": "Etikett:", "LabelTagline": "Slogan:", "LabelTextBackgroundColor": "BakgrundsfĂ€rg för text:", "LabelTextColor": "TextfĂ€rg:", @@ -754,10 +754,10 @@ "LabelTime": "Tid:", "LabelTimeLimitHours": "TidsbegrĂ€nsning (timmar):", "LabelTitle": "Titel:", - "LabelTrackNumber": "SpĂ„r nr", + "LabelTrackNumber": "SpĂ„r nr:", "LabelTranscodingAudioCodec": "Ljudkodning:", "LabelTranscodingContainer": "BehĂ„llare:", - "LabelTranscodingTempPathHelp": "Denna mapp innehĂ„ller tillfĂ€lliga filer som anvĂ€nds vid omkodning. Ange en plats för dessa, eller lĂ€mna blankt för att anvĂ€nda förvald plats.", + "LabelTranscodingTempPathHelp": "Ange en egen sökvĂ€g dĂ€r omkodningar skall sparas för klienter. LĂ€mna blankt för att anvĂ€nda förvald plats.", "LabelTranscodingThreadCount": "TrĂ„dar för omkodning:", "LabelTranscodingThreadCountHelp": "VĂ€lj maximala antalet trĂ„dar som ska anvĂ€ndas vid omkodning. Att minska antalet trĂ„dar sĂ€nker cpu-belastningan men ökar Ă€ven risken att omkodning inte kan ske snabbt nog för felfri uppspelning.", "LabelTranscodingVideoCodec": "Videokodning:", @@ -799,7 +799,7 @@ "MarkUnplayed": "Markera som ospelad", "MaxParentalRatingHelp": "InnehĂ„ll med högre grĂ€ns visas ej för den hĂ€r anvĂ€ndaren.", "MediaInfoAnamorphic": "Anamorfisk", - "MediaInfoAspectRatio": "BildförhĂ„llande:", + "MediaInfoAspectRatio": "BildförhĂ„llande", "MediaInfoBitDepth": "FĂ€rgdjup", "MediaInfoBitrate": "Bithastighet", "MediaInfoChannels": "Kanaler", @@ -832,7 +832,7 @@ "MessageConfirmRemoveMediaLocation": "Är du sĂ€ker pĂ„ att du vill ta bort den hĂ€r platsen?", "MessageConfirmRestart": "Är du sĂ€ker pĂ„ att du vill starta om Jellyfin server?", "MessageConfirmRevokeApiKey": "Är du sĂ€ker pĂ„ att du vill Ă„terkalla den hĂ€r api-nyckeln? Applikationens koppling till Jellyfin Server kommer avslutas abrupt.", - "MessageConfirmShutdown": "Är du sĂ€ker pĂ„ att du vill stĂ€nga av Jellyfin server?", + "MessageConfirmShutdown": "Är du sĂ€ker pĂ„ att du vill stĂ€nga av servern?", "MessageContactAdminToResetPassword": "VĂ€nligen kontakta din systemadministratör för att Ă„terstĂ€lla ditt lösenord.", "MessageCreateAccountAt": "Skapa ett konto pĂ„ {0}", "MessageDeleteTaskTrigger": "Vill du ta bort denna aktivitetsutlösare?", @@ -856,27 +856,27 @@ "MessageNoTrailersFound": "Hittade inga trailers. 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 Jellyfin Server administratör för mer information.", + "MessagePlayAccessRestricted": "Uppspelning av detta innehĂ„llet Ă€r för nĂ€rvarande begrĂ€nsat. Kontakta din server administratör för mer information.", "MessagePleaseEnsureInternetMetadata": "Var god se till att hĂ€mtning av metadata via Internet Ă€r aktiverad.", "MessagePleaseWait": "VĂ€nligen vĂ€nta. Detta kan ta ett tag.", "MessagePluginConfigurationRequiresLocalAccess": "Logga in pĂ„ din din lokala Jellyfin Server för att konfigurera det hĂ€r tillĂ€gget.", "MessagePluginInstallDisclaimer": "TillĂ€gg skapade av Jellyfin-anvĂ€ndare Ă€r ett bra sĂ€tt att förbĂ€ttra din Jellyfin-upplevelse med ytterligare funktionalitet. Observera att detta kan pĂ„verka din Jellyfin-server sĂ„ som lĂ€ngre tidsĂ„tgĂ„ng för biblioteksskanningar, ytterligare bakgrundsprocesser och minskad systemstabilitet.", "MessageReenableUser": "Se nedan för att aktivera igen", "MessageSettingsSaved": "InstĂ€llningarna har sparats.", - "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Följande mediaplatser kommer att tas bort frĂ„n ditt Jellyfin bibliotek:", + "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Följande mediaplatser kommer att tas bort frĂ„n ditt bibliotek:", "MessageUnableToConnectToServer": "Vi kunde inte upprĂ€tta anslutning till vald server just nu. FörsĂ€kra dig om att den Ă€r pĂ„slagen och försök igen.", "MessageUnsetContentHelp": "InnehĂ„ll kommer visas som enkla mappar. För bĂ€sta resultat, anvĂ€nd en metadata-hanterare för att stĂ€lla in typ av innehĂ„ll för undermapparna.", "MessageYouHaveVersionInstalled": "Version {0} Ă€r installerad.", "MetadataManager": "Metadata-hanteraren", "MinutesAfter": "minuter efter", "MinutesBefore": "minuter före", - "Mobile": "Mobil / Platta", + "Mobile": "Mobil", "Monday": "MĂ„ndag", "MoreFromValue": "Mer frĂ„n {0}", "MoreUsersCanBeAddedLater": "Flera anvĂ€ndare kan skapas senare i Kontrollpanelen.", "MoveLeft": "VĂ€nster", "MoveRight": "Höger", - "MovieLibraryHelp": "LĂ€s om {0}Jellyfins namngivningsguide för filmer{1}.", + "MovieLibraryHelp": "LĂ€s om {0} namngivningsguide för filmer{1}.", "Movies": "Filmer", "Mute": "Tyst", "MySubtitles": "Mina undertexter", @@ -902,7 +902,7 @@ "OneChannel": "En kanal", "OnlyForcedSubtitles": "Endast tvingande undertexter", "OnlyForcedSubtitlesHelp": "Endast undertexter markerade som tvingande kommer att laddas.", - "OnlyImageFormats": "Endast image-format (VOBSUB, PGS, SUB/IDX, etc.)", + "OnlyImageFormats": "Endast image-format (VOBSUB, PGS, SUB, etc)", "OptionAdminUsers": "Administratörer", "OptionAlbumArtist": "Albumartist", "OptionAllUsers": "Alla anvĂ€ndare", @@ -919,7 +919,7 @@ "OptionAllowRemoteSharedDevicesHelp": "DLNA-enheter betraktas som delade tills en anvĂ€ndare börjar kontrollera den.", "OptionAllowSyncTranscoding": "TillĂ„t nedladdning som krĂ€ver omkodning", "OptionAllowUserToManageServer": "TillĂ„t denna anvĂ€ndare att administrera servern", - "OptionAllowVideoPlaybackRemuxing": "TillĂ„t videouppspelning som krĂ€ver konvertering utan omkodning.", + "OptionAllowVideoPlaybackRemuxing": "TillĂ„t videouppspelning som krĂ€ver konvertering utan omkodning", "OptionAllowVideoPlaybackTranscoding": "TillĂ„t videouppspelning som krĂ€ver omkodning", "OptionAscending": "Stigande", "OptionAutomaticallyGroupSeries": "SlĂ„ ihop serier automatiskt som ligger utspritt under flera kataloger", @@ -936,7 +936,7 @@ "OptionCriticRating": "Kritikerbetyg", "OptionCustomUsers": "Anpassad", "OptionDaily": "Dagligen", - "OptionDateAdded": "Inlagd den", + "OptionDateAdded": "Tillagd den", "OptionDateAddedFileTime": "AnvĂ€nd datum dĂ„ filen skapades", "OptionDateAddedImportTime": "AnvĂ€nd datum för inlĂ€sning i biblioteket", "OptionDatePlayed": "Senast visad", @@ -945,7 +945,7 @@ "OptionDisableUserHelp": "SpĂ€rrade anvĂ€ndare tillĂ„ts ej kontakta servern. Eventuella pĂ„gĂ„ende anslutningar avbryts omedelbart.", "OptionDislikes": "Ogillar", "OptionDisplayFolderView": "Visa en mappvy för att visa enkla mediamappar", - "OptionDisplayFolderViewHelp": "Vid aktivering kommer Jellyfinappar att visa en Mappkategori intill ditt mediabibliotek. Detta Ă€r anvĂ€ndbart om du har enkla mappvyer.", + "OptionDisplayFolderViewHelp": "Visa mappar jĂ€msides med dina andra media bibliotek. Detta kan vara bra om du vill ha en enkel mapp visning.", "OptionDownloadArtImage": "Grafik", "OptionDownloadBackImage": "Baksida", "OptionDownloadBannerImage": "Banderoll", @@ -975,14 +975,14 @@ "OptionExtractChapterImage": "Aktivera extrahering av kapitelbilder", "OptionFavorite": "Favoriter", "OptionFriday": "Fredag", - "OptionHasSpecialFeatures": "Extramaterial:", + "OptionHasSpecialFeatures": "Extramaterial", "OptionHasSubtitles": "Undertexter", "OptionHasThemeSong": "Ledmotiv", "OptionHasThemeVideo": "Temavideo", "OptionHideUser": "Visa inte den hĂ€r anvĂ€ndaren pĂ„ inloggningssidorna", "OptionHideUserFromLoginHelp": "AnvĂ€ndbart för privata konton eller gömda administratörskonton. AnvĂ€ndaren beöver logga in manuellt genom att skriva sitt anvĂ€ndarnamn och lösenord.", "OptionHlsSegmentedSubtitles": "HLS-segmenterade undertexter", - "OptionHomeVideos": "Hemvideos & foton", + "OptionHomeVideos": "Foton", "OptionIgnoreTranscodeByteRangeRequests": "Ignorera begĂ€ran om \"byte range\" vid omkodning", "OptionIgnoreTranscodeByteRangeRequestsHelp": "Om aktiverad kommer begĂ€ran att uppfyllas, men \"byte range\"-rubriken ignoreras.", "OptionImdbRating": "Betyg pĂ„ IMDB", @@ -1082,7 +1082,7 @@ "Record": "Spela in", "RecordSeries": "Spela in serie", "RecordingCancelled": "Inspelning avbruten.", - "RecordingScheduled": "Inspelning schemalagd", + "RecordingScheduled": "Inspelning schemalagd.", "Recordings": "Inspelningar", "Refresh": "Uppdatera", "RefreshDialogHelp": "Metadata uppdateras baserat pĂ„ instĂ€llningar och internettjĂ€nster som har aktiverats under Jellyfin servers kontrollpanel.", @@ -1182,7 +1182,7 @@ "TabMusicVideos": "Musikvideor", "TabMyPlugins": "Mina tillĂ€gg", "TabNetworks": "TV-bolag", - "TabNfoSettings": "nfo-instĂ€llingar", + "TabNfoSettings": "NFO-instĂ€llingar", "TabNotifications": "Meddelanden", "TabOther": "Övrigt", "TabParentalControl": "FörĂ€ldralĂ„s", @@ -1195,7 +1195,7 @@ "TabProfiles": "Profiler", "TabRecordings": "Inspelningar", "TabResponses": "Svar", - "TabResumeSettings": "Återuppta-instĂ€llningar", + "TabResumeSettings": "Återuppta", "TabScheduledTasks": "Schemalagda aktiviteter", "TabSeries": "Serie", "TabSettings": "InstĂ€llningar", @@ -1209,7 +1209,7 @@ "Tags": "Etiketter", "TagsValue": "Etiketter: {0}", "TellUsAboutYourself": "BerĂ€tta om dig sjĂ€lv", - "ThemeSongs": "Vinjetter", + "ThemeSongs": "Signaturmelodier", "ThemeVideos": "Temavideos", "TheseSettingsAffectSubtitlesOnThisDevice": "Dessa instĂ€llningar pĂ„verkar undertexter pĂ„ den hĂ€r enheten", "ThisWizardWillGuideYou": "Den hĂ€r guiden hjĂ€lper dig att göra de första instĂ€llningarna. För att börja var vĂ€nlig vĂ€lj önskat sprĂ„k.", @@ -1221,7 +1221,7 @@ "TrackCount": "{0} spĂ„r", "Transcoding": "Omkodning", "Tuesday": "Tisdag", - "TvLibraryHelp": "LĂ€s om {0}Jellyfins namngivningsguide för TV-serier{1}.", + "TvLibraryHelp": "LĂ€s om {0} namngivningsguide för TV-serier{1}.", "UninstallPluginConfirmation": "Är du sĂ€ker pĂ„ att du vill avinstallera {0}?", "UninstallPluginHeader": "Avinstallera tillĂ€gg", "Unmute": "Muting av", @@ -1257,13 +1257,13 @@ "Watched": "Sedd", "Wednesday": "Onsdag", "WelcomeToProject": "VĂ€lkommen till Jellyfin!", - "WizardCompleted": "Det Ă€r allt vi behöver veta just nu. Jellyfin Server har börjat samla information om ditt mediabibliotek. Kolla in nĂ„gra av vĂ„ra appar och klicka sedan pĂ„ Avsluta för att se kontrollpanelen.", + "WizardCompleted": "Det Ă€r allt vi behöver veta just nu. Jellyfin har börjat samla information om ditt mediabibliotek. Kolla in nĂ„gra av vĂ„ra appar och klicka sedan pĂ„ Avsluta för att se kontrollpanelen.", "Writer": "Manusförfattare", - "XmlDocumentAttributeListHelp": "Dessa attribut tillĂ€mpas pĂ„ rotelementet i alla xml-svar.", + "XmlDocumentAttributeListHelp": "Dessa attribut tillĂ€mpas pĂ„ rotelementet i alla XML-svar.", "XmlTvKidsCategoriesHelp": "Program med dessa kategorier kommer visas som program för barn. Separerade med '|'.", "XmlTvMovieCategoriesHelp": "Program med dessa kategorier kommer visas som filmer. Separerade med '|'.", "XmlTvNewsCategoriesHelp": "Program med dessa kategorier kommer visas som nyhetsprogram. Separerade med '|'.", - "XmlTvPathHelp": "En sökvĂ€g till en xml-fil för tv. Jellyfin kommer lĂ€sa in den hĂ€r filen och regelbundet leta efter uppdateringar. Du Ă€r sjĂ€lv ansvarig för att skapa och uppdatera filen.", + "XmlTvPathHelp": "En sökvĂ€g till en XML-fil för tv. Jellyfin kommer lĂ€sa in den hĂ€r filen och regelbundet leta efter uppdateringar. Du Ă€r sjĂ€lv ansvarig för att skapa och uppdatera filen.", "XmlTvSportsCategoriesHelp": "Program med dessa kategorier kommer visas som sportprogram. Separerade med '|'.", "Yes": "Ja", "Yesterday": "IgĂ„r", @@ -1276,8 +1276,8 @@ "GenreValue": "Genre: {0}", "General": "AllmĂ€nt", "FastForward": "Snabbspola", - "Extras": "Mer", - "ErrorAddingXmlTvFile": "Det uppstod ett problem vid lĂ€sningen av XmlTV filen. Kontrollera att filen Ă€r tillgĂ€nglig och försök igen.", + "Extras": "Extramaterial", + "ErrorAddingXmlTvFile": "Det uppstod ett problem vid lĂ€sningen av XMLTV filen. Kontrollera att filen Ă€r tillgĂ€nglig och försök igen.", "ErrorAddingListingsToSchedulesDirect": "Det uppstod ett problem nĂ€r din lista skulle lĂ€ggas till pĂ„ ditt Schedules Direct konto. Schedules Direct tillĂ„ter bara ett begrĂ€nsat antal listor per konto. Du kanske behöver logga in pĂ„ Schedules Direct hemsidan och ta bort andras listningar frĂ„n ditt konto innan du fortsĂ€tter.", "EnableStreamLoopingHelp": "Aktivera enbart detta om direktsĂ€ndningen enbart innehĂ„ller nĂ„gra sekunders data och behöver bli kontinuerligt uppdaterad. Att aktivera denna funktion i onödan kan skapa problem.", "EnableStreamLooping": "Loopa direktsĂ€ndningar", @@ -1294,12 +1294,12 @@ "ButtonGuide": "Guide", "Blacklist": "Svartlista", "Auto": "Automatisk", - "AuthProviderHelp": "VĂ€lj en autentiseringsleverantör för att autentisera denna anvĂ€ndares lösenord.", + "AuthProviderHelp": "VĂ€lj en autentiserings leverantör som ska anvĂ€ndas för att autentisera denna anvĂ€ndarens lösenord.", "Ascending": "Stigande", "AllowedRemoteAddressesHelp": "KommaavgrĂ€nsad lista av IP-adresser eller IP/nĂ€tmask poster för nĂ€tverk som kommer bli tillĂ„tna att ansluta avlĂ€gset. Om fĂ€ltet lĂ€mnas tomt sĂ„ kommer alla avlĂ€gsna adresser tillĂ„tas.", "AllowMediaConversionHelp": "TillĂ„t eller neka tillgĂ„ng till media konvertings funktionen.", "AllowMediaConversion": "TillĂ„t media konvertering", - "Alerts": "Notiser", + "Alerts": "Alarm", "HeaderMedia": "Media", "HeaderHome": "Hem", "HeaderFavoriteVideos": "Favoritvideor", @@ -1313,12 +1313,12 @@ "CopyStreamURLSuccess": "URL har kopierats.", "CopyStreamURL": "Kopiera Stream URL", "FetchingData": "HĂ€mtar ytterligare data", - "HeaderFetcherSettings": "HĂ€mtarinstĂ€llningar", - "ButtonAddImage": "LĂ€gg till bild", + "HeaderFetcherSettings": "HĂ€mtar instĂ€llningar", + "ButtonAddImage": "LĂ€gg till Bild", "HeaderStopRecording": "Stoppa inspelning", - "HeaderImageOptions": "BildinstĂ€llningar", - "Absolute": "Absolut", - "HeaderFavoritePeople": "Favoritpersoner", + "HeaderImageOptions": "Bildalternativ", + "Absolute": "komplett", + "HeaderFavoritePeople": "FavoritmĂ€nniskor", "HeaderRestartingServer": "Startar om server", "HeaderStatus": "Status", "LabelPostProcessor": "Program för efterbehandling:", @@ -1327,17 +1327,144 @@ "LabelMetadata": "Metadata:", "LabelFormat": "Format:", "LabelFolder": "Mapp:", - "LabelBaseUrl": "Grund URL:", + "LabelBaseUrl": "Bas-RL:", "LabelAuthProvider": "Autentiseringsleverantör:", "LabelAudioCodec": "Ljudkodek:", "LabelAudioChannels": "Ljudkanaler:", "LabelAllowedRemoteAddressesMode": "FjĂ€rr-IP-adressfilterlĂ€ge:", "LabelAllowedRemoteAddresses": "FjĂ€rr-IP-adressfilter:", "HttpsRequiresCert": "För att aktivera sĂ€kra anslutningar mĂ„ste du tillhandahĂ„lla ett pĂ„litligt SSL-certifikat, till exempel \"Let's Encrypt\". VĂ€nligen ange ett certifikat eller inaktivera sĂ€kra anslutningar.", - "HeaderTypeImageFetchers": "{0} BildhĂ€mtare", + "HeaderTypeImageFetchers": "BildhĂ€mtare", "HeaderLiveTvTunerSetup": "StĂ€ll in Live-TV-mottagare", "ButtonSplit": "Dela upp", "LabelCache": "Cache:", "LabelAlbum": "Album:", - "HeaderVideos": "Videor" + "HeaderVideos": "Videor", + "LabelBitrate": "Bithastighet:", + "LabelStreamType": "Stream typ:", + "LabelStatus": "Status:", + "LabelSize": "Storlek:", + "LabelServerName": "Server namn:", + "LabelSecureConnectionsMode": "SĂ€ker uppkopplings lĂ€ge:", + "EnableFastImageFadeInHelp": "Aktivera snabbare fade-in animationer för laddade bilder", + "EnableFastImageFadeIn": "Snabb bild fade-in", + "LabelPostProcessorArgumentsHelp": "AnvĂ€nd {path} som sökvĂ€g till inspelade filen.", + "LabelPostProcessorArguments": "Post-processor kommandoradsargument:", + "LabelDroppedFrames": "Tappade ramar:", + "LabelAudioSampleRate": "Ljudprovfrekvens:", + "LabelAudioBitrate": "Ljudbithastighet:", + "LabelAudioBitDepth": "Ljudbitdjup:", + "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.", + "LabelCorruptedFrames": "Skadade ramar:", + "HeaderParentalRatings": "FörĂ€ldrabetyg", + "HeaderNavigation": "Navigering", + "HeaderBranding": "MĂ€rke", + "CopyStreamURLError": "Det vart ett fel vid kopiering av URL.", + "AskAdminToCreateLibrary": "FrĂ„ga en administratör för att skapa ett bibliotek.", + "Whitelist": "Vitlista", + "VideoRange": "Video rĂ€ckvidd", + "ValueOneAlbum": "1 album", + "ValueMinutes": "{0} min", + "ValueContainer": "BehĂ„llare: {0}", + "UserAgentHelp": "Stöd en egen user-agent HTTP rubrik.", + "Uniform": "Enhetlig", + "Trailers": "Trailers", + "TabTrailers": "Trailers", + "TabServer": "Server", + "TabNetworking": "NĂ€tverk", + "TabMetadata": "Metadata", + "TabInfo": "Info", + "TabAccess": "TillgĂ„ng", + "TV": "TV", + "SubtitleOffset": "Undertext justering", + "Smart": "Smart", + "Smaller": "Mindre", + "ShowAdvancedSettings": "Visa avancerade instĂ€llningar", + "SeriesDisplayOrderHelp": "Ordna avsnitt via sĂ€ndnings datum, DVD ordning, eller absolut numrering.", + "SelectAdminUsername": "VĂ€nligen vĂ€lj ett anvĂ€ndarnamn för admin kontot.", + "SaveSubtitlesIntoMediaFoldersHelp": "Spara undertexter vid video filer kommer göra det mer enklare att hantera.", + "Rewind": "Spola tillbaka", + "RequiredForAllRemoteConnections": "KrĂ€vs för alla fjĂ€rr kopplingar", + "RecordingPathChangeMessage": "Ändring av din inspelnings mapp kommer inte migrera existerande inspelningar frĂ„n gamla platsen till den nya. Du behöver flytta dom manuellt om sĂ„ önskas.", + "PreferredNotRequired": "Föredragen, men inte krĂ€vande", + "PlaybackData": "Uppspelnings Data", + "PasswordResetProviderHelp": "VĂ€lj en Lösenords ÅterstĂ€llnings Provider att anvĂ€nda nĂ€r denna anvĂ€ndare begĂ€r att Ă„terstĂ€lla lösenordet", + "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", + "OptionRegex": "Regex", + "OptionRandom": "SlumpmĂ€ssig", + "OptionProtocolHttp": "HTTP", + "OptionProfileVideo": "Video", + "OptionPosterCard": "Omslags kort", + "OptionPoster": "Omslag", + "OptionMax": "Max", + "OptionLoginAttemptsBeforeLockoutHelp": "Ett vĂ€rde av noll menas att anvĂ€nda standard av tre försök för normala anvĂ€ndare och fem för administratörer. -1 kommer att stĂ€nga av denna funktion.", + "OptionLoginAttemptsBeforeLockout": "Avgör hur mĂ„nga felaktiga inloggnings försök som kan utföras innan kontot lĂ„ses.", + "OptionList": "List", + "OptionIsSD": "SD", + "OptionIsHD": "HD", + "OptionHasTrailer": "Trailer", + "OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)", + "OptionBlockTrailers": "Trailers", + "OptionBanner": "Banner", + "OptionAutomatic": "Auto", + "OptionAuto": "Auto", + "OptionArtist": "Artist", + "OptionForceRemoteSourceTranscoding": "Tvinga omkodning pĂ„ fjĂ€rr media kĂ€llor (som LiveTV)", + "OptionAlbum": "Album", + "Option3D": "3D", + "Normal": "Normal", + "NoCreatedLibraries": "Ser ut som du inte har skapat nĂ„gra bibliotek Ă€n. {0}Vill du skapa ett nu?{1}", + "NextUp": "NĂ€sta pĂ„ tur", + "MusicVideo": "Musik Video", + "MusicLibraryHelp": "Granska {0}musik döpnings guiden{1}.", + "MusicArtist": "Musik Artist", + "MusicAlbum": "Musik Album", + "MoreMediaInfo": "Media Info", + "MetadataSettingChangeHelp": "Ändring av metadata instĂ€llningar kommer att ske pĂ„ nytt innehĂ„ll som Ă€r tillagt framledes. För att uppdatera existerat innehĂ„ll, öppna detalj skĂ€rmen och tryck pĂ„ uppdatera knappen, eller utför bulk uppdateringar med metadata hanteraren.", + "Metadata": "Metadata", + "MessageNoServersAvailable": "Inga servrar har hittats med automatiska server sökningen.", + "MessageNoCollectionsAvailable": "Samlingar tillĂ„ter dig att njuta av personlig gruppering av Filmer, Serier och Albums. Tryck pĂ„ + knapen för att skapa samlingar.", + "MessageImageTypeNotSelected": "VĂ€nligen vĂ€lj en bild typ frĂ„n rullningslisten.", + "MessageImageFileTypeAllowed": "Endast JPEG och PNG filer stöds.", + "MessageConfirmAppExit": "Vill du avsluta?", + "MediaInfoStreamTypeVideo": "Video", + "MediaInfoStreamTypeSubtitle": "Undertext", + "MediaInfoStreamTypeEmbeddedImage": "InbĂ€ddad Bild", + "MediaInfoStreamTypeData": "Data", + "MediaInfoStreamTypeAudio": "Ljud", + "MediaInfoSoftware": "Mjukvara", + "MediaInfoLayout": "Design", + "MediaInfoContainer": "BehĂ„llare", + "ManageLibrary": "Hantera bibliotek", + "Live": "Live", + "LeaveBlankToNotSetAPassword": "Du kan lĂ€mna detta fĂ€lt tomt för att inte ange lösenord.", + "LaunchWebAppOnStartupHelp": "Öppna webb klient i din standard webblĂ€sare nĂ€r servern startas. Detta kommer inte ske nĂ€r du anvĂ€nder starta om servern funktionen.", + "LaunchWebAppOnStartup": "Starta webb grĂ€nssnitt nĂ€r servern startas", + "LanNetworksHelp": "Kommatecken separerad lista pĂ„ IP adresser eller IP/nĂ€tmask inlĂ€gg för nĂ€tverk som anses vara pĂ„ lokala nĂ€tverket för att tvinga fram bandbredd begrĂ€nsningar. Om angett, alla andra IP adresser kommer att anses vara pĂ„ ett externt nĂ€tverk och kommer tilldelas till det externa bandbredd begrĂ€nsningarna. Om lĂ€mnat tomt, endast serverns subnet anses vara pĂ„ det lokala nĂ€tverket.", + "LabelXDlnaDoc": "X-DLNA doc:", + "LabelXDlnaCap": "X-DLNA cap:", + "LabelWeb": "Webb:", + "LabelVideoResolution": "Video upplösning:", + "LabelVideoCodec": "Video codec:", + "LabelVideoBitrate": "Video bitrate:", + "LabelVideo": "Video:", + "DashboardArchitecture": "Arkitektur: {0}", + "DashboardOperatingSystem": "Operativsystem: {0}", + "DashboardServerName": "Server: {0}", + "DashboardVersionNumber": "Version: {0}", + "LabelVersion": "Version:", + "LabelUserLoginAttemptsBeforeLockout": "Felaktiga inloggnings försök innan anvĂ€ndare blir utelĂ„st:", + "LabelUserAgent": "AnvĂ€ndar agent:", + "LabelTypeText": "Text", + "LabelTypeMetadataDownloaders": "{0} metadata nerladdare:", + "LabelTranscodingProgress": "Omkodning progress:", + "LabelTranscodingFramerate": "Omkodning framerate:", + "LabelTranscodes": "Omkodningar:", + "LabelTranscodePath": "Omkodning sökvĂ€g:" } diff --git a/src/strings/vi.json b/src/strings/vi.json index 9cb4b4849..e32272bda 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -118,5 +118,123 @@ "UninstallPluginHeader": "Gụ bỏ Plugin", "AccessRestrictedTryAgainLater": "Truy cáș­p hiện đang háșĄn cháșż. HĂŁy thá»­ láșĄi sau.", "AddToCollection": "ThĂȘm vĂ o bộ sưu táș­p", - "Actor": "Diễn viĂȘn" + "Actor": "Diễn viĂȘn", + "ButtonRevoke": "Thu hồi", + "ButtonResume": "Tiáșżp tỄc", + "ButtonRestart": "Khởi động láșĄi", + "ButtonResetEasyPassword": "Đáș·t láșĄi mĂŁ pin nhanh", + "ButtonRepeat": "Láș·p láșĄi", + "ButtonRename": "Đổi tĂȘn", + "ButtonRefreshGuideData": "LĂ m mới dữ liệu hướng dáș«n", + "ButtonRefresh": "LĂ m mới", + "ButtonQuickStartGuide": "Hướng dáș«n nhanh", + "ButtonProfile": "Hồ sÆĄ", + "ButtonPreviousTrack": "BĂ i trước", + "ButtonPlay": "ChÆĄi", + "ButtonPause": "TáșĄm dừng", + "ButtonParentalControl": "Kiểm soĂĄt cá»§a cha máșč", + "ButtonOpen": "Mở", + "ButtonOff": "TáșŻt", + "ButtonNextTrack": "Tiáșżp theo", + "ButtonNetwork": "MáșĄng", + "ButtonMore": "ThĂȘm", + "ButtonManualLogin": "Đăng nháș­p thá»§ cĂŽng", + "ButtonLibraryAccess": "Truy cáș­p thư viện", + "ButtonLearnMore": "TĂŹm hiểu thĂȘm", + "ButtonInfo": "ThĂŽng tin", + "ButtonHome": "Trang chá»§", + "ButtonHelp": "GiĂșp đụ", + "ButtonGuide": "Hướng dáș«n", + "ButtonGotIt": "Hiểu rồi", + "ButtonFullscreen": "ToĂ n mĂ n hĂŹnh", + "ButtonForgotPassword": "QuĂȘn máș­t kháș©u", + "ButtonFilter": "Lọc", + "ButtonEditOtherUserPreferences": "Chỉnh sá»­a hồ sÆĄ, hĂŹnh áșŁnh vĂ  sở thĂ­ch cĂĄ nhĂąn.", + "ButtonEditImages": "Sá»­a hĂŹnh áșŁnh", + "ButtonEdit": "Sá»­a", + "ButtonDownload": "TáșŁi", + "ButtonDown": "Xuống", + "ButtonDelete": "XoĂĄ", + "ButtonConnect": "Káșżt nối", + "ButtonChangeServer": "Đổi mĂĄy chá»§", + "ButtonBack": "LĂči", + "ButtonAudioTracks": "Track Ăąm thanh", + "ButtonArrowUp": "LĂȘn", + "ButtonArrowRight": "PháșŁi", + "ButtonArrowLeft": "TrĂĄi", + "ButtonArrowDown": "Xuống", + "ButtonAddServer": "ThĂȘm mĂĄy chá»§", + "ButtonAddScheduledTaskTrigger": "ThĂȘm kĂ­ch hoáșĄt", + "ButtonAddMediaLibrary": "ThĂȘm thư viện Media", + "ButtonAddImage": "ThĂȘm hĂŹnh áșŁnh", + "BurnSubtitlesHelp": "XĂĄc định xem mĂĄy chá»§ cĂł ghi phỄ đề khi chuyển đổi video hay khĂŽng tĂčy thuộc vĂ o định dáșĄng phỄ đề. TrĂĄnh ghi trong phỄ đề sáșœ cáșŁi thiện hiệu suáș„t mĂĄy chá»§. Chọn Tá»± động để ghi hĂŹnh áșŁnh dá»±a trĂȘn cĂĄc định dáșĄng (VOBSUB, PGS, SUB / IDX, v.v.) vĂ  phỄ đề ASS/SSA nháș„t định.", + "Browse": "Duyệt", + "BoxRear": "Hộp (máș·t sau)", + "Books": "SĂĄch", + "BookLibraryHelp": "Âm thanh vĂ  sĂĄch văn báșŁn Ä‘Æ°á»Łc hỗ trợ. Xem láșĄi {0}hướng dáș«n đáș·t tĂȘn sĂĄch{1}.", + "Blacklist": "Danh sĂĄch đen", + "BirthPlaceValue": "NÆĄi sinh: {0}", + "BirthLocation": "NÆĄi sinh", + "BirthDateValue": "Sinh năm: {0}", + "Backdrops": "PhĂŽng nền", + "Backdrop": "PhĂŽng nền", + "AutoBasedOnLanguageSetting": "Tá»± động (dá»±a trĂȘn cĂ i đáș·t ngĂŽn ngữ)", + "Auto": "Tá»± động", + "AuthProviderHelp": "Chọn NhĂ  cung cáș„p xĂĄc thá»±c sáșœ Ä‘Æ°á»Łc sá»­ dỄng để xĂĄc thá»±c máș­t kháș©u người dĂčng nĂ y.", + "Audio": "Âm thanh", + "AttributeNew": "TáșĄo mới", + "AspectRatio": "Tá»· lệ khung hĂŹnh", + "AskAdminToCreateLibrary": "YĂȘu cáș§u quáșŁn trị viĂȘn táșĄo thư viện.", + "Ascending": "Tăng dáș§n", + "AsManyAsPossible": "CĂ ng nhiều cĂ ng tốt", + "Artists": "Nghệ SÄ©", + "AroundTime": "Xunh quanh {0}", + "Anytime": "Báș„t cứ lĂșc nĂ o", + "AnyLanguage": "Báș„t kỳ ngĂŽn ngữ", + "AlwaysPlaySubtitlesHelp": "PhỄ đề phĂč hợp với sở thĂ­ch ngĂŽn ngữ sáșœ Ä‘Æ°á»Łc táșŁi báș„t kể ngĂŽn ngữ Ăąm thanh.", + "AlwaysPlaySubtitles": "LuĂŽn hiển thị phỄ đề", + "AllowedRemoteAddressesHelp": "Danh sĂĄch địa chỉ IP Ä‘Æ°á»Łc phĂąn tĂĄch báș±ng dáș„u pháș©y hoáș·c cĂĄc mỄc IP/netmask cho cĂĄc máșĄng sáșœ Ä‘Æ°á»Łc phĂ©p káșżt nối từ xa. Náșżu để trống, táș„t cáșŁ cĂĄc địa chỉ sáșœ Ä‘Æ°á»Łc cho phĂ©p.", + "AllowRemoteAccessHelp": "Náșżu khĂŽng Ä‘Æ°á»Łc chọn, táș„t cáșŁ cĂĄc káșżt nối từ xa sáșœ bị cháș·n.", + "AllowRemoteAccess": "Cho phĂ©p káșżt nối từ xa đáșżn MĂĄy chá»§ Jellyfin.", + "AllowOnTheFlySubtitleExtractionHelp": "PhỄ đề nhĂșng cĂł thể Ä‘Æ°á»Łc trĂ­ch xuáș„t từ video vĂ  dĂčng như văn báșŁn thuáș§n tĂșy để giĂșp ngăn cháș·n chuyển mĂŁ video. TrĂȘn một số hệ thống, việc nĂ y cĂł thể máș„t nhiều thời gian vĂ  khiáșżn quĂĄ trĂŹnh phĂĄt video bị đình trệ trong quĂĄ trĂŹnh trĂ­ch xuáș„t. VĂŽ hiệu hĂła điều nĂ y để cĂł phỄ đề nhĂșng Ä‘Æ°á»Łc ghi trong chuyển mĂŁ video khi chĂșng khĂŽng Ä‘Æ°á»Łc thiáșżt bị khĂĄch hỗ trợ.", + "AllowOnTheFlySubtitleExtraction": "Cho phĂ©p trĂ­ch xuáș„t phỄ đề trá»±c tiáșżp", + "AllowMediaConversionHelp": "Cáș„p hoáș·c từ chối truy cáș­p vĂ o tĂ­nh năng chuyển đổi media.", + "AllowMediaConversion": "Cho phĂ©p chuyển đổi media", + "AllowHWTranscodingHelp": "Cho phĂ©p bộ chỉnh chuyển mĂŁ stream khi đang chÆĄi. Điều nĂ y cĂł thể giĂșp giáșŁm táșŁi cá»§a mĂĄy chá»§ khi chuyển mĂŁ.", + "AllLibraries": "Táș„t cáșŁ cĂĄc thư viện", + "AllLanguages": "Táș„t cáșŁ cĂĄc ngĂŽn ngữ", + "AllEpisodes": "Táș„t cáșŁ cĂĄc táș­p phim", + "AllComplexFormats": "Táș„t cáșŁ cĂĄc định dáșĄng phức táșĄp (ASS, SSA, VOBSUB, PGS, SUB / IDX, v.v.)", + "AllChannels": "Táș„t cáșŁ cĂĄc kĂȘnh", + "Alerts": "CáșŁnh BĂĄo", + "Albums": "Albums", + "Aired": "Đã phĂĄt sĂłng", + "AirDate": "NgĂ y phĂĄt sĂłng", + "AdditionalNotificationServices": "Duyệt qua danh mỄc plugin để cĂ i đáș·t cĂĄc dịch vỄ thĂŽng bĂĄo bổ sung.", + "AddedOnValue": "Đã thĂȘm {0}", + "AddToPlaylist": "ThĂȘm vĂ o danh sĂĄch phĂĄt", + "AddToPlayQueue": "ThĂȘm vĂ o hĂ ng đợi", + "AddItemToCollectionHelp": "ThĂȘm cĂĄc mỄc vĂ o bộ sưu táș­p báș±ng cĂĄch tĂŹm kiáșżm vĂ  nháș„p chuột pháșŁi hoáș·c nháș„n vĂ o menu để thĂȘm chĂșng vĂ o bộ sưu táș­p.", + "Absolute": "Tuyệt Đối", + "ButtonSend": "Gá»­i", + "ButtonSelectView": "Chọn cháșż độ xem", + "ButtonSelectServer": "Chọn mĂĄy chá»§", + "ButtonScanAllLibraries": "QuĂ©t táș„t cáșŁ cĂĄc thư viện", + "ButtonOk": "Đồng Ý", + "ButtonShuffle": "XĂĄo trộn", + "Categories": "PhĂąn loáșĄi", + "CancelRecording": "Ngưng ghi hĂŹnh", + "ButtonWebsite": "Trang web", + "ButtonViewWebsite": "Xem trang web", + "ButtonUp": "LĂȘn", + "ButtonUninstall": "Gụ cĂ i đáș·t", + "ButtonTrailer": "TĂłm táșŻt", + "ButtonSubtitles": "PhỄ đề", + "ButtonSubmit": "Đăng", + "ButtonSplit": "TĂĄch", + "ButtonStop": "Ngưng", + "ButtonStart": "BáșŻt đáș§u", + "ButtonSignIn": "Đăng nháș­p", + "ButtonShutdown": "TáșŻt", + "ButtonSettings": "CĂ i đáș·t" } diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 4274d4efd..b71d9408c 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -247,7 +247,7 @@ "EncoderPresetHelp": "选择䞀äžȘæ›Žćż«çš„ć€Œä»„æć‡æ€§èƒœïŒŒæˆ–è€…é€‰æ‹©äž€äžȘæ›Žæ…ąçš„ć€Œä»„æć‡èŽšé‡ă€‚", "HDPrograms": "é«˜æž…èŠ‚ç›ź", "HandledByProxy": "ç”±ćć‘ä»Łç†ć€„ç†", - "HardwareAccelerationWarning": "ćŻćŠšçĄŹä»¶ćŠ é€ŸćŻèƒœćœšæŸäș›çŽŻćąƒäž‹ćŻŒè‡Žçł»ç»Ÿäžçšłćźšă€‚èŻ·çĄźèź€äœ çš„æ“äœœçł»ç»Ÿć’Œè§†éą‘é©±ćŠšçš‹ćșæ˜Żæœ€æ–°çš„ă€‚ćŠ‚æžœäœ ćœšćŒ€ćŻæ­€éĄčćŽæ’­æ”Ÿè§†éą‘äș§ç”Ÿć›°éšŸïŒŒé‚Łäčˆäœ éœ€èŠć°†æ­€é€‰éĄčèźŸçœźć›žâ€è‡Ș抹“。", + "HardwareAccelerationWarning": "ćŻćŠšçĄŹä»¶ćŠ é€ŸćŻèƒœćœšæŸäș›çŽŻćąƒäž‹ćŻŒè‡Žçł»ç»Ÿäžçšłćźšă€‚èŻ·çĄźèź€äœ çš„æ“äœœçł»ç»Ÿć’Œæ˜ŸćĄé©±ćŠšçš‹ćșæ˜Żæœ€æ–°çš„ă€‚ćŠ‚æžœäœ ćœšćŒ€ćŻæ­€éĄčćŽæ’­æ”Ÿè§†éą‘æ—¶é‡ćˆ°ć›°éšŸïŒŒé‚Łäčˆäœ éœ€èŠć°†æ­€é€‰éĄčèźŸçœźć›žâ€œæČĄæœ‰â€ă€‚", "HeaderAccessSchedule": "èźżé—źèźĄćˆ’", "HeaderAccessScheduleHelp": "戛ć»ș侀äžȘèźżé—źèźĄćˆ’ä»„é™ćˆ¶ćŻèźżé—źçš„æ—¶é—Žæź”ă€‚", "HeaderActiveDevices": "æŽ»ćŠšçš„èźŸć€‡", @@ -706,7 +706,7 @@ "LabelPublicHttpsPort": "ć…ŹćŒ€ HTTPS ç«ŻćŁć·ïŒš", "LabelPublicHttpsPortHelp": "æ˜ ć°„ćˆ°æœŹćœ° HTTPS ç«ŻćŁçš„ć…ŹćŒ€ç«ŻćŁć·ă€‚", "LabelReadHowYouCanContribute": "ć­Šäč ćŠ‚äœ•æž„ć»ș。", - "LabelReasonForTranscoding": "èœŹç çš„ćŽŸć› ïŒš", + "LabelReasonForTranscoding": "èœŹç ćŽŸć› ïŒš", "LabelRecord": "ćœ•ćˆ¶ïŒš", "LabelRecordingPath": "é»˜èź€ćœ•ćˆ¶è·ŻćŸ„ïŒš", "LabelRecordingPathHelp": "æŒ‡ćźšäž€äžȘé»˜èź€äœçœźç”šäșŽć­˜ć‚šèœŹç æ–‡ä»¶ă€‚ćŠ‚æžœèŻ„äœçœźç•™ç©șïŒŒæœćŠĄć™šçš„çš‹ćșæ•°æźæ–‡ä»¶ć€čć°†èą«äœżç”šă€‚", @@ -1448,7 +1448,7 @@ "LabelFolder": "文件ć€č", "LabelBitrate": "æŻ”ç‰č率", "LabelAudioSampleRate": "采样率", - "LabelAudioCodec": "猖码", + "LabelAudioCodec": "éŸłéą‘çŒ–ç ïŒš", "LabelAudioChannels": "ćŁ°é“ïŒš", "LabelAudioBitrate": "æŻ”ç‰č率", "LabelAudioBitDepth": "é‡‡æ ·äœćźœïŒš", @@ -1469,5 +1469,7 @@ "MessageConfirmAppExit": "䜠芁退ć‡șć—ïŒŸ", "EnableFastImageFadeIn": "ćż«é€Ÿć›Ÿç‰‡æ·Ąć…„", "EnableFastImageFadeInHelp": "äžșć·ČćŠ èœœçš„ć›Ÿç‰‡ćŻç”šæ›Žćż«çš„ć›Ÿç‰‡æ·Ąć…„ćŠšç”»", - "OptionForceRemoteSourceTranscoding": "ćŒșćˆ¶èżœçš‹èœŹç ïŒˆćƒç””è§†ç›Žæ’­äž€æ ·ïŒ‰" + "OptionForceRemoteSourceTranscoding": "ćŒșćˆ¶èżœçš‹èœŹç ïŒˆćƒç””è§†ç›Žæ’­äž€æ ·ïŒ‰", + "NoCreatedLibraries": "çœ‹äžŠćŽ»æ‚šèż˜æœȘ戛ć»ș任䜕蔄料ćș“。{0} æ‚šæƒłçŽ°ćœšćˆ›ć»ș侀äžȘć—ïŒŸ {1}", + "AskAdminToCreateLibrary": "èŻ·è”çł»çźĄç†ć‘˜ä»„ćˆ›ć»ș侀äžȘ新的蔄料ćș“。" } diff --git a/src/themes/appletv/theme.css b/src/themes/appletv/theme.css index ccc6eaaab..5ca517bea 100644 --- a/src/themes/appletv/theme.css +++ b/src/themes/appletv/theme.css @@ -112,7 +112,7 @@ html { .inputLabelFocused, .selectLabelFocused, .textareaLabelFocused { - color: green; + color: #00a4dc; } .checkboxOutline { diff --git a/src/themes/dark/theme.css b/src/themes/dark/theme.css index 4d4b0a91b..41af2c32d 100644 --- a/src/themes/dark/theme.css +++ b/src/themes/dark/theme.css @@ -201,6 +201,10 @@ html { } .detailSticky { + background: rgba(32, 32, 32, 0.8); +} + +.noBackdrop .detailSticky { background: #202020; } diff --git a/src/themes/light/theme.css b/src/themes/light/theme.css index cedc8bfb8..d84a1c3b6 100644 --- a/src/themes/light/theme.css +++ b/src/themes/light/theme.css @@ -105,7 +105,7 @@ html { .inputLabelFocused, .selectLabelFocused, .textareaLabelFocused { - color: green; + color: #00a4dc; } .checkboxOutline { diff --git a/src/videoosd.html b/src/videoosd.html index ac3570c67..c200360c0 100644 --- a/src/videoosd.html +++ b/src/videoosd.html @@ -76,7 +76,7 @@
diff --git a/src/wizardlibrary.html b/src/wizardlibrary.html index 660b508f2..4fad65658 100644 --- a/src/wizardlibrary.html +++ b/src/wizardlibrary.html @@ -16,7 +16,7 @@
diff --git a/src/wizardremoteaccess.html b/src/wizardremoteaccess.html index 8a830d624..c7ddfb7e8 100644 --- a/src/wizardremoteaccess.html +++ b/src/wizardremoteaccess.html @@ -26,7 +26,7 @@
diff --git a/src/wizardsettings.html b/src/wizardsettings.html index 5850167c5..f75391947 100644 --- a/src/wizardsettings.html +++ b/src/wizardsettings.html @@ -21,7 +21,7 @@
diff --git a/src/wizardstart.html b/src/wizardstart.html index 5dd6f7e1b..a47fcad09 100644 --- a/src/wizardstart.html +++ b/src/wizardstart.html @@ -20,7 +20,7 @@
diff --git a/src/wizarduser.html b/src/wizarduser.html index 9f54d7ca6..90f492b0f 100644 --- a/src/wizarduser.html +++ b/src/wizarduser.html @@ -27,7 +27,7 @@
diff --git a/webpack.common.js b/webpack.common.js index 5e0f88526..bff1f5f4e 100644 --- a/webpack.common.js +++ b/webpack.common.js @@ -5,10 +5,13 @@ const CopyPlugin = require("copy-webpack-plugin"); const Assets = [ "alameda/alameda.js", - "requirejs/require.js", + "native-promise-only/npo.js", "libass-wasm/dist/subtitles-octopus-worker.js", "libass-wasm/dist/subtitles-octopus-worker.data", - "libass-wasm/dist/subtitles-octopus-worker.wasm" + "libass-wasm/dist/subtitles-octopus-worker.wasm", + "libass-wasm/dist/subtitles-octopus-worker-legacy.js", + "libass-wasm/dist/subtitles-octopus-worker-legacy.data", + "libass-wasm/dist/subtitles-octopus-worker-legacy.js.mem" ]; module.exports = { diff --git a/yarn.lock b/yarn.lock index 7187bd177..f156002c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3683,10 +3683,9 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -libass-wasm@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/libass-wasm/-/libass-wasm-2.1.1.tgz#f12f4fdb9579dd422dcbc348bc3bd61097f4d07d" - integrity sha512-d45bHQ7tFVsLW3QstQDrDog2m+0D6Cja4GTrkGi70R9A5+aeLunPSUz3G4CVB+sKffNgiWjK4QI5NZLHQKZ9oQ== +"libass-wasm@https://github.com/jellyfin/JavascriptSubtitlesOctopus": + version "3.0.2" + resolved "https://github.com/jellyfin/JavascriptSubtitlesOctopus#7f331237026db75af2441717a4132d2398e96735" libjass@^0.11.0: version "0.11.0" @@ -5415,11 +5414,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -requirejs@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.6.tgz#e5093d9601c2829251258c0b9445d4d19fa9e7c9" - integrity sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -5639,11 +5633,6 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== - serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"