Merge branch 'master' into improve-builds

This commit is contained in:
Joshua M. Boniface 2020-04-25 22:20:49 -04:00 committed by GitHub
commit 5330fd1228
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
126 changed files with 3286 additions and 1971 deletions

View file

@ -12,87 +12,94 @@ pr:
- '*'
jobs:
- job: Build
displayName: 'Build'
- job: Build
displayName: 'Build'
strategy:
matrix:
Development:
BuildConfiguration: development
Production:
BuildConfiguration: production
Standalone:
BuildConfiguration: standalone
strategy:
matrix:
Development:
BuildConfiguration: development
Production:
BuildConfiguration: production
Standalone:
BuildConfiguration: standalone
pool:
vmImage: 'ubuntu-latest'
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
displayName: 'Install Node'
inputs:
versionSpec: '12.x'
steps:
- task: NodeTool@0
displayName: 'Install Node'
inputs:
versionSpec: '12.x'
- task: Cache@2
displayName: 'Check Cache'
inputs:
key: 'yarn | yarn.lock'
path: 'node_modules'
cacheHitVar: CACHE_RESTORED
- task: Cache@2
displayName: 'Check Cache'
inputs:
key: 'yarn | yarn.lock'
path: 'node_modules'
cacheHitVar: CACHE_RESTORED
- script: 'yarn install --frozen-lockfile'
displayName: 'Install Dependencies'
condition: ne(variables.CACHE_RESTORED, 'true')
- script: 'yarn install --frozen-lockfile'
displayName: 'Install Dependencies'
condition: ne(variables.CACHE_RESTORED, 'true')
- script: 'yarn build:development'
displayName: 'Build Development'
condition: eq(variables['BuildConfiguration'], 'development')
- script: 'yarn build:development'
displayName: 'Build Development'
condition: eq(variables['BuildConfiguration'], 'development')
- script: 'yarn build:production'
displayName: 'Build Bundle'
condition: eq(variables['BuildConfiguration'], 'production')
- script: 'yarn build:production'
displayName: 'Build Bundle'
condition: eq(variables['BuildConfiguration'], 'production')
- script: 'yarn build:standalone'
displayName: 'Build Standalone'
condition: eq(variables['BuildConfiguration'], 'standalone')
- script: 'yarn build:standalone'
displayName: 'Build Standalone'
condition: eq(variables['BuildConfiguration'], 'standalone')
- script: 'test -d dist'
displayName: 'Check Build'
- script: 'test -d dist'
displayName: 'Check Build'
- script: 'mv dist jellyfin-web'
displayName: 'Rename Directory'
- script: 'mv dist jellyfin-web'
displayName: 'Rename Directory'
- task: PublishPipelineArtifact@1
displayName: 'Publish Release'
inputs:
targetPath: '$(Build.SourcesDirectory)/jellyfin-web'
artifactName: 'jellyfin-web-$(BuildConfiguration)'
- task: ArchiveFiles@2
displayName: 'Archive Directory'
inputs:
rootFolderOrFile: 'jellyfin-web'
includeRootFolder: true
archiveFile: 'jellyfin-web-$(BuildConfiguration)'
- job: Lint
displayName: 'Lint'
- task: PublishPipelineArtifact@1
displayName: 'Publish Release'
inputs:
targetPath: '$(Build.SourcesDirectory)/jellyfin-web-$(BuildConfiguration).zip'
artifactName: 'jellyfin-web-$(BuildConfiguration)'
pool:
vmImage: 'ubuntu-latest'
- job: Lint
displayName: 'Lint'
steps:
- task: NodeTool@0
displayName: 'Install Node'
inputs:
versionSpec: '12.x'
pool:
vmImage: 'ubuntu-latest'
- task: Cache@2
displayName: 'Check Cache'
inputs:
key: 'yarn | yarn.lock'
path: 'node_modules'
cacheHitVar: CACHE_RESTORED
steps:
- task: NodeTool@0
displayName: 'Install Node'
inputs:
versionSpec: '12.x'
- script: 'yarn install --frozen-lockfile'
displayName: 'Install Dependencies'
condition: ne(variables.CACHE_RESTORED, 'true')
- task: Cache@2
displayName: 'Check Cache'
inputs:
key: 'yarn | yarn.lock'
path: 'node_modules'
cacheHitVar: CACHE_RESTORED
- script: 'yarn run lint --quiet'
displayName: 'Run ESLint'
- script: 'yarn install --frozen-lockfile'
displayName: 'Install Dependencies'
condition: ne(variables.CACHE_RESTORED, 'true')
- script: 'yarn run stylelint'
displayName: 'Run Stylelint'
- script: 'yarn run lint --quiet'
displayName: 'Run ESLint'
- script: 'yarn run stylelint'
displayName: 'Run Stylelint'

View file

@ -22,6 +22,7 @@ extends:
- plugin:import/errors
- plugin:import/warnings
- plugin:eslint-comments/recommended
- plugin:compat/recommended
globals:
# Browser globals
@ -85,3 +86,86 @@ rules:
promise/no-return-wrap: ["warn"]
# TODO: Remove after ES6 migration is complete
import/no-unresolved: ["warn"]
settings:
polyfills:
# Native Promises Only
- Promise
# whatwg-fetch
- fetch
# document-register-element
- document.registerElement
# resize-observer-polyfill
- ResizeObserver
# fast-text-encoding
- TextEncoder
# intersection-observer
- IntersectionObserver
# Core-js
- Object.assign
- Object.is
- Object.setPrototypeOf
- Object.toString
- Object.freeze
- Object.seal
- Object.preventExtensions
- Object.isFrozen
- Object.isSealed
- Object.isExtensible
- Object.getOwnPropertyDescriptor
- Object.getPrototypeOf
- Object.keys
- Object.getOwnPropertyNames
- Function.name
- Function.hasInstance
- Array.from
- Array.arrayOf
- Array.copyWithin
- Array.fill
- Array.find
- Array.findIndex
- Array.iterator
- String.fromCodePoint
- String.raw
- String.iterator
- String.codePointAt
- String.endsWith
- String.includes
- String.repeat
- String.startsWith
- String.trim
- String.anchor
- String.big
- String.blink
- String.bold
- String.fixed
- String.fontcolor
- String.fontsize
- String.italics
- String.link
- String.small
- String.strike
- String.sub
- String.sup
- RegExp
- Number
- Math
- Date
- async
- Symbol
- Map
- Set
- WeakMap
- WeakSet
- ArrayBuffer
- DataView
- Int8Array
- Uint8Array
- Uint8ClampedArray
- Int16Array
- Uint16Array
- Int32Array
- Uint32Array
- Float32Array
- Float64Array
- Reflect

View file

@ -62,7 +62,7 @@ function serve() {
port: 8080
});
let events = ['add', 'change'];
const events = ['add', 'change'];
watch(options.javascript.query).on('all', function (event, path) {
if (events.includes(event)) {
@ -105,7 +105,7 @@ function clean() {
return del(['dist/']);
}
let pipelineJavascript = lazypipe()
const pipelineJavascript = lazypipe()
.pipe(function () {
return mode.development(sourcemaps.init({ loadMaps: true }));
})
@ -140,7 +140,7 @@ function apploader(standalone) {
.pipe(pipelineJavascript())
.pipe(dest('dist/'))
.pipe(browserSync.stream());
};
}
task.displayName = 'apploader';
@ -183,6 +183,12 @@ function copy(query) {
.pipe(browserSync.stream());
}
function copyIndex() {
return src(options.injectBundle.query, { base: './src/' })
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function injectBundle() {
return src(options.injectBundle.query, { base: './src/' })
.pipe(inject(
@ -193,9 +199,9 @@ function injectBundle() {
}
function build(standalone) {
return series(clean, parallel(javascript, apploader(standalone), webpack, css, html, images, copy), injectBundle);
return series(clean, parallel(javascript, apploader(standalone), webpack, css, html, images, copy));
}
exports.default = build(false);
exports.standalone = build(true);
exports.default = series(build(false), copyIndex);
exports.standalone = series(build(true), injectBundle);
exports.serve = series(exports.standalone, serve);

View file

@ -18,6 +18,7 @@
"cssnano": "^4.1.10",
"del": "^5.1.0",
"eslint": "^6.8.0",
"eslint-plugin-compat": "^3.5.1",
"eslint-plugin-eslint-comments": "^3.1.2",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-promise": "^4.2.1",
@ -58,9 +59,12 @@
"core-js": "^3.6.4",
"date-fns": "^2.11.1",
"document-register-element": "^1.14.3",
"fast-text-encoding": "^1.0.1",
"flv.js": "^1.5.0",
"headroom.js": "^0.11.0",
"hls.js": "^0.13.1",
"howler": "^2.1.3",
"intersection-observer": "^0.7.0",
"jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto",
"jquery": "^3.4.1",
"jstree": "^3.3.7",
@ -70,9 +74,10 @@
"page": "^1.11.5",
"query-string": "^6.11.1",
"resize-observer-polyfill": "^1.5.1",
"screenfull": "^5.0.2",
"shaka-player": "^2.5.10",
"sortablejs": "^1.10.2",
"swiper": "^5.3.1",
"swiper": "^5.3.7",
"webcomponents.js": "^0.7.24",
"whatwg-fetch": "^3.0.0"
},
@ -89,13 +94,14 @@
"src/components/filedownloader.js",
"src/components/filesystem.js",
"src/components/input/keyboardnavigation.js",
"src/components/scrollManager.js",
"src/components/sanatizefilename.js",
"src/scripts/settings/webSettings.js",
"src/components/scrollManager.js",
"src/scripts/settings/appSettings.js",
"src/scripts/settings/userSettings.js",
"src/scripts/settings/webSettings.js",
"src/scripts/dfnshelper.js",
"src/scripts/imagehelper.js",
"src/scripts/dfnshelper.js"
"src/scripts/inputManager.js"
],
"plugins": [
"@babel/plugin-transform-modules-amd"
@ -119,7 +125,7 @@
"Firefox ESR"
],
"scripts": {
"serve": "gulp serve",
"serve": "gulp serve --development",
"prepare": "gulp --production",
"build:development": "gulp --development",
"build:production": "gulp --production",

View file

@ -21,7 +21,11 @@
}
.libraryPage {
padding-top: 7em;
padding-top: 7em !important;
}
.layout-mobile .libraryPage {
padding-top: 4em !important;
}
.itemDetailPage {
@ -128,10 +132,6 @@
margin-top: 0;
}
.layout-mobile .pageTitleWithDefaultLogo {
background-image: url(../img/icon-transparent.png);
}
.headerLeft,
.skinHeader {
display: -webkit-box;
@ -242,10 +242,11 @@
}
.mainDrawer-scrollContainer {
margin-bottom: 10vh;
padding-bottom: 10vh;
}
@media all and (min-width: 40em) {
.dashboardDocument .adminDrawerLogo,
.dashboardDocument .mainDrawerButton {
display: none !important;
}
@ -313,7 +314,7 @@
}
.dashboardDocument .mainDrawer-scrollContainer {
margin-top: 4.6em !important;
margin-top: 4.65em !important;
}
}
@ -516,6 +517,13 @@
.itemName {
margin: 0.5em 0;
font-weight: 600;
}
.nameContainer {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
.itemMiscInfo {
@ -533,7 +541,6 @@
.layout-mobile .itemName,
.layout-mobile .itemMiscInfo,
.layout-mobile .mainDetailButtons {
display: flex;
align-items: center;
justify-content: center;
text-align: center;
@ -575,7 +582,6 @@
.infoText {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
text-align: left;
}
@ -606,12 +612,11 @@
}
.detailLogo {
width: 67.25vw;
height: 14.5vh;
width: 30vw;
height: 25vh;
position: absolute;
top: 15vh;
right: 0;
-webkit-background-size: contain;
top: 10vh;
right: 20vw;
background-size: contain;
}
@ -619,26 +624,8 @@
display: none;
}
@media all and (max-width: 87.5em) {
.detailLogo {
right: 5%;
}
}
@media all and (max-width: 75em) {
.detailLogo {
right: 2%;
}
}
@media all and (max-width: 68.75em) {
.detailLogo {
width: 14.91em;
height: 3.5em;
right: 5%;
bottom: 5%;
top: auto;
background-position: center right;
display: none;
}
}

View file

@ -96,3 +96,16 @@ div[data-role=page] {
margin-right: auto;
width: 85%;
}
.headroom {
will-change: transform;
transition: transform 200ms linear;
}
.headroom--pinned {
transform: translateY(0%);
}
.headroom--unpinned {
transform: translateY(-100%);
}

View file

@ -85,15 +85,15 @@ _define("webcomponents", function() {
});
// libass-wasm
var libass_wasm = require("libass-wasm");
var libassWasm = require("libass-wasm");
_define("JavascriptSubtitlesOctopus", function() {
return libass_wasm;
return libassWasm;
});
// material-icons
var material_icons = require("material-design-icons-iconfont/dist/material-design-icons.css");
var materialIcons = require("material-design-icons-iconfont/dist/material-design-icons.css");
_define("material-icons", function() {
return material_icons;
return materialIcons;
});
// noto font
@ -120,12 +120,35 @@ _define("classlist-polyfill", function () {
});
// Date-FNS
var date_fns = require("date-fns");
var dateFns = require("date-fns");
_define("date-fns", function () {
return date_fns;
return dateFns;
});
var date_fns_locale = require("date-fns/locale");
var dateFnsLocale = require("date-fns/locale");
_define("date-fns/locale", function () {
return date_fns_locale;
return dateFnsLocale;
});
var fast_text_encoding = require("fast-text-encoding");
_define("fast-text-encoding", function () {
return fast_text_encoding;
});
// intersection-observer
var intersection_observer = require("intersection-observer");
_define("intersection-observer", function () {
return intersection_observer;
});
// screenfull
var screenfull = require("screenfull");
_define("screenfull", function () {
return screenfull;
});
// headroom.js
var headroom = require("headroom.js/dist/headroom");
_define("headroom", function () {
return headroom;
});

View file

@ -200,7 +200,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
var apiClient = this;
if (data.status === 401) {
if (data.status === 403) {
if (data.errorCode === "ParentalControl") {
var isCurrentAllowed = currentRouteInfo ? (currentRouteInfo.route.anonymous || currentRouteInfo.route.startup) : true;
@ -268,6 +268,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
}
function getMaxBandwidth() {
/* eslint-disable compat/compat */
if (navigator.connection) {
var max = navigator.connection.downlinkMax;
if (max && max > 0 && max < Number.POSITIVE_INFINITY) {
@ -279,6 +280,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
return max;
}
}
/* eslint-enable compat/compat */
return null;
}
@ -577,7 +579,8 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
function showDirect(path) {
return new Promise(function(resolve, reject) {
resolveOnNextShow = resolve, page.show(baseUrl()+path);
resolveOnNextShow = resolve;
page.show(baseUrl() + path);
});
}

View file

@ -237,10 +237,6 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], f
features.push("voiceinput");
}
if (!browser.tv && !browser.xboxOne) {
browser.ps4;
}
if (supportsHtmlMediaAutoplay()) {
features.push("htmlaudioautoplay");
features.push("htmlvideoautoplay");
@ -351,8 +347,6 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], f
var deviceName;
var appName = "Jellyfin Web";
var appVersion = "10.6.0";
var visibilityChange;
var visibilityState;
var appHost = {
getWindowState: function () {
@ -426,40 +420,26 @@ define(["appSettings", "browser", "events", "htmlMediaHelper", "webSettings"], f
}
};
var doc = self.document;
var isHidden = false;
var hidden;
var visibilityChange;
if (doc) {
if (void 0 !== doc.visibilityState) {
visibilityChange = "visibilitychange";
visibilityState = "hidden";
if (typeof document.hidden !== "undefined") { /* eslint-disable-line compat/compat */
hidden = "hidden";
visibilityChange = "visibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
hidden = "webkitHidden";
visibilityChange = "webkitvisibilitychange";
}
document.addEventListener(visibilityChange, function () {
/* eslint-disable-next-line compat/compat */
if (document[hidden]) {
onAppHidden();
} else {
if (void 0 !== doc.mozHidden) {
visibilityChange = "mozvisibilitychange";
visibilityState = "mozVisibilityState";
} else {
if (void 0 !== doc.msHidden) {
visibilityChange = "msvisibilitychange";
visibilityState = "msVisibilityState";
} else {
if (void 0 !== doc.webkitHidden) {
visibilityChange = "webkitvisibilitychange";
visibilityState = "webkitVisibilityState";
}
}
}
onAppVisible();
}
}
if (doc) {
doc.addEventListener(visibilityChange, function () {
if (document[visibilityState]) {
onAppHidden();
} else {
onAppVisible();
}
});
}
}, false);
if (self.addEventListener) {
self.addEventListener("focus", onAppVisible);

View file

@ -5,7 +5,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
var currentResolve;
var currentReject;
var PlayerName = 'Chromecast';
var PlayerName = 'Google Cast';
function sendConnectionResult(isOk) {

View file

@ -186,6 +186,8 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
context.querySelector('#selectLanguage').value = userSettings.language() || '';
context.querySelector('.selectDateTimeLocale').value = userSettings.dateTimeLocale() || '';
context.querySelector('#txtLibraryPageSize').value = userSettings.libraryPageSize();
selectDashboardTheme.value = userSettings.dashboardTheme() || '';
selectTheme.value = userSettings.theme() || '';
@ -215,6 +217,8 @@ define(['require', 'browser', 'layoutManager', 'appSettings', 'pluginManager', '
userSettingsInstance.soundEffects(context.querySelector('.selectSoundEffects').value);
userSettingsInstance.screensaver(context.querySelector('.selectScreensaver').value);
userSettingsInstance.libraryPageSize(context.querySelector('#txtLibraryPageSize').value);
userSettingsInstance.skin(context.querySelector('.selectSkin').value);
userSettingsInstance.enableFastFadein(context.querySelector('#chkFadein').checked);

View file

@ -143,6 +143,11 @@
<select is="emby-select" class="selectSoundEffects" label="${LabelSoundEffects}"></select>
</div>
<div class="inputContainer inputContainer-withDescription fldFadein">
<input is="emby-input" type="number" id="txtLibraryPageSize" pattern="[0-9]*" required="required" min="0" max="1000" step="1" label="${LabelLibraryPageSize}" />
<div class="fieldDescription">${LabelLibraryPageSizeHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription fldFadein">
<label>
<input type="checkbox" is="emby-checkbox" id="chkFadein" />

View file

@ -4,7 +4,7 @@ export function download(items) {
if (window.NativeShell) {
items.map(function (item) {
window.NativeShell.downloadFile(item.url);
window.NativeShell.downloadFile(item);
});
} else {
multiDownload(items.map(function (item) {

View file

@ -1,103 +0,0 @@
define(['events', 'dom', 'apphost', 'browser'], function (events, dom, appHost, browser) {
'use strict';
function fullscreenManager() {
}
fullscreenManager.prototype.requestFullscreen = function (element) {
element = element || document.documentElement;
if (element.requestFullscreen) {
element.requestFullscreen();
return;
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen();
return;
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullscreen();
return;
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
return;
}
// Hack - This is only available for video elements in ios safari
if (element.tagName !== 'VIDEO') {
element = document.querySelector('video') || element;
}
if (element.webkitEnterFullscreen) {
element.webkitEnterFullscreen();
}
};
fullscreenManager.prototype.exitFullscreen = function () {
if (!this.isFullScreen()) {
return;
}
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.webkitCancelFullscreen) {
document.webkitCancelFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
}
};
// TODO: use screenfull.js
fullscreenManager.prototype.isFullScreen = function () {
return document.fullscreen ||
document.mozFullScreen ||
document.webkitIsFullScreen ||
document.msFullscreenElement || /* IE/Edge syntax */
document.fullscreenElement || /* Standard syntax */
document.webkitFullscreenElement || /* Chrome, Safari and Opera syntax */
document.mozFullScreenElement; /* Firefox syntax */
};
var manager = new fullscreenManager();
function onFullScreenChange() {
events.trigger(manager, 'fullscreenchange');
}
dom.addEventListener(document, 'fullscreenchange', onFullScreenChange, {
passive: true
});
dom.addEventListener(document, 'webkitfullscreenchange', onFullScreenChange, {
passive: true
});
dom.addEventListener(document, 'mozfullscreenchange', onFullScreenChange, {
passive: true
});
function isTargetValid(target) {
return !dom.parentWithTag(target, ['BUTTON', 'INPUT', 'TEXTAREA']);
}
if (appHost.supports("fullscreenchange") && (browser.edgeUwp || -1 !== navigator.userAgent.toLowerCase().indexOf("electron"))) {
dom.addEventListener(window, 'dblclick', function (e) {
if (isTargetValid(e.target)) {
if (manager.isFullScreen()) {
manager.exitFullscreen();
} else {
manager.requestFullscreen();
}
}
}, {
passive: true
});
}
return manager;
});

View file

@ -1,4 +1,4 @@
define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', 'scrollHelper', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'playbackManager', 'userSettings', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'dom', 'css!./guide.css', 'programStyles', 'material-icons', 'scrollStyles', 'emby-button', 'paper-icon-button-light', 'emby-tabs', 'emby-scroller', 'flexStyles', 'registerElement'], function (require, inputManager, browser, globalize, connectionManager, scrollHelper, serverNotifications, loading, datetime, focusManager, playbackManager, userSettings, imageLoader, events, layoutManager, itemShortcuts, dom) {
define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', 'scrollHelper', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'playbackManager', 'userSettings', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'dom', 'css!./guide.css', 'programStyles', 'material-icons', 'scrollStyles', 'emby-programcell', 'emby-button', 'paper-icon-button-light', 'emby-tabs', 'emby-scroller', 'flexStyles', 'registerElement'], function (require, inputManager, browser, globalize, connectionManager, scrollHelper, serverNotifications, loading, datetime, focusManager, playbackManager, userSettings, imageLoader, events, layoutManager, itemShortcuts, dom) {
'use strict';
function showViewSettings(instance) {
@ -1252,18 +1252,5 @@ define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager',
});
}
var ProgramCellPrototype = Object.create(HTMLButtonElement.prototype);
ProgramCellPrototype.detachedCallback = function () {
this.posLeft = null;
this.posWidth = null;
this.guideProgramName = null;
};
document.registerElement('emby-programcell', {
prototype: ProgramCellPrototype,
extends: 'button'
});
return Guide;
});

View file

@ -1,11 +0,0 @@
.headroom {
transition: transform 140ms linear;
}
.headroom--pinned {
transform: none;
}
.headroom--unpinned:not(.headroomDisabled) {
transform: translateY(-100%);
}

View file

@ -1,343 +0,0 @@
/*!
* headroom.js v0.7.0 - Give your page some headroom. Hide your header until you need it
* Copyright (c) 2014 Nick Williams - http://wicky.nillia.ms/headroom.js
* License: MIT
*/
define(['dom', 'layoutManager', 'browser', 'css!./headroom'], function (dom, layoutManager, browser) {
'use strict';
/* exported features */
var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;
/**
* Handles debouncing of events via requestAnimationFrame
* @see http://www.html5rocks.com/en/tutorials/speed/animations/
* @param {Function} callback The callback to handle whichever event
*/
function Debouncer(callback) {
this.callback = callback;
this.ticking = false;
}
Debouncer.prototype = {
constructor: Debouncer,
/**
* dispatches the event to the supplied callback
* @private
*/
update: function () {
if (this.callback) {
this.callback();
}
this.ticking = false;
},
/**
* Attach this as the event listeners
*/
handleEvent: function () {
if (!this.ticking) {
requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));
this.ticking = true;
}
}
};
function onHeadroomClearedExternally() {
this.state = null;
}
/**
* UI enhancement for fixed headers.
* Hides header when scrolling down
* Shows header when scrolling up
* @constructor
* @param {DOMElement} elem the header element
* @param {Object} options options for the widget
*/
function Headroom(elems, options) {
options = Object.assign(Headroom.options, options || {});
this.lastKnownScrollY = 0;
this.elems = elems;
this.scroller = options.scroller;
this.debouncer = onScroll.bind(this);
this.offset = options.offset;
this.initialised = false;
this.initialClass = options.initialClass;
this.unPinnedClass = options.unPinnedClass;
this.pinnedClass = options.pinnedClass;
this.state = 'clear';
this.options = {
offset: 0,
scroller: window,
initialClass: 'headroom',
unPinnedClass: 'headroom--unpinned',
pinnedClass: 'headroom--pinned'
};
this.add = function (elem) {
if (browser.supportsCssAnimation()) {
elem.classList.add(this.initialClass);
elem.addEventListener('clearheadroom', onHeadroomClearedExternally.bind(this));
this.elems.push(elem);
}
};
this.remove = function (elem) {
elem.classList.remove(this.unPinnedClass);
elem.classList.remove(this.initialClass);
elem.classList.remove(this.pinnedClass);
var i = this.elems.indexOf(elem);
if (i !== -1) {
this.elems.splice(i, 1);
}
};
this.pause = function () {
this.paused = true;
};
this.resume = function () {
this.paused = false;
};
/**
* Unattaches events and removes any classes that were added
*/
this.destroy = function () {
this.initialised = false;
for (var i = 0, length = this.elems.length; i < length; i++) {
var classList = this.elems[i].classList;
classList.remove(this.unPinnedClass);
classList.remove(this.initialClass);
classList.remove(this.pinnedClass);
}
var scrollEventName = this.scroller.getScrollEventName ? this.scroller.getScrollEventName() : 'scroll';
dom.removeEventListener(this.scroller, scrollEventName, this.debouncer, {
capture: false,
passive: true
});
};
/**
* Attaches the scroll event
* @private
*/
this.attachEvent = function () {
if (!this.initialised) {
this.lastKnownScrollY = this.getScrollY();
this.initialised = true;
var scrollEventName = this.scroller.getScrollEventName ? this.scroller.getScrollEventName() : 'scroll';
dom.addEventListener(this.scroller, scrollEventName, this.debouncer, {
capture: false,
passive: true
});
this.update();
}
};
/**
* Unpins the header if it's currently pinned
*/
this.clear = function () {
if (this.state === 'clear') {
return;
}
this.state = 'clear';
var unpinnedClass = this.unPinnedClass;
var pinnedClass = this.pinnedClass;
for (var i = 0, length = this.elems.length; i < length; i++) {
var classList = this.elems[i].classList;
classList.remove(unpinnedClass);
//classList.remove(pinnedClass);
}
};
/**
* Unpins the header if it's currently pinned
*/
this.pin = function () {
if (this.state === 'pin') {
return;
}
this.state = 'pin';
var unpinnedClass = this.unPinnedClass;
var pinnedClass = this.pinnedClass;
for (var i = 0, length = this.elems.length; i < length; i++) {
var classList = this.elems[i].classList;
classList.remove(unpinnedClass);
classList.add(pinnedClass);
}
};
/**
* Unpins the header if it's currently pinned
*/
this.unpin = function () {
if (this.state === 'unpin') {
return;
}
this.state = 'unpin';
var unpinnedClass = this.unPinnedClass;
var pinnedClass = this.pinnedClass;
for (var i = 0, length = this.elems.length; i < length; i++) {
var classList = this.elems[i].classList;
classList.add(unpinnedClass);
//classList.remove(pinnedClass);
}
};
/**
* Gets the Y scroll position
* @see https://developer.mozilla.org/en-US/docs/Web/API/Window.scrollY
* @return {Number} pixels the page has scrolled along the Y-axis
*/
this.getScrollY = function () {
var scroller = this.scroller;
if (scroller.getScrollPosition) {
return scroller.getScrollPosition();
}
var pageYOffset = scroller.pageYOffset;
if (pageYOffset !== undefined) {
return pageYOffset;
}
var scrollTop = scroller.scrollTop;
if (scrollTop !== undefined) {
return scrollTop;
}
return (document.documentElement || document.body).scrollTop;
};
/**
* determine if it is appropriate to unpin
* @param {int} currentScrollY the current y scroll position
* @return {bool} true if should unpin, false otherwise
*/
this.shouldUnpin = function (currentScrollY) {
var scrollingDown = currentScrollY > this.lastKnownScrollY;
var pastOffset = currentScrollY >= this.offset;
return scrollingDown && pastOffset;
};
/**
* determine if it is appropriate to pin
* @param {int} currentScrollY the current y scroll position
* @return {bool} true if should pin, false otherwise
*/
this.shouldPin = function (currentScrollY) {
var scrollingUp = currentScrollY < this.lastKnownScrollY;
var pastOffset = currentScrollY <= this.offset;
return scrollingUp || pastOffset;
};
/**
* Handles updating the state of the widget
*/
this.update = function () {
if (this.paused) {
return;
}
var currentScrollY = this.getScrollY();
var lastKnownScrollY = this.lastKnownScrollY;
var isTv = layoutManager.tv;
if (currentScrollY <= (isTv ? 120 : 10)) {
this.clear();
} else if (this.shouldUnpin(currentScrollY)) {
this.unpin();
} else if (this.shouldPin(currentScrollY)) {
var toleranceExceeded = Math.abs(currentScrollY - lastKnownScrollY) >= 14;
if (currentScrollY && isTv) {
this.unpin();
} else if (toleranceExceeded) {
this.clear();
}
} else if (isTv) {
//this.clear();
}
this.lastKnownScrollY = currentScrollY;
};
if (browser.supportsCssAnimation()) {
for (var i = 0, length = this.elems.length; i < length; i++) {
this.elems[i].classList.add(this.initialClass);
this.elems[i].addEventListener('clearheadroom', onHeadroomClearedExternally.bind(this));
}
this.attachEvent();
}
}
function onScroll() {
if (this.paused) {
return;
}
requestAnimationFrame(this.rafCallback || (this.rafCallback = this.update.bind(this)));
}
/**
* Default options
* @type {Object}
*/
Headroom.options = {
offset: 0,
scroller: window,
initialClass: 'headroom',
unPinnedClass: 'headroom--unpinned',
pinnedClass: 'headroom--pinned'
};
return Headroom;
});

View file

@ -10,6 +10,13 @@
<div class="fieldDescription">${LabelPleaseRestart}</div>
</div>
<div class="verticalSection verticalSection-extrabottompadding">
<label class="checkboxContainer">
<input class="chkHidePlayedFromLatest" type="checkbox" is="emby-checkbox" />
<span>${HideWatchedContentFromLatestMedia}</span>
</label>
</div>
<div class="selectContainer">
<select is="emby-select" id="selectHomeSection1" label="{section1label}">
<option value="smalllibrarytiles">${HeaderMyMedia}</option>
@ -110,13 +117,6 @@
<div class="perLibrarySettings"></div>
<div class="verticalSection verticalSection-extrabottompadding">
<label class="checkboxContainer">
<input class="chkHidePlayedFromLatest" type="checkbox" is="emby-checkbox" />
<span>${HideWatchedContentFromLatestMedia}</span>
</label>
</div>
<div class="verticalSection verticalSection-extrabottompadding">
<h2 class="sectionTitle">${HeaderLibraryFolders}</h2>
<div>

View file

@ -131,7 +131,7 @@ define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'la
} else if (section === 'librarytiles' || section === 'smalllibrarytiles' || section === 'smalllibrarytiles-automobile' || section === 'librarytiles-automobile') {
loadLibraryTiles(elem, apiClient, user, userSettings, 'smallBackdrop', userViews, allSections);
} else if (section === 'librarybuttons') {
loadlibraryButtons(elem, apiClient, user, userSettings, userViews, allSections);
loadlibraryButtons(elem, apiClient, user, userSettings, userViews);
} else if (section === 'resume') {
loadResumeVideo(elem, apiClient, userId);
} else if (section === 'resumeaudio') {

View file

@ -31,7 +31,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve
}
function enableHlsShakaPlayer(item, mediaSource, mediaType) {
/* eslint-disable-next-line compat/compat */
if (!!window.MediaSource && !!MediaSource.isTypeSupported) {
if (canPlayNativeHls()) {
@ -162,7 +162,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve
}
}
function seekOnPlaybackStart(instance, element, ticks) {
function seekOnPlaybackStart(instance, element, ticks, onMediaReady) {
var seconds = (ticks || 0) / 10000000;
@ -175,6 +175,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve
if (element.duration >= seconds) {
// media is ready, seek immediately
setCurrentTimeIfNeeded(element, seconds);
if (onMediaReady) onMediaReady();
} else {
// update video player position when media is ready to be sought
var events = ["durationchange", "loadeddata", "play", "loadedmetadata"];
@ -189,6 +190,7 @@ define(['appSettings', 'browser', 'events'], function (appSettings, browser, eve
events.map(function(name) {
element.removeEventListener(name, onMediaChange);
});
if (onMediaReady) onMediaReady();
}
};
events.map(function (name) {

View file

@ -101,7 +101,7 @@ define(['events', 'browser', 'require', 'apphost', 'appSettings', 'htmlMediaHelp
self._timeUpdated = false;
self._currentTime = null;
var elem = createMediaElement(options);
var elem = createMediaElement();
return setCurrentSrc(elem, options);
};

View file

@ -1,4 +1,4 @@
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) {
define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackManager', 'appRouter', 'appSettings', 'connectionManager', 'htmlMediaHelper', 'itemHelper', 'screenfull', 'globalize'], function (browser, require, events, appHost, loading, dom, playbackManager, appRouter, appSettings, connectionManager, htmlMediaHelper, itemHelper, screenfull, globalize) {
"use strict";
/* globals cast */
@ -600,8 +600,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
var offsetValue = parseFloat(offset);
// if .ass currently rendering
if (currentAssRenderer) {
if (currentSubtitlesOctopus) {
updateCurrentTrackOffset(offsetValue);
currentSubtitlesOctopus.timeOffset = offsetValue;
} else {
var trackElement = getTextTrack();
// if .vtt currently rendering
@ -794,7 +795,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
dlg.parentNode.removeChild(dlg);
}
fullscreenManager.exitFullscreen();
screenfull.exit();
};
function onEnded() {
@ -856,7 +857,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
loading.hide();
htmlMediaHelper.seekOnPlaybackStart(self, e.target, self._currentPlayOptions.playerStartPositionTicks);
htmlMediaHelper.seekOnPlaybackStart(self, e.target, self._currentPlayOptions.playerStartPositionTicks, function () {
if (currentSubtitlesOctopus) currentSubtitlesOctopus.resize();
});
if (self._currentPlayOptions.fullscreen) {
@ -1220,11 +1223,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
function updateSubtitleText(timeMs) {
// handle offset for ass tracks
if (currentTrackOffset) {
timeMs += (currentTrackOffset * 1000);
}
var clock = currentClock;
if (clock) {
try {

View file

@ -1,10 +1,6 @@
define(['lazyLoader', 'imageFetcher', 'layoutManager', 'browser', 'appSettings', 'userSettings', 'require', 'css!./style'], function (lazyLoader, imageFetcher, layoutManager, browser, appSettings, userSettings, require) {
'use strict';
var requestIdleCallback = window.requestIdleCallback || function (fn) {
fn();
};
var self = {};
function fillImage(elem, source, enableEffects) {

View file

@ -1,4 +1,4 @@
define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], function (datetime, itemHelper) {
define(['datetime', 'itemHelper', 'emby-progressbar', 'css!./indicators.css', 'material-icons'], function (datetime, itemHelper) {
'use strict';
function enableProgressIndicator(item) {
@ -183,45 +183,6 @@ define(['datetime', 'itemHelper', 'css!./indicators.css', 'material-icons'], fun
return '';
}
var ProgressBarPrototype = Object.create(HTMLDivElement.prototype);
function onAutoTimeProgress() {
var start = parseInt(this.getAttribute('data-starttime'));
var end = parseInt(this.getAttribute('data-endtime'));
var now = new Date().getTime();
var total = end - start;
var pct = 100 * ((now - start) / total);
pct = Math.min(100, pct);
pct = Math.max(0, pct);
var itemProgressBarForeground = this.querySelector('.itemProgressBarForeground');
itemProgressBarForeground.style.width = pct + '%';
}
ProgressBarPrototype.attachedCallback = function () {
if (this.timeInterval) {
clearInterval(this.timeInterval);
}
if (this.getAttribute('data-automode') === 'time') {
this.timeInterval = setInterval(onAutoTimeProgress.bind(this), 60000);
}
};
ProgressBarPrototype.detachedCallback = function () {
if (this.timeInterval) {
clearInterval(this.timeInterval);
this.timeInterval = null;
}
};
document.registerElement('emby-progressbar', {
prototype: ProgressBarPrototype,
extends: 'div'
});
return {
getProgressHtml: getProgressHtml,
getProgressBarHtml: getProgressBarHtml,

View file

@ -184,7 +184,7 @@ require(['apphost'], function (appHost) {
function allowInput() {
// This would be nice but always seems to return true with electron
if (!isElectron && document.hidden) {
if (!isElectron && document.hidden) { /* eslint-disable-line compat/compat */
return false;
}
@ -254,7 +254,7 @@ require(['apphost'], function (appHost) {
var inputLoopTimer;
function runInputLoop() {
// Get the latest gamepad state.
var gamepads = navigator.getGamepads();
var gamepads = navigator.getGamepads(); /* eslint-disable-line compat/compat */
for (var i = 0, len = gamepads.length; i < len; i++) {
var gamepad = gamepads[i];
if (!gamepad) {
@ -362,7 +362,7 @@ require(['apphost'], function (appHost) {
}
function isGamepadConnected() {
var gamepads = navigator.getGamepads();
var gamepads = navigator.getGamepads(); /* eslint-disable-line compat/compat */
for (var i = 0, len = gamepads.length; i < len; i++) {
var gamepad = gamepads[i];
if (gamepad && gamepad.connected) {
@ -373,6 +373,7 @@ require(['apphost'], function (appHost) {
}
function onFocusOrGamepadAttach(e) {
/* eslint-disable-next-line compat/compat */
if (isGamepadConnected() && document.hasFocus()) {
console.log("Gamepad connected! Starting input loop");
startInputLoop();
@ -380,6 +381,7 @@ require(['apphost'], function (appHost) {
}
function onFocusOrGamepadDetach(e) {
/* eslint-disable-next-line compat/compat */
if (!isGamepadConnected() || !document.hasFocus()) {
console.log("Gamepad disconnected! No other gamepads are connected, stopping input loop");
stopInputLoop();

View file

@ -159,7 +159,9 @@ function attachGamepadScript(e) {
}
// No need to check for gamepads manually at load time, the eventhandler will be fired for that
window.addEventListener("gamepadconnected", attachGamepadScript);
if (navigator.getGamepads) { /* eslint-disable-line compat/compat */
window.addEventListener("gamepadconnected", attachGamepadScript);
}
export default {
enable: enable,

View file

@ -90,7 +90,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
});
}
if (itemHelper.supportsAddingToPlaylist(item)) {
if (itemHelper.supportsAddingToPlaylist(item) && options.playlist !== false) {
commands.push({
name: globalize.translate("AddToPlaylist"),
id: "addtoplaylist",
@ -339,7 +339,9 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
fileDownloader.download([{
url: downloadHref,
itemId: itemId,
serverId: serverId
serverId: serverId,
title: item.Name,
filename: item.Path.replace(/^.*[\\\/]/, '')
}]);
getResolveFunction(getResolveFunction(resolve, id), id)();
});
@ -352,6 +354,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
document.body.appendChild(textArea);
textArea.focus();
textArea.select();
if (document.execCommand("copy")) {
require(["toast"], function (toast) {
toast(globalize.translate("CopyStreamURLSuccess"));
@ -361,14 +364,19 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
}
document.body.removeChild(textArea);
};
/* eslint-disable-next-line compat/compat */
if (navigator.clipboard === undefined) {
textAreaCopy();
} else {
/* eslint-disable-next-line compat/compat */
navigator.clipboard.writeText(downloadHref).then(function () {
require(["toast"], function (toast) {
toast(globalize.translate("CopyStreamURLSuccess"));
});
}, textAreaCopy);
}).catch(function () {
textAreaCopy();
});
}
getResolveFunction(resolve, id)();
break;

View file

@ -45,7 +45,7 @@ define(['browser', 'appSettings', 'events'], function (browser, appSettings, eve
// Take a guess at initial layout. The consuming app can override
if (browser.mobile) {
this.setLayout('mobile', false);
} else if (browser.tv || browser.xboxOne) {
} else if (browser.tv || browser.xboxOne || browser.ps4) {
this.setLayout('tv', false);
} else {
this.setLayout(this.defaultLayout || 'tv', false);

View file

@ -4,10 +4,6 @@ define(['visibleinviewport', 'dom', 'browser'], function (visibleinviewport, dom
var thresholdX;
var thresholdY;
var requestIdleCallback = window.requestIdleCallback || function (fn) {
fn();
};
function resetThresholds() {
var threshold = 0.3;

View file

@ -6,6 +6,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
document.removeEventListener('keydown', onOneDocumentClick);
if (window.Notification) {
/* eslint-disable-next-line compat/compat */
Notification.requestPermission();
}
}
@ -26,6 +27,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
}
function resetRegistration() {
/* eslint-disable-next-line compat/compat */
var serviceWorker = navigator.serviceWorker;
if (serviceWorker) {
serviceWorker.ready.then(function (registration) {

View file

@ -1,4 +1,4 @@
define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', 'layoutManager', 'playbackManager', 'nowPlayingHelper', 'apphost', 'dom', 'connectionManager', 'paper-icon-button-light', 'emby-ratingbutton'], function (require, datetime, itemHelper, events, browser, imageLoader, layoutManager, playbackManager, nowPlayingHelper, appHost, dom, connectionManager) {
define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader', 'layoutManager', 'playbackManager', 'nowPlayingHelper', 'apphost', 'dom', 'connectionManager', 'itemContextMenu', 'paper-icon-button-light', 'emby-ratingbutton'], function (require, datetime, itemHelper, events, browser, imageLoader, layoutManager, playbackManager, nowPlayingHelper, appHost, dom, connectionManager, itemContextMenu) {
'use strict';
var currentPlayer;
@ -66,7 +66,7 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
html += '</div>';
html += '<button is="paper-icon-button-light" class="playPauseButton mediaButton"><i class="material-icons">pause</i></button>';
html += '<button is="paper-icon-button-light" class="remoteControlButton mediaButton"><i class="material-icons playlist_play"></i></button>';
html += '<button is="paper-icon-button-light" class="btnToggleContextMenu"><i class="material-icons more_vert"></i></button>';
html += '</div>';
html += '</div>';
@ -155,8 +155,6 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
}
});
elem.querySelector('.remoteControlButton').addEventListener('click', showRemoteControl);
toggleRepeatButton = elem.querySelector('.toggleRepeatButton');
toggleRepeatButton.addEventListener('click', function () {
@ -187,29 +185,15 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
volumeSliderContainer.classList.remove('hide');
}
var volumeSliderTimer;
function setVolume() {
clearTimeout(volumeSliderTimer);
volumeSliderTimer = null;
if (currentPlayer) {
currentPlayer.setVolume(this.value);
}
}
function setVolumeDelayed() {
if (!volumeSliderTimer) {
var that = this;
volumeSliderTimer = setTimeout(function () {
setVolume.call(that);
}, 700);
}
}
volumeSlider.addEventListener('change', setVolume);
volumeSlider.addEventListener('mousemove', setVolumeDelayed);
volumeSlider.addEventListener('touchmove', setVolumeDelayed);
volumeSlider.addEventListener('mousemove', setVolume);
volumeSlider.addEventListener('touchmove', setVolume);
positionSlider = elem.querySelector('.nowPlayingBarPositionSlider');
positionSlider.addEventListener('change', function () {
@ -240,8 +224,8 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
elem.addEventListener('click', function (e) {
if (!dom.parentWithTag(e.target, ['BUTTON', 'INPUT', 'A'])) {
showRemoteControl(0);
if (!dom.parentWithTag(e.target, ['BUTTON', 'INPUT'])) {
showRemoteControl();
}
});
}
@ -449,17 +433,13 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
}
}
function getTextActionButton(item, text, serverId) {
function getTextActionButton(item, text) {
if (!text) {
text = itemHelper.getDisplayName(item);
}
var html = '<button data-id="' + item.Id + '" data-serverid="' + (item.ServerId || serverId) + '" data-type="' + item.Type + '" data-mediatype="' + item.MediaType + '" data-channelid="' + item.ChannelId + '" data-isfolder="' + item.IsFolder + '" type="button" class="itemAction textActionButton" data-action="link">';
html += text;
html += '</button>';
return html;
return `<a>${text}</a>`;
}
function seriesImageUrl(item, options) {
@ -537,16 +517,16 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
if (textLines.length > 1) {
textLines[1].secondary = true;
}
var serverId = nowPlayingItem ? nowPlayingItem.ServerId : null;
nowPlayingTextElement.innerHTML = textLines.map(function (nowPlayingName) {
var cssClass = nowPlayingName.secondary ? ' class="nowPlayingBarSecondaryText"' : '';
if (nowPlayingName.item) {
return '<div' + cssClass + '>' + getTextActionButton(nowPlayingName.item, nowPlayingName.text, serverId) + '</div>';
var nowPlayingText = getTextActionButton(nowPlayingName.item, nowPlayingName.text);
return `<div ${cssClass}>${nowPlayingText}</div>`;
}
return '<div' + cssClass + '>' + nowPlayingName.text + '</div>';
return `<div ${cssClass}>${nowPlayingText}</div>`;
}).join('');
@ -575,15 +555,25 @@ define(['require', 'datetime', 'itemHelper', 'events', 'browser', 'imageLoader',
if (isRefreshing) {
var apiClient = connectionManager.getApiClient(nowPlayingItem.ServerId);
apiClient.getItem(apiClient.getCurrentUserId(), nowPlayingItem.Id).then(function (item) {
var userData = item.UserData || {};
var likes = userData.Likes == null ? '' : userData.Likes;
var contextButton = document.querySelector('.btnToggleContextMenu');
var options = {
play: false,
queue: false,
positionTo: contextButton
};
nowPlayingUserData.innerHTML = '<button is="emby-ratingbutton" type="button" class="listItemButton mediaButton paper-icon-button-light" data-id="' + item.Id + '" data-serverid="' + item.ServerId + '" data-itemtype="' + item.Type + '" data-likes="' + likes + '" data-isfavorite="' + (userData.IsFavorite) + '"><i class="material-icons">favorite</i></button>';
apiClient.getCurrentUser().then(function(user) {
contextButton.addEventListener('click', function () {
itemContextMenu.show(Object.assign({
item: item,
user: user
}, options ));
});
});
});
}
} else {
nowPlayingUserData.innerHTML = '';

View file

@ -44,24 +44,15 @@ define(['connectionManager', 'globalize', 'userSettings', 'apphost'], function (
}
function showBlurayMessage() {
var message =
'Playback of Bluray folders in this app is experimental. Some titles may not work at all. For a better experience, consider converting to mkv video files, or use an Jellyfin app with native Bluray folder support.';
return showMessage(message, 'blurayexpirementalinfo', 'nativeblurayplayback');
return showMessage(globalize.translate("UnsupportedPlayback"), 'blurayexpirementalinfo', 'nativeblurayplayback');
}
function showDvdMessage() {
var message =
'Playback of Dvd folders in this app is experimental. Some titles may not work at all. For a better experience, consider converting to mkv video files, or use an Jellyfin app with native Dvd folder support.';
return showMessage(message, 'dvdexpirementalinfo', 'nativedvdplayback');
return showMessage(globalize.translate("UnsupportedPlayback"), 'dvdexpirementalinfo', 'nativedvdplayback');
}
function showIsoMessage() {
var message =
'Playback of ISO files in this app is experimental. Some titles may not work at all. For a better experience, consider converting to mkv video files, or use an Jellyfin app with native ISO support.';
return showMessage(message, 'isoexpirementalinfo', 'nativeisoplayback');
return showMessage(globalize.translate("UnsupportedPlayback"), 'isoexpirementalinfo', 'nativeisoplayback');
}
function ExpirementalPlaybackWarnings() {

View file

@ -1,6 +1,9 @@
define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'playQueueManager', 'userSettings', 'globalize', 'connectionManager', 'loading', 'apphost', 'fullscreenManager'], function (events, datetime, appSettings, itemHelper, pluginManager, PlayQueueManager, userSettings, globalize, connectionManager, loading, apphost, fullscreenManager) {
define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'playQueueManager', 'userSettings', 'globalize', 'connectionManager', 'loading', 'apphost', 'screenfull'], function (events, datetime, appSettings, itemHelper, pluginManager, PlayQueueManager, userSettings, globalize, connectionManager, loading, apphost, screenfull) {
'use strict';
/** Delay time in ms for reportPlayback logging */
const reportPlaybackLogDelay = 1e3;
function enableLocalPlaylistManagement(player) {
if (player.getPlaylist) {
@ -17,7 +20,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
}
function bindToFullscreenChange(player) {
events.on(fullscreenManager, 'fullscreenchange', function () {
screenfull.on('change', function () {
events.trigger(player, 'fullscreenchange');
});
}
@ -38,6 +41,12 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
events.trigger(playbackManagerInstance, 'playerchange', [newPlayer, newTarget, previousPlayer]);
}
/** Last invoked method */
let reportPlaybackLastMethod;
/** Last invoke time of method */
let reportPlaybackLastTime;
function reportPlayback(playbackManagerInstance, state, player, reportPlaylist, serverId, method, progressEventName) {
if (!serverId) {
@ -57,7 +66,14 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
addPlaylistToPlaybackReport(playbackManagerInstance, info, player, serverId);
}
console.debug(method + '-' + JSON.stringify(info));
const now = (new Date).getTime();
if (method !== reportPlaybackLastMethod || now - (reportPlaybackLastTime || 0) >= reportPlaybackLogDelay) {
console.debug(method + '-' + JSON.stringify(info));
reportPlaybackLastMethod = method;
reportPlaybackLastTime = now;
}
var apiClient = connectionManager.getApiClient(serverId);
apiClient[method](info);
}
@ -1518,7 +1534,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.isFullscreen();
}
return fullscreenManager.isFullScreen();
return screenfull.isFullscreen;
};
self.toggleFullscreen = function (player) {
@ -1528,10 +1544,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
return player.toggleFulscreen();
}
if (fullscreenManager.isFullScreen()) {
fullscreenManager.exitFullscreen();
} else {
fullscreenManager.requestFullscreen();
if (screenfull.isEnabled) {
screenfull.toggle();
}
};
@ -3140,7 +3154,7 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
AllowVideoStreamCopy: false,
AllowAudioStreamCopy: currentlyPreventsAudioStreamCopy || currentlyPreventsVideoStreamCopy ? false : null
}, true);
});
return;
}
@ -3378,7 +3392,6 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
pluginManager.ofType('mediaplayer').map(initMediaPlayer);
function sendProgressUpdate(player, progressEventName, reportPlaylist) {
if (!player) {
throw new Error('player cannot be null');
}

View file

@ -17,6 +17,7 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager
var isLocalVideo = player.isLocalPlayer && !player.isExternalPlayer && playbackManager.isPlayingVideo(player);
if (isLocalVideo && layoutManager.mobile) {
/* eslint-disable-next-line compat/compat */
var lockOrientation = screen.lockOrientation || screen.mozLockOrientation || screen.msLockOrientation || (screen.orientation && screen.orientation.lock);
if (lockOrientation) {
@ -40,6 +41,7 @@ define(['playbackManager', 'layoutManager', 'events'], function (playbackManager
if (orientationLocked && !playbackStopInfo.nextMediaType) {
/* eslint-disable-next-line compat/compat */
var unlockOrientation = screen.unlockOrientation || screen.mozUnlockOrientation || screen.msUnlockOrientation || (screen.orientation && screen.orientation.unlock);
if (unlockOrientation) {

View file

@ -1,3 +1,7 @@
.nowPlayingPage {
padding: 5em 0 0 0 !important;
}
.nowPlayingInfoContainer {
display: -webkit-box;
display: -webkit-flex;
@ -36,8 +40,30 @@
margin: 0 0 0.5em 0.5em;
}
.nowPlayingAlbum a,
.nowPlayingArtist a {
font-weight: normal;
text-align: left !important;
color: inherit !important;
}
.nowPlayingButtonsContainer {
display: flex;
}
.nowPlayingInfoContainerMedia {
text-align: left;
margin-bottom: 1em;
}
.nowPlayingPositionSlider {
width: stretch;
}
.nowPlayingPositionSliderContainer {
margin: 0.7em 0 0.7em 1em;
margin: 0.2em 1em 0.2em 1em;
width: 100%;
z-index: 0;
}
.nowPlayingInfoButtons {
@ -59,17 +85,32 @@
}
.nowPlayingPageImageContainer {
width: 20%;
margin-right: 0.25em;
width: 16%;
margin-right: 1em;
position: relative;
-webkit-flex-shrink: 0;
flex-shrink: 0;
}
@media all and (min-width: 50em) {
.nowPlayingPageImageContainer {
width: 16%;
}
.nowPlayingPageImageContainerNoAlbum {
width: 100%;
position: relative;
}
.nowPlayingPageImageContainerNoAlbum button {
cursor: default;
}
.nowPlayingPageImageContainerNoAlbum::after {
content: "";
display: block;
padding-bottom: 100%;
}
.btnPlayPause {
font-size: xx-large;
padding: 0;
margin: 0;
}
.nowPlayingInfoControls {
@ -87,14 +128,15 @@
}
.nowPlayingPageImage {
display: block;
bottom: 0;
left: 0;
right: 0;
margin: 0 auto;
width: 100%;
-webkit-box-shadow: 0 0 1.9vh #000;
box-shadow: 0 0 1.9vh #000;
border: 0.1em solid #222;
user-drag: none;
user-select: none;
-moz-user-select: none;
-webkit-user-drag: none;
@ -102,60 +144,16 @@
-ms-user-select: none;
}
@media all and (orientation: portrait) and (max-width: 50em) {
.nowPlayingInfoContainer {
-webkit-box-orient: vertical !important;
-webkit-box-direction: normal !important;
-webkit-flex-direction: column !important;
flex-direction: column !important;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
}
.nowPlayingPageTitle {
text-align: center;
margin: 0.5em 0 0.75em;
}
.nowPlayingPositionSliderContainer {
margin: 0.7em 1em;
}
.nowPlayingInfoButtons {
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center;
}
.nowPlayingPageImageContainer {
width: auto;
margin-right: 0;
}
.nowPlayingInfoControls {
margin-top: 1em;
max-width: 100%;
}
.nowPlayingPageImage {
width: auto;
height: 36vh;
}
.contextMenuList {
padding: 1.5em 0;
}
@media all and (orientation: portrait) and (max-width: 40em) {
.nowPlayingPageImage {
height: 30vh;
}
.contextMenuList a {
color: inherit !important;
}
.nowPlayingTime {
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
margin: 0 1em;
.contextMenuList i.listItemIcon {
font-size: x-large;
}
.nowPlayingSecondaryButtons {
@ -167,12 +165,17 @@
align-items: center;
-webkit-flex-wrap: wrap;
flex-wrap: wrap;
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center;
-webkit-box-pack: end;
-webkit-justify-content: flex-end;
justify-content: flex-end;
z-index: 0;
}
@media all and (min-width: 50em) {
@media all and (min-width: 63em) {
.nowPlayingPage {
padding: 8em 0 0 0 !important;
}
.nowPlayingSecondaryButtons {
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
@ -181,6 +184,16 @@
-webkit-justify-content: flex-end;
justify-content: flex-end;
}
.nowPlayingPageUserDataButtonsTitle {
display: none !important;
}
.playlistSectionButton,
.nowPlayingPlaylist,
.nowPlayingContextMenu {
background: unset !important;
}
}
@media all and (min-width: 80em) {
@ -189,6 +202,414 @@
}
}
@media all and (orientation: portrait) and (max-width: 47em) {
.remoteControlContent {
padding-left: 7.3% !important;
padding-right: 7.3% !important;
display: flex;
height: 100%;
flex-direction: column;
}
.nowPlayingInfoContainer {
-webkit-box-orient: vertical !important;
-webkit-box-direction: normal !important;
-webkit-flex-direction: column !important;
flex-direction: column !important;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
width: 100%;
height: calc(100% - 4.2em);
}
.nowPlayingPageTitle {
/* text-align: center; */
margin: 0;
}
.nowPlayingAlbum,
.nowPlayingArtist {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.nowPlayingInfoContainerMedia {
text-align: left !important;
width: 80%;
}
.nowPlayingPositionSliderContainer {
margin: 0.2em 1em 0.2em 1em;
}
.nowPlayingInfoButtons {
/* margin: 1.5em 0 0 0; */
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center;
font-size: x-large;
height: 100%;
}
.nowPlayingPageImageContainer {
width: 100%;
margin: auto auto 0.5em;
}
.nowPlayingPageImageContainerNoAlbum .cardImageContainer .cardImageIcon {
font-size: 15em;
color: inherit;
}
.nowPlayingInfoControls {
margin: 0.5em 0 1em 0;
width: 100%;
-webkit-box-pack: start !important;
-webkit-justify-content: start !important;
justify-content: start !important;
}
.nowPlayingSecondaryButtons {
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center;
}
.nowPlayingInfoControls .nowPlayingPageUserDataButtonsTitle {
width: 20%;
font-size: large;
}
.nowPlayingInfoControls .nowPlayingPageUserDataButtonsTitle button {
padding-top: 0;
padding-right: 0;
margin-right: 0;
float: right;
border-radius: 0;
}
.nowPlayingInfoButtons .btnRewind {
position: absolute;
left: 0;
margin-left: 0;
padding-left: 7.3%;
font-size: smaller;
}
.nowPlayingInfoButtons .btnFastForward {
position: absolute;
right: 0;
margin-right: 0;
padding-right: 7.3%;
font-size: smaller;
}
.paper-icon-button-light:hover {
color: #fff !important;
background-color: transparent !important;
}
.btnPlayPause {
padding: 0;
margin: 0;
font-size: 1.7em;
}
.btnPlayPause:hover {
background-color: transparent !important;
}
.nowPlayingPageImage {
/* width: inherit; */
overflow-y: hidden;
overflow: hidden;
margin: 0 auto;
}
.nowPlayingPageImage.nowPlayingPageImageAudio {
width: 100%;
}
.nowPlayingPageImageContainer.nowPlayingPageImagePoster {
height: 50%;
overflow: hidden;
}
.nowPlayingPageImageContainer.nowPlayingPageImagePoster img {
height: 100%;
width: auto;
}
#nowPlayingPage .playlistSection .playlist,
#nowPlayingPage .playlistSection .contextMenu {
position: absolute;
top: 12.2em;
bottom: 4.2em;
overflow: scroll;
padding: 0 1em;
display: inline-block;
left: 0;
right: 0;
z-index: 1000;
}
.playlistSectionButton {
position: fixed;
bottom: 0;
left: 0;
height: 4.2em;
right: 0;
padding-left: 7.3%;
padding-right: 7.3%;
}
.playlistSectionButton .btnTogglePlaylist {
font-size: larger;
margin: 0;
padding-left: 0;
}
.playlistSectionButton .btnSavePlaylist {
margin: 0;
padding-right: 0;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1;
-webkit-box-pack: end;
-webkit-justify-content: flex-end;
justify-content: flex-end;
border-radius: 0;
}
.playlistSectionButton .btnToggleContextMenu {
font-size: larger;
margin: 0;
padding-right: 0;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1;
-webkit-box-pack: end;
-webkit-justify-content: flex-end;
justify-content: flex-end;
border-radius: 0;
}
.playlistSectionButton .volumecontrol {
width: 100%;
}
.remoteControlSection {
margin: 0;
padding: 0 0 4.2em 0;
}
.nowPlayingButtonsContainer {
display: flex;
height: 100%;
flex-direction: column;
}
}
@media all and (orientation: landscape) and (max-width: 63em) {
.remoteControlContent {
padding-left: 4.3% !important;
padding-right: 4.3% !important;
display: flex;
height: 100%;
flex-direction: column;
}
.nowPlayingInfoContainer {
-webkit-box-orient: horizontal !important;
-webkit-box-direction: normal !important;
-webkit-flex-direction: row !important;
flex-direction: row !important;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
width: 100%;
height: calc(100% - 4.2em);
}
.nowPlayingPageTitle {
/* text-align: center; */
margin: 0;
}
.nowPlayingInfoContainerMedia {
text-align: left !important;
width: 80%;
}
.nowPlayingPositionSliderContainer {
margin: 0.2em 1em 0.2em 1em;
}
.nowPlayingInfoButtons {
/* margin: 1.5em 0 0 0; */
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center;
font-size: x-large;
height: 100%;
}
.nowPlayingPageImageContainer {
width: 30%;
margin: auto 1em auto auto;
}
.nowPlayingPageImageContainerNoAlbum .cardImageContainer .cardImageIcon {
font-size: 12em;
color: inherit;
}
.nowPlayingInfoControls {
margin: 0.5em 0 1em 0;
width: 100%;
-webkit-box-pack: start !important;
-webkit-justify-content: start !important;
justify-content: start !important;
}
.nowPlayingSecondaryButtons {
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1;
-webkit-box-pack: center;
-webkit-justify-content: center;
justify-content: center;
}
.nowPlayingInfoControls .nowPlayingPageUserDataButtonsTitle {
width: 20%;
font-size: large;
}
.nowPlayingInfoControls .nowPlayingPageUserDataButtonsTitle button {
padding-top: 0;
padding-right: 0;
margin-right: 0;
float: right;
border-radius: 0;
}
.paper-icon-button-light:hover {
color: #fff !important;
background-color: transparent !important;
}
.btnPlayPause {
padding: 0;
margin: 0;
font-size: 1.7em;
}
.btnPlayPause:hover {
background-color: transparent !important;
}
.nowPlayingPageImage {
/* width: inherit; */
overflow-y: hidden;
overflow: hidden;
margin: 0 auto;
}
.nowPlayingPageImage.nowPlayingPageImageAudio {
width: 100%;
}
.nowPlayingPageImageContainer.nowPlayingPageImagePoster {
height: 100%;
overflow: hidden;
}
.nowPlayingPageImageContainer.nowPlayingPageImagePoster img {
height: 100%;
width: auto;
}
#nowPlayingPage .playlistSection .playlist,
#nowPlayingPage .playlistSection .contextMenu {
position: absolute;
top: 7.2em;
bottom: 4.2em;
overflow: scroll;
padding: 0 1em;
display: inline-block;
left: 0;
right: 0;
z-index: 1000;
}
.playlistSectionButton {
position: fixed;
bottom: 0;
left: 0;
height: 4.2em;
right: 0;
padding-left: 4.3%;
padding-right: 4.3%;
}
.playlistSectionButton .btnTogglePlaylist {
font-size: larger;
margin: 0;
padding-left: 0;
}
.playlistSectionButton .btnSavePlaylist {
margin: 0;
padding-right: 0;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1;
-webkit-box-pack: end;
-webkit-justify-content: flex-end;
justify-content: flex-end;
border-radius: 0;
}
.playlistSectionButton .btnToggleContextMenu {
font-size: larger;
margin: 0;
padding-right: 0;
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
flex-grow: 1;
-webkit-box-pack: end;
-webkit-justify-content: flex-end;
justify-content: flex-end;
border-radius: 0;
}
.playlistSectionButton .volumecontrol {
width: 100%;
}
.remoteControlSection {
margin: 4.2em 0 0 0;
padding: 0 0 4.2em 0;
}
.nowPlayingButtonsContainer {
display: flex;
height: 100%;
flex-direction: column;
}
}
.nowPlayingTime {
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
margin: 0 1em;
}
.nowPlayingNavButtonContainer {
width: 30em;
}
@ -214,8 +635,11 @@
width: 9em;
}
@media all and (max-width: 50em) {
.nowPlayingInfoButtons .nowPlayingPageUserDataButtons {
@media all and (max-width: 63em) {
.nowPlayingSecondaryButtons .nowPlayingPageUserDataButtons,
.nowPlayingSecondaryButtons .repeatToggleButton,
.nowPlayingInfoButtons .playlist .listItemMediaInfo,
.nowPlayingInfoButtons .btnStop {
display: none !important;
}
@ -223,17 +647,3 @@
font-size: 4em;
}
}
@media all and (max-width: 47em) {
.nowPlayingInfoButtons .repeatToggleButton {
display: none !important;
}
}
@media all and (max-width: 34em) {
.nowPlayingInfoButtons .btnNowPlayingFastForward,
.nowPlayingInfoButtons .btnNowPlayingRewind,
.nowPlayingInfoButtons .playlist .listItemMediaInfo {
display: none !important;
}
}

View file

@ -1,4 +1,4 @@
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) {
define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageLoader", "playbackManager", "nowPlayingHelper", "events", "connectionManager", "apphost", "globalize", "layoutManager", "userSettings", "cardBuilder", "cardStyle", "emby-itemscontainer", "css!./remotecontrol.css", "emby-ratingbutton"], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings, cardBuilder) {
"use strict";
function showAudioMenu(context, player, button, item) {
@ -110,49 +110,93 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
return null;
}
function updateNowPlayingInfo(context, state) {
function updateNowPlayingInfo(context, state, serverId) {
var item = state.NowPlayingItem;
var displayName = item ? getNowPlayingNameHtml(item).replace("<br/>", " - ") : "";
context.querySelector(".nowPlayingPageTitle").innerHTML = displayName;
if (typeof item !== 'undefined') {
var nowPlayingServerId = (item.ServerId || serverId);
if (item.Type == "Audio" || item.MediaStreams[0].Type == "Audio") {
var songName = item.Name;
if (item.Album != null && item.Artists != null) {
var albumName = item.Album;
var artistName;
if (item.ArtistItems != null) {
artistName = item.ArtistItems[0].Name;
context.querySelector(".nowPlayingAlbum").innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.AlbumId + `&amp;serverId=${nowPlayingServerId}">${albumName}</a>`;
context.querySelector(".nowPlayingArtist").innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.ArtistItems[0].Id + `&amp;serverId=${nowPlayingServerId}">${artistName}</a>`;
context.querySelector(".contextMenuAlbum").innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.AlbumId + `&amp;serverId=${nowPlayingServerId}"><i class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons album"></i> ` + globalize.translate("ViewAlbum") + '</a>';
context.querySelector(".contextMenuArtist").innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.ArtistItems[0].Id + `&amp;serverId=${nowPlayingServerId}"><i class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons person"></i> ` + globalize.translate("ViewArtist") + '</a>';
} else {
artistName = item.Artists;
context.querySelector(".nowPlayingAlbum").innerHTML = albumName;
context.querySelector(".nowPlayingArtist").innerHTML = artistName;
}
}
context.querySelector(".nowPlayingSongName").innerHTML = songName;
} else if (item.Type == "Episode") {
if (item.SeasonName != null) {
var seasonName = item.SeasonName;
context.querySelector(".nowPlayingSeason").innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.SeasonId + `&amp;serverId=${nowPlayingServerId}">${seasonName}</a>`;
}
if (item.SeriesName != null) {
var seriesName = item.SeriesName;
if (item.SeriesId !=null) {
context.querySelector(".nowPlayingSerie").innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.SeriesId + `&amp;serverId=${nowPlayingServerId}">${seriesName}</a>`;
} else {
context.querySelector(".nowPlayingSerie").innerHTML = seriesName;
}
}
context.querySelector(".nowPlayingEpisode").innerHTML = item.Name;
} else {
context.querySelector(".nowPlayingPageTitle").innerHTML = displayName;
}
if (displayName.length > 0) {
context.querySelector(".nowPlayingPageTitle").classList.remove("hide");
} else {
context.querySelector(".nowPlayingPageTitle").classList.add("hide");
}
if (displayName.length > 0 && item.Type != "Audio" && item.Type != "Episode") {
context.querySelector(".nowPlayingPageTitle").classList.remove("hide");
} else {
context.querySelector(".nowPlayingPageTitle").classList.add("hide");
}
var url = item ? seriesImageUrl(item, {
maxHeight: 300 * 2
}) || imageUrl(item, {
maxHeight: 300 * 2
}) : null;
var url = item ? seriesImageUrl(item, {
maxHeight: 300 * 2
}) || imageUrl(item, {
maxHeight: 300 * 2
}) : null;
console.debug("updateNowPlayingInfo");
setImageUrl(context, url);
if (item) {
backdrop.setBackdrops([item]);
var apiClient = connectionManager.getApiClient(item.ServerId);
apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) {
var userData = fullItem.UserData || {};
var likes = null == userData.Likes ? "" : userData.Likes;
context.querySelector(".nowPlayingPageUserDataButtons").innerHTML = '<button is="emby-ratingbutton" type="button" class="listItemButton paper-icon-button-light" data-id="' + fullItem.Id + '" data-serverid="' + fullItem.ServerId + '" data-itemtype="' + fullItem.Type + '" data-likes="' + likes + '" data-isfavorite="' + userData.IsFavorite + '"><i class="material-icons">favorite</i></button>';
});
} else {
backdrop.clear();
context.querySelector(".nowPlayingPageUserDataButtons").innerHTML = "";
console.debug("updateNowPlayingInfo");
setImageUrl(context, state, url);
if (item) {
backdrop.setBackdrops([item]);
var apiClient = connectionManager.getApiClient(item.ServerId);
apiClient.getItem(apiClient.getCurrentUserId(), item.Id).then(function (fullItem) {
var userData = fullItem.UserData || {};
var likes = null == userData.Likes ? "" : userData.Likes;
context.querySelector(".nowPlayingPageUserDataButtonsTitle").innerHTML = '<button is="emby-ratingbutton" type="button" class="listItemButton paper-icon-button-light" data-id="' + fullItem.Id + '" data-serverid="' + fullItem.ServerId + '" data-itemtype="' + fullItem.Type + '" data-likes="' + likes + '" data-isfavorite="' + userData.IsFavorite + '"><i class="material-icons">favorite</i></button>';
context.querySelector(".nowPlayingPageUserDataButtons").innerHTML = '<button is="emby-ratingbutton" type="button" class="listItemButton paper-icon-button-light" data-id="' + fullItem.Id + '" data-serverid="' + fullItem.ServerId + '" data-itemtype="' + fullItem.Type + '" data-likes="' + likes + '" data-isfavorite="' + userData.IsFavorite + '"><i class="material-icons">favorite</i></button>';
});
} else {
backdrop.clear();
context.querySelector(".nowPlayingPageUserDataButtons").innerHTML = "";
}
}
}
function setImageUrl(context, url) {
function setImageUrl(context, state, url) {
currentImgUrl = url;
var item = state.NowPlayingItem;
var imgContainer = context.querySelector(".nowPlayingPageImageContainer");
if (url) {
imgContainer.innerHTML = '<img class="nowPlayingPageImage" src="' + url + '" />';
imgContainer.classList.remove("hide");
if (item.Type == "Audio") {
context.querySelector(".nowPlayingPageImage").classList.add("nowPlayingPageImageAudio");
context.querySelector(".nowPlayingPageImageContainer").classList.remove("nowPlayingPageImageAudio");
} else {
context.querySelector(".nowPlayingPageImageContainer").classList.add("nowPlayingPageImagePoster");
context.querySelector(".nowPlayingPageImage").classList.remove("nowPlayingPageImageAudio");
}
} else {
imgContainer.classList.add("hide");
imgContainer.innerHTML = "";
imgContainer.innerHTML = '<div class="nowPlayingPageImageContainerNoAlbum"><button data-action="link" class="cardContent-button cardImageContainer coveredImage ' + cardBuilder.getDefaultBackgroundClass(item.Name) + ' cardContent cardContent-shadow itemAction"><i class="cardImageIcon material-icons">album</i></button></div>';
}
}
@ -199,28 +243,35 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
var supportedCommands = playerInfo.supportedCommands;
currentPlayerSupportedCommands = supportedCommands;
var playState = state.PlayState || {};
buttonVisible(context.querySelector(".btnToggleFullscreen"), item && "Video" == item.MediaType && -1 != supportedCommands.indexOf("ToggleFullscreen"));
var isSupportedCommands = supportedCommands.includes("DisplayMessage") || supportedCommands.includes("SendString") || supportedCommands.includes("Select");
buttonVisible(context.querySelector(".btnToggleFullscreen"), item && "Video" == item.MediaType && supportedCommands.includes("ToggleFullscreen"));
updateAudioTracksDisplay(player, context);
updateSubtitleTracksDisplay(player, context);
if (-1 != supportedCommands.indexOf("DisplayMessage") && !currentPlayer.isLocalPlayer) {
if (supportedCommands.includes("DisplayMessage") && !currentPlayer.isLocalPlayer) {
context.querySelector(".sendMessageSection").classList.remove("hide");
} else {
context.querySelector(".sendMessageSection").classList.add("hide");
}
if (-1 != supportedCommands.indexOf("SendString") && !currentPlayer.isLocalPlayer) {
if (supportedCommands.includes("SendString") && !currentPlayer.isLocalPlayer) {
context.querySelector(".sendTextSection").classList.remove("hide");
} else {
context.querySelector(".sendTextSection").classList.add("hide");
}
if (-1 != supportedCommands.indexOf("Select") && !currentPlayer.isLocalPlayer) {
if (supportedCommands.includes("Select") && !currentPlayer.isLocalPlayer) {
context.querySelector(".navigationSection").classList.remove("hide");
} else {
context.querySelector(".navigationSection").classList.add("hide");
}
if (isSupportedCommands && !currentPlayer.isLocalPlayer) {
context.querySelector(".remoteControlSection").classList.remove("hide");
} else {
context.querySelector(".remoteControlSection").classList.add("hide");
}
buttonVisible(context.querySelector(".btnStop"), null != item);
buttonVisible(context.querySelector(".btnNextTrack"), null != item);
buttonVisible(context.querySelector(".btnPreviousTrack"), null != item);
@ -331,7 +382,7 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
function updatePlayPauseState(isPaused, isActive) {
var context = dlg;
var btnPlayPause = context.querySelector(".btnPlayPause");
btnPlayPause.querySelector("i").innerHTML = isPaused ? "&#xE037;" : "pause";
btnPlayPause.querySelector("i").innerHTML = isPaused ? "&#xE038;" : "&#xE035;";
buttonVisible(btnPlayPause, isActive);
}
@ -374,9 +425,9 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
});
if (items.length) {
context.querySelector(".playlistSection").classList.remove("hide");
context.querySelector(".btnTogglePlaylist").classList.remove("hide");
} else {
context.querySelector(".playlistSection").classList.add("hide");
context.querySelector(".btnTogglePlaylist").classList.add("hide");
}
var itemsContainer = context.querySelector(".playlist");
@ -393,6 +444,9 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
}
imageLoader.lazyChildren(itemsContainer);
context.querySelector(".playlist").classList.add("hide");
context.querySelector(".contextMenu").classList.add("hide");
context.querySelector(".btnSavePlaylist").classList.add("hide");
});
}
@ -614,27 +668,25 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
return datetime.getDisplayRunningTime(ticks);
};
var volumeSliderTimer;
function setVolume() {
clearTimeout(volumeSliderTimer);
volumeSliderTimer = null;
playbackManager.setVolume(this.value, currentPlayer);
}
function setVolumeDelayed() {
if (!volumeSliderTimer) {
var that = this;
volumeSliderTimer = setTimeout(function () {
setVolume.call(that);
}, 700);
}
var contextmenuHtml = '<button id="toggleContextMenu" is="paper-icon-button-light" class="btnToggleContextMenu" title=' + globalize.translate('ButtonToggleContextMenu') + '><i class="material-icons more_vert"></i></button>';
var volumecontrolHtml = '<div class="volumecontrol flex align-items-center flex-wrap-wrap justify-content-center">';
volumecontrolHtml += '<button is="paper-icon-button-light" class="buttonMute autoSize" title=' + globalize.translate('Mute') + '><i class="xlargePaperIconButton material-icons"></i></button>';
volumecontrolHtml += '<div class="sliderContainer nowPlayingVolumeSliderContainer"><input is="emby-slider" type="range" step="1" min="0" max="100" value="0" class="nowPlayingVolumeSlider"/></div>';
volumecontrolHtml += '</div>';
if (!layoutManager.mobile) {
context.querySelector(".nowPlayingSecondaryButtons").innerHTML += volumecontrolHtml;
context.querySelector(".playlistSectionButton").innerHTML += contextmenuHtml;
} else {
context.querySelector(".playlistSectionButton").innerHTML += volumecontrolHtml + contextmenuHtml;
}
context.querySelector(".nowPlayingVolumeSlider").addEventListener("change", setVolume);
context.querySelector(".nowPlayingVolumeSlider").addEventListener("mousemove", setVolumeDelayed);
context.querySelector(".nowPlayingVolumeSlider").addEventListener("touchmove", setVolumeDelayed);
context.querySelector(".nowPlayingVolumeSlider").addEventListener("mousemove", setVolume);
context.querySelector(".nowPlayingVolumeSlider").addEventListener("touchmove", setVolume);
context.querySelector(".buttonMute").addEventListener("click", function () {
playbackManager.toggleMute(currentPlayer);
});
@ -648,6 +700,27 @@ define(["browser", "datetime", "backdrop", "libraryBrowser", "listView", "imageL
playbackManager.movePlaylistItem(playlistItemId, newIndex, currentPlayer);
});
context.querySelector(".btnSavePlaylist").addEventListener("click", savePlaylist);
context.querySelector(".btnTogglePlaylist").addEventListener("click", function () {
if (context.querySelector(".playlist").classList.contains("hide")) {
context.querySelector(".playlist").classList.remove("hide");
context.querySelector(".btnSavePlaylist").classList.remove("hide");
context.querySelector(".contextMenu").classList.add("hide");
context.querySelector(".volumecontrol").classList.add("hide");
} else {
context.querySelector(".playlist").classList.add("hide");
context.querySelector(".btnSavePlaylist").classList.add("hide");
context.querySelector(".volumecontrol").classList.remove("hide");
}
});
context.querySelector(".btnToggleContextMenu").addEventListener("click", function () {
if (context.querySelector(".contextMenu").classList.contains("hide")) {
context.querySelector(".contextMenu").classList.remove("hide");
context.querySelector(".btnSavePlaylist").classList.add("hide");
context.querySelector(".playlist").classList.add("hide");
} else {
context.querySelector(".contextMenu").classList.add("hide");
}
});
}
function onPlayerChange() {

View file

@ -258,6 +258,11 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f
direction: 'horizontal',
// Loop is disabled due to the virtual slides option not supporting it.
loop: false,
zoom: {
minRatio: 1,
toggle: true,
containerClass: 'slider-zoom-container'
},
autoplay: !options.interactive,
keyboard: {
enabled: true
@ -307,8 +312,7 @@ define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'f
*/
function getSwiperSlideHtmlFromItem(item) {
return getSwiperSlideHtmlFromSlide({
imageUrl: getImgUrl(item),
originalImage: getImgUrl(item, true),
originalImage: getImgUrl(item),
//title: item.Name,
//description: item.Overview
Id: item.Id,

View file

@ -41,17 +41,12 @@
}
.swiper-slide-img {
width: auto;
height: auto;
max-width: 100%;
max-height: 100%;
-ms-transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
position: absolute;
left: 50%;
top: 50%;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
}
.slideshowButtonIcon {
@ -138,3 +133,12 @@
.slideSubtitle {
color: #ccc;
}
.swiper-slide {
display: flex;
flex-direction: column;
}
.slider-zoom-container {
margin: auto;
}

View file

@ -24,9 +24,11 @@ define(["apphost", "appSettings", "dom", "connectionManager", "loading", "layout
page.querySelector("#txtManualPassword").value = "";
loading.hide();
if (response.status === 401) {
const UnauthorizedOrForbidden = [401, 403];
if (UnauthorizedOrForbidden.includes(response.status)) {
require(["toast"], function (toast) {
toast(Globalize.translate("MessageInvalidUser"));
const messageKey = response.status === 401 ? "MessageInvalidUser" : "MessageUnauthorizedUser";
toast(Globalize.translate(messageKey));
});
} else {
Dashboard.alert({

View file

@ -95,7 +95,7 @@ define(["loading", "appRouter", "layoutManager", "appSettings", "apphost", "focu
}
function showServerConnectionFailure() {
alertText(globalize.translate("MessageUnableToConnectToServer"), globalize.translate("HeaderConnectionFailure"));
alertText(globalize.translate("MessageUnableToConnectToServer"));
}
return function (view, params) {

View file

@ -336,7 +336,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
return html = html.join(" / ");
}
function renderName(item, container, isStatic, context) {
var parentRoute;
var parentNameHtml = [];
@ -401,14 +400,25 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
} else if (item.Album) {
parentNameHtml.push(item.Album);
}
// FIXME: This whole section needs some refactoring, so it becames easier to scale across all form factors. See GH #1022
var html = "";
var tvShowHtml = parentNameHtml[0];
var tvSeasonHtml = parentNameHtml[1];
if (parentNameHtml.length) {
if (parentNameLast) {
html = '<h3 class="parentName" style="margin: .25em 0;">' + parentNameHtml.join(" - ") + "</h3>";
// Music
if (layoutManager.mobile) {
html = '<h3 class="parentName" style="margin: .25em 0;">' + parentNameHtml.join("</br>") + "</h3>";
} else {
html = '<h3 class="parentName" style="margin: .25em 0;">' + parentNameHtml.join(" - ") + "</h3>";
}
} else {
html = '<h1 class="parentName" style="margin: .1em 0 .25em;">' + parentNameHtml.join(" - ") + "</h1>";
if (layoutManager.mobile) {
html = '<h1 class="parentName" style="margin: .1em 0 .25em;">' + parentNameHtml.join("</br>") + "</h1>";
} else {
html = '<h1 class="parentName" style="margin: .1em 0 .25em;">' + tvShowHtml + "</h1>";
}
}
}
@ -418,13 +428,17 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
var offset = parentNameLast ? ".25em" : ".5em";
if (html && !parentNameLast) {
html += '<h3 class="itemName infoText" style="margin: .25em 0 .5em;">' + name + '</h3>';
if (!layoutManager.mobile && tvSeasonHtml) {
html += '<h3 class="itemName infoText" style="margin: .25em 0 .5em;">' + tvSeasonHtml + ' - ' + name + '</h3>';
} else {
html += '<h3 class="itemName infoText" style="margin: .25em 0 .5em;">' + name + '</h3>';
}
} else {
html = '<h1 class="itemName infoText" style="margin: .1em 0 ' + offset + ';">' + name + "</h1>" + html;
}
if (item.OriginalTitle && item.OriginalTitle != item.Name) {
html += '<h4 class="itemName infoText" style="margin: -' + offset + ' 0 0">' + item.OriginalTitle + '</h4>';
html += '<h4 class="itemName infoText" style="margin: -' + offset + ' 0 0;">' + item.OriginalTitle + '</h4>';
}
container.innerHTML = html;

View file

@ -27,14 +27,10 @@ define(["globalize", "loading", "libraryMenu", "emby-checkbox", "emby-button", "
view.querySelector("#chkSaveMetadataHidden").checked = config.SaveMetadataHidden;
});
ApiClient.getNamedConfiguration("metadata").then(function(metadata) {
loadMetadataConfig(this, metadata);
view.querySelector("#selectDateAdded").selectedIndex = metadata.UseFileCreationTimeForDateAdded ? 1 : 0;
});
}
function loadMetadataConfig(page, config) {
$("#selectDateAdded", page).val(config.UseFileCreationTimeForDateAdded ? "1" : "0");
}
view.querySelector("form").addEventListener("submit", function(e) {
loading.show();
var form = this;

View file

@ -1,4 +1,4 @@
define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "emby-itemscontainer"], function (cardBuilder, imageLoader, libraryBrowser, loading, events) {
define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "userSettings", "emby-itemscontainer"], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) {
"use strict";
return function (view, params, tabContent) {
@ -7,12 +7,15 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "em
pageData = {
query: {
StartIndex: 0,
Limit: 100,
Fields: "PrimaryImageAspectRatio"
}
};
}
if (userSettings.libraryPageSize() > 0) {
pageData.query['Limit'] = userSettings.libraryPageSize();
}
return pageData;
}
@ -39,7 +42,9 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "em
return;
}
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems(context);
}
@ -48,7 +53,9 @@ define(["cardBuilder", "imageLoader", "libraryBrowser", "loading", "events", "em
return;
}
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems(context);
}

View file

@ -1,4 +1,4 @@
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, appHost) {
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings) {
"use strict";
return function (view, params, tabContent) {
@ -16,11 +16,15 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
Fields: "PrimaryImageAspectRatio,SortName",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
if (userSettings.libraryPageSize() > 0) {
pageData.query['Limit'] = userSettings.libraryPageSize();
}
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
@ -65,7 +69,9 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
return;
}
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems(tabContent);
}
@ -74,7 +80,9 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
return;
}
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems(tabContent);
}
@ -180,7 +188,6 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
}
var self = this;
var pageSize = 100;
var data = {};
var isLoading = false;

View file

@ -184,12 +184,12 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
return getPageData().view;
};
self.setCurrentViewStyle = function (viewStyle) {
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getPageData().view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
fullyReload();
};

View file

@ -32,7 +32,9 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
return;
}
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
itemsContainer.refreshItems();
}
@ -41,7 +43,9 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
return;
}
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
itemsContainer.refreshItems();
}
@ -250,9 +254,13 @@ define(["loading", "layoutManager", "userSettings", "events", "libraryBrowser",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: 100,
ParentId: params.topParentId
};
if (userSettings.libraryPageSize() > 0) {
query['Limit'] = userSettings.libraryPageSize();
}
var isLoading = false;
if (options.mode === "favorites") {

View file

@ -1,4 +1,4 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) {
"use strict";
return function (view, params, tabContent) {
@ -16,11 +16,15 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
if (userSettings.libraryPageSize() > 0) {
pageData.query['Limit'] = userSettings.libraryPageSize();
}
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
@ -49,7 +53,9 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
return;
}
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems();
}
@ -58,7 +64,9 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
return;
}
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems();
}
@ -168,7 +176,6 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
}
var self = this;
var pageSize = 100;
var data = {};
var isLoading = false;

View file

@ -1,4 +1,4 @@
define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (layoutManager, playbackManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, userSettings) {
"use strict";
return function (view, params, tabContent) {
@ -30,11 +30,15 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
if (userSettings.libraryPageSize() > 0) {
pageData.query['Limit'] = userSettings.libraryPageSize();
}
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
@ -79,7 +83,9 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
return;
}
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems(tabContent);
}
@ -88,7 +94,9 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
return;
}
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems(tabContent);
}
@ -175,7 +183,6 @@ define(["layoutManager", "playbackManager", "loading", "events", "libraryBrowser
var savedQueryKey;
var pageData;
var self = this;
var pageSize = 100;
var isLoading = false;
self.showFilterMenu = function () {

View file

@ -1,4 +1,4 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost) {
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "alphaPicker", "listView", "cardBuilder", "apphost", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, alphaPicker, listView, cardBuilder, appHost, userSettings) {
"use strict";
return function (view, params, tabContent) {
@ -7,17 +7,22 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
var pageData = data[key];
if (!pageData) {
var queryValues = {
SortBy: "SortName",
SortOrder: "Ascending",
Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb"
};
if (userSettings.libraryPageSize() > 0) {
queryValues['Limit'] = userSettings.libraryPageSize();
}
pageData = data[key] = {
query: {
SortBy: "SortName",
SortOrder: "Ascending",
Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,BasicSyncInfo",
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
Limit: 100
},
query: queryValues,
view: libraryBrowser.getSavedView(key) || "Poster"
};
pageData.query.ParentId = params.topParentId;
@ -67,7 +72,9 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
return;
}
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems(tabContent);
}
@ -76,7 +83,9 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
return;
}
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems(tabContent);
}

View file

@ -107,12 +107,12 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
return getPageData().view;
};
self.setCurrentViewStyle = function (viewStyle) {
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getPageData().view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
fullyReload();
};

View file

@ -69,7 +69,7 @@ define(["libraryBrowser", "cardBuilder", "apphost", "imageLoader", "loading"], f
var data = {};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
return getPageData().view;
};
var promise;

View file

@ -1,4 +1,4 @@
define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading) {
define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "userSettings", "emby-itemscontainer"], function (events, libraryBrowser, imageLoader, listView, loading, userSettings) {
"use strict";
return function (view, params, tabContent) {
@ -14,12 +14,16 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-
IncludeItemTypes: "Audio",
Recursive: true,
Fields: "AudioInfo,ParentId",
Limit: 100,
StartIndex: 0,
ImageTypeLimit: 1,
EnableImageTypes: "Primary"
}
};
if (userSettings.libraryPageSize() > 0) {
pageData.query['Limit'] = userSettings.libraryPageSize();
}
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
@ -49,7 +53,9 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-
return;
}
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems(tabContent);
}
@ -58,7 +64,9 @@ define(["events", "libraryBrowser", "imageLoader", "listView", "loading", "emby-
return;
}
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems(tabContent);
}

View file

@ -1152,7 +1152,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med
case "GamepadDPadLeft":
case "GamepadLeftThumbstickLeft":
// Ignores gamepad events that are always triggered, even when not focused.
if (document.hasFocus()) {
if (document.hasFocus()) { /* eslint-disable-line compat/compat */
playbackManager.rewind(currentPlayer);
showOsd();
}
@ -1161,7 +1161,7 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med
case "GamepadDPadRight":
case "GamepadLeftThumbstickRight":
// Ignores gamepad events that are always triggered, even when not focused.
if (document.hasFocus()) {
if (document.hasFocus()) { /* eslint-disable-line compat/compat */
playbackManager.fastForward(currentPlayer);
showOsd();
}
@ -1272,7 +1272,6 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med
var programEndDateMs = 0;
var playbackStartTimeTicks = 0;
var subtitleSyncOverlay;
var volumeSliderTimer;
var nowPlayingVolumeSlider = view.querySelector(".osdVolumeSlider");
var nowPlayingVolumeSliderContainer = view.querySelector(".osdVolumeSliderContainer");
var nowPlayingPositionSlider = view.querySelector(".osdPositionSlider");
@ -1423,27 +1422,15 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med
}
function setVolume() {
clearTimeout(volumeSliderTimer);
volumeSliderTimer = null;
playbackManager.setVolume(this.value, currentPlayer);
}
function setVolumeDelayed() {
if (!volumeSliderTimer) {
var that = this;
volumeSliderTimer = setTimeout(function () {
setVolume.call(that);
}, 700);
}
}
view.querySelector(".buttonMute").addEventListener("click", function () {
playbackManager.toggleMute(currentPlayer);
});
nowPlayingVolumeSlider.addEventListener("change", setVolume);
nowPlayingVolumeSlider.addEventListener("mousemove", setVolumeDelayed);
nowPlayingVolumeSlider.addEventListener("touchmove", setVolumeDelayed);
nowPlayingVolumeSlider.addEventListener("mousemove", setVolume);
nowPlayingVolumeSlider.addEventListener("touchmove", setVolume);
nowPlayingPositionSlider.addEventListener("change", function () {
var player = currentPlayer;

View file

@ -1,4 +1,4 @@
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder) {
define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "userSettings", "emby-itemscontainer"], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings) {
"use strict";
return function (view, params, tabContent) {
@ -17,11 +17,15 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
IsMissing: false,
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Thumb",
StartIndex: 0,
Limit: pageSize
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
if (userSettings.libraryPageSize() > 0) {
pageData.query['Limit'] = userSettings.libraryPageSize();
}
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
@ -66,7 +70,9 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
return;
}
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems(tabContent);
}
@ -75,7 +81,9 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
return;
}
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems(tabContent);
}
@ -152,7 +160,6 @@ define(["loading", "events", "libraryBrowser", "imageLoader", "listView", "cardB
}
var self = this;
var pageSize = 100;
var data = {};
var isLoading = false;

View file

@ -113,6 +113,9 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader
itemsContainer: elem,
shape: getPortraitShape(),
scalable: true,
showTitle: true,
centerText: true,
showYear: true,
overlayMoreButton: true,
allowBottomPadding: false
});
@ -177,12 +180,12 @@ define(["layoutManager", "loading", "libraryBrowser", "cardBuilder", "lazyLoader
};
self.getCurrentViewStyle = function () {
return getPageData(tabContent).view;
return getPageData().view;
};
self.setCurrentViewStyle = function (viewStyle) {
getPageData(tabContent).view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(tabContent), viewStyle);
getPageData().view = viewStyle;
libraryBrowser.saveViewSetting(getSavedQueryKey(), viewStyle);
fullyReload();
};

View file

@ -1,4 +1,4 @@
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker) {
define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "listView", "cardBuilder", "alphaPicker", "userSettings", "emby-itemscontainer"], function (layoutManager, loading, events, libraryBrowser, imageLoader, listView, cardBuilder, alphaPicker, userSettings) {
"use strict";
return function (view, params, tabContent) {
@ -16,11 +16,15 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
Fields: "PrimaryImageAspectRatio,BasicSyncInfo",
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
StartIndex: 0,
Limit: pageSize
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
if (userSettings.libraryPageSize() > 0) {
pageData.query['Limit'] = userSettings.libraryPageSize();
}
pageData.query.ParentId = params.topParentId;
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
@ -65,7 +69,9 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
return;
}
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems(tabContent);
}
@ -74,7 +80,9 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
return;
}
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems(tabContent);
}
@ -185,7 +193,6 @@ define(["layoutManager", "loading", "events", "libraryBrowser", "imageLoader", "
}
var self = this;
var pageSize = 100;
var data = {};
var isLoading = false;

View file

@ -0,0 +1,16 @@
define([], function() {
'use strict';
var ProgramCellPrototype = Object.create(HTMLButtonElement.prototype);
ProgramCellPrototype.detachedCallback = function () {
this.posLeft = null;
this.posWidth = null;
this.guideProgramName = null;
};
document.registerElement('emby-programcell', {
prototype: ProgramCellPrototype,
extends: 'button'
});
});

View file

@ -0,0 +1,42 @@
define([], function() {
'use strict';
var ProgressBarPrototype = Object.create(HTMLDivElement.prototype);
function onAutoTimeProgress() {
var start = parseInt(this.getAttribute('data-starttime'));
var end = parseInt(this.getAttribute('data-endtime'));
var now = new Date().getTime();
var total = end - start;
var pct = 100 * ((now - start) / total);
pct = Math.min(100, pct);
pct = Math.max(0, pct);
var itemProgressBarForeground = this.querySelector('.itemProgressBarForeground');
itemProgressBarForeground.style.width = pct + '%';
}
ProgressBarPrototype.attachedCallback = function () {
if (this.timeInterval) {
clearInterval(this.timeInterval);
}
if (this.getAttribute('data-automode') === 'time') {
this.timeInterval = setInterval(onAutoTimeProgress.bind(this), 60000);
}
};
ProgressBarPrototype.detachedCallback = function () {
if (this.timeInterval) {
clearInterval(this.timeInterval);
this.timeInterval = null;
}
};
document.registerElement('emby-progressbar', {
prototype: ProgressBarPrototype,
extends: 'div'
});
});

View file

@ -96,17 +96,6 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro
}
}
function initHeadroom(elem) {
require(['headroom'], function (Headroom) {
var headroom = new Headroom([], {
scroller: elem
});
headroom.add(document.querySelector('.skinHeader'));
elem.headroom = headroom;
});
}
ScrollerPrototype.attachedCallback = function () {
if (this.getAttribute('data-navcommands')) {
inputManager.on(this, onInputCommand);
@ -120,8 +109,6 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro
slider.style['white-space'] = 'nowrap';
}
var bindHeader = this.getAttribute('data-bindheader') === 'true';
var scrollFrame = this;
var enableScrollButtons = layoutManager.desktop && horizontal && this.getAttribute('data-scrollbuttons') !== 'false';
@ -137,7 +124,7 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro
dragHandle: 1,
autoImmediate: true,
skipSlideToWhenVisible: this.getAttribute('data-skipfocuswhenvisible') === 'true',
dispatchScrollEvent: enableScrollButtons || bindHeader || this.getAttribute('data-scrollevent') === 'true',
dispatchScrollEvent: enableScrollButtons || this.getAttribute('data-scrollevent') === 'true',
hideScrollbar: enableScrollButtons || this.getAttribute('data-hidescrollbar') === 'true',
allowNativeSmoothScroll: this.getAttribute('data-allownativesmoothscroll') === 'true' && !enableScrollButtons,
allowNativeScroll: !enableScrollButtons,
@ -155,10 +142,6 @@ define(['scroller', 'dom', 'layoutManager', 'inputManager', 'focusManager', 'bro
initCenterFocus(this, this.scroller);
}
if (bindHeader && layoutManager.mobile) {
initHeadroom(this);
}
if (enableScrollButtons) {
loadScrollButtons(this);
}

View file

@ -92,7 +92,7 @@
left: 0;
bottom: 0;
z-index: 1;
width: 10px;
width: 0.8em;
}
</style>
</head>

View file

@ -136,7 +136,7 @@
<div class="selectContainer selectAudioContainer hide trackSelectionFieldContainer flex-shrink-zero">
<select is="emby-select" class="selectAudio detailTrackSelect" label=""></select>
</div>
<div class="selectContainer selectSubtitlesContainer hide trackSelectionFieldContainer">
<div class="selectContainer selectSubtitlesContainer hide trackSelectionFieldContainer flex-shrink-zero">
<select is="emby-select" class="selectSubtitles detailTrackSelect" label=""></select>
</div>
</form>

View file

@ -3,16 +3,20 @@ Dashboard.confirm = function(message, title, callback) {
require(["confirm"], function(confirm) {
confirm(message, title).then(function() {
callback(!0);
}, function() {
}).catch(function() {
callback(!1);
});
});
}, Dashboard.showLoadingMsg = function() {
};
Dashboard.showLoadingMsg = function() {
"use strict";
require(["loading"], function(loading) {
loading.show();
});
}, Dashboard.hideLoadingMsg = function() {
};
Dashboard.hideLoadingMsg = function() {
"use strict";
require(["loading"], function(loading) {
loading.hide();

View file

@ -4,7 +4,9 @@ define(["jQuery"], function($) {
return !0 === value || !1 === value ? $(this).each(function() {
this.checked = value;
}) : this.length && this[0].checked;
}, $.fn.checkboxradio = function() {
};
$.fn.checkboxradio = function() {
return this;
};
});

View file

@ -1,6 +1,12 @@
define(["events", "appStorage"], function(events, appStorage) {
"use strict";
/** Report rate limits in ms for different events */
const reportRateLimits = {
"timeupdate": 10000,
"volumechange": 3000
};
function redetectBitrate(instance) {
stopBitrateDetection(instance), instance.accessToken() && !1 !== instance.enableAutomaticBitrateDetection && setTimeout(redetectBitrateInternal.bind(instance), 6e3)
}
@ -231,6 +237,11 @@ define(["events", "appStorage"], function(events, appStorage) {
}
return 0
}
function cancelReportPlaybackProgressPromise(instance) {
if (typeof instance.reportPlaybackProgressCancel === "function") instance.reportPlaybackProgressCancel();
}
ApiClient.prototype.appName = function() {
return this._appName
}, ApiClient.prototype.setRequestHeaders = function(headers) {
@ -1417,6 +1428,7 @@ define(["events", "appStorage"], function(events, appStorage) {
}, ApiClient.prototype.reportPlaybackStart = function(options) {
if (!options) throw new Error("null options");
this.lastPlaybackProgressReport = 0, this.lastPlaybackProgressReportTicks = null, stopBitrateDetection(this);
cancelReportPlaybackProgressPromise(this);
var url = this.getUrl("Sessions/Playing");
return this.ajax({
type: "POST",
@ -1426,25 +1438,74 @@ define(["events", "appStorage"], function(events, appStorage) {
})
}, ApiClient.prototype.reportPlaybackProgress = function(options) {
if (!options) throw new Error("null options");
var newPositionTicks = options.PositionTicks;
if ("timeupdate" === (options.EventName || "timeupdate")) {
var now = (new Date).getTime(),
msSinceLastReport = now - (this.lastPlaybackProgressReport || 0);
if (msSinceLastReport <= 1e4) {
if (!newPositionTicks) return Promise.resolve();
var expectedReportTicks = 1e4 * msSinceLastReport + (this.lastPlaybackProgressReportTicks || 0);
if (Math.abs((newPositionTicks || 0) - expectedReportTicks) < 5e7) return Promise.resolve()
}
this.lastPlaybackProgressReport = now
} else this.lastPlaybackProgressReport = 0;
this.lastPlaybackProgressReportTicks = newPositionTicks;
var url = this.getUrl("Sessions/Playing/Progress");
return this.ajax({
type: "POST",
data: JSON.stringify(options),
contentType: "application/json",
url: url
})
const eventName = options.EventName || "timeupdate";
let reportRateLimitTime = reportRateLimits[eventName] || 0;
const now = (new Date).getTime();
const msSinceLastReport = now - (this.lastPlaybackProgressReport || 0);
const newPositionTicks = options.PositionTicks;
if (msSinceLastReport < reportRateLimitTime && eventName === "timeupdate" && newPositionTicks) {
const expectedReportTicks = 1e4 * msSinceLastReport + (this.lastPlaybackProgressReportTicks || 0);
if (Math.abs(newPositionTicks - expectedReportTicks) >= 5e7) reportRateLimitTime = 0;
}
if (reportRateLimitTime < (this.reportPlaybackProgressTimeout !== undefined ? this.reportPlaybackProgressTimeout : 1e6)) {
cancelReportPlaybackProgressPromise(this);
}
this.lastPlaybackProgressOptions = options;
if (this.reportPlaybackProgressPromise) return Promise.resolve();
let instance = this;
let promise;
let cancelled = false;
let resetPromise = function () {
if (instance.reportPlaybackProgressPromise !== promise) return;
delete instance.lastPlaybackProgressOptions;
delete instance.reportPlaybackProgressTimeout;
delete instance.reportPlaybackProgressPromise;
delete instance.reportPlaybackProgressCancel;
};
let sendReport = function (lastOptions) {
resetPromise();
if (!lastOptions) throw new Error("null options");
instance.lastPlaybackProgressReport = (new Date).getTime();
instance.lastPlaybackProgressReportTicks = lastOptions.PositionTicks;
const url = instance.getUrl("Sessions/Playing/Progress");
return instance.ajax({
type: "POST",
data: JSON.stringify(lastOptions),
contentType: "application/json",
url: url
});
};
let delay = Math.max(0, reportRateLimitTime - msSinceLastReport);
promise = new Promise((resolve, reject) => setTimeout(resolve, delay)).then(() => {
if (cancelled) return Promise.resolve();
return sendReport(instance.lastPlaybackProgressOptions);
}).finally(() => {
resetPromise();
});
this.reportPlaybackProgressTimeout = reportRateLimitTime;
this.reportPlaybackProgressPromise = promise;
this.reportPlaybackProgressCancel = function () {
cancelled = true;
resetPromise();
};
return promise;
}, ApiClient.prototype.reportOfflineActions = function(actions) {
if (!actions) throw new Error("null actions");
var url = this.getUrl("Sync/OfflineActions");
@ -1489,6 +1550,7 @@ define(["events", "appStorage"], function(events, appStorage) {
}, ApiClient.prototype.reportPlaybackStopped = function(options) {
if (!options) throw new Error("null options");
this.lastPlaybackProgressReport = 0, this.lastPlaybackProgressReportTicks = null, redetectBitrate(this);
cancelReportPlaybackProgressPromise(this);
var url = this.getUrl("Sessions/Playing/Stopped");
return this.ajax({
type: "POST",

View file

@ -1,57 +1,71 @@
<div id="nowPlayingPage" data-role="page" class="page libraryPage nowPlayingPage noSecondaryNavPage selfBackdropPage" data-title="-" style="padding:6em 0 0!important;">
<div id="nowPlayingPage" data-role="page" class="page libraryPage nowPlayingPage noSecondaryNavPage selfBackdropPage" data-title="-">
<div class="remoteControlContent padded-left padded-right">
<div class="nowPlayingInfoContainer">
<div class="nowPlayingPageImageContainer"></div>
<div class="nowPlayingInfoControls">
<div class="flex">
<h2 class="nowPlayingPageTitle"></h2>
<div class="sliderContainer nowPlayingPositionSliderContainer">
<input type="range" is="emby-slider" pin step="1" min="0" max="100" value="0" class="nowPlayingPositionSlider" data-slider-keep-progress="true" />
<div class="nowPlayingInfoContainerMedia">
<h2 class="nowPlayingPageTitle"></h2>
<div style="font-weight: bold;" class="nowPlayingSongName nowPlayingEpisode"></div>
<div class="nowPlayingAlbum nowPlayingSeason"></div>
<div class="nowPlayingArtist nowPlayingSerie"></div>
</div>
<div class="nowPlayingPageUserDataButtonsTitle"></div>
</div>
<div class="sliderContainer flex">
<div class="positionTime"></div>
<div class="nowPlayingPositionSliderContainer">
<input type="range" is="emby-slider" pin step="1" min="0" max="100" value="0" class="nowPlayingPositionSlider" data-slider-keep-progress="true" />
</div>
<div class="runtime"></div>
</div>
<div class="nowPlayingButtonsContainer">
<div class="nowPlayingInfoButtons focuscontainer-x">
<button is="paper-icon-button-light" class="btnRewind btnNowPlayingRewind btnPlayStateCommand autoSize" title="${Rewind}">
<i class="material-icons replay_10"></i>
</button>
<button is="paper-icon-button-light" class="btnPreviousTrack btnPlayStateCommand autoSize" title="${ButtonPreviousTrack}">
<i class="material-icons skip_previous"></i>
</button>
<div class="nowPlayingInfoButtons focuscontainer-x">
<button is="paper-icon-button-light" class="btnPreviousTrack btnPlayStateCommand autoSize" title="${ButtonPreviousTrack}">
<i class="material-icons skip_previous"></i>
</button>
<button is="paper-icon-button-light" class="btnPlayPause btnPlayStateCommand autoSize" title="${ButtonPause}">
<i class="material-icons">pause</i>
</button>
<button is="paper-icon-button-light" class="btnRewind btnNowPlayingRewind btnPlayStateCommand autoSize" title="${Rewind}">
<i class="material-icons fast_rewind"></i>
</button>
<button is="paper-icon-button-light" class="btnPlayStateCommand btnStop autoSize" title="${ButtonStop}">
<i class="material-icons">stop</i>
</button>
<button is="paper-icon-button-light" class="btnPlayPause btnPlayStateCommand autoSize" title="${ButtonPause}">
<i class="material-icons">pause</i>
</button>
<button is="paper-icon-button-light" class="btnPlayStateCommand btnStop autoSize" title="${ButtonStop}">
<i class="material-icons">stop</i>
</button>
<button is="paper-icon-button-light" class="btnPlayStateCommand btnFastForward btnNowPlayingFastForward autoSize" title="${FastForward}">
<i class="material-icons fast_forward"></i>
</button>
<button is="paper-icon-button-light" class="btnPlayStateCommand btnNextTrack autoSize" title="${ButtonNextTrack}">
<i class="material-icons skip_next"></i>
</button>
<button is="paper-icon-button-light" class="btnAudioTracks videoButton btnPlayStateCommand autoSize" title="${ButtonAudioTracks}" data-command="GoToSearch">
<i class="material-icons">audiotrack</i>
</button>
<button is="paper-icon-button-light" class="btnSubtitles videoButton btnPlayStateCommand autoSize" title="${ButtonSubtitles}" data-command="GoToSearch">
<i class="material-icons closed_caption"></i>
</button>
<div class="nowPlayingTime">
<div class="positionTime"></div>
<div style="margin: 0 .25em;">/</div>
<div class="runtime"></div>
<button is="paper-icon-button-light" class="btnPlayStateCommand btnNextTrack autoSize" title="${ButtonNextTrack}">
<i class="material-icons skip_next"></i>
</button>
<button is="paper-icon-button-light" class="btnPlayStateCommand btnFastForward btnNowPlayingFastForward autoSize" title="${FastForward}">
<i class="material-icons forward_30"></i>
</button>
</div>
<div class="nowPlayingSecondaryButtons">
<button is="paper-icon-button-light" class="btnAudioTracks videoButton btnPlayStateCommand autoSize" title="${ButtonAudioTracks}" data-command="GoToSearch">
<i class="material-icons">audiotrack</i>
</button>
<button is="paper-icon-button-light" class="btnSubtitles videoButton btnPlayStateCommand autoSize" title="${ButtonSubtitles}" data-command="GoToSearch">
<i class="material-icons closed_caption"></i>
</button>
<div class="nowPlayingPageUserDataButtons"></div>
<button is="paper-icon-button-light" class="btnToggleFullscreen videoButton btnPlayStateCommand autoSize" title="${ButtonFullscreen}" data-command="ToggleFullscreen">
@ -62,17 +76,11 @@
<i class="material-icons">repeat</i>
</button>
<button is="paper-icon-button-light" class="buttonMute autoSize" title="${Mute}">
<i class="xlargePaperIconButton material-icons"></i>
</button>
<div class="sliderContainer nowPlayingVolumeSliderContainer">
<input is="emby-slider" type="range" step="1" min="0" max="100" value="0" class="nowPlayingVolumeSlider" />
</div>
</div>
</div>
</div>
</div>
<div>
<div class="remoteControlSection">
<div class="navigationSection">
<div is="emby-collapse" title="${HeaderNavigation}">
<div class="collapseContent">
@ -120,8 +128,6 @@
</div>
</div>
</div>
</div>
<div>
<div class="sendMessageSection">
<div is="emby-collapse" title="${HeaderSendMessage}">
<div class="collapseContent" style="text-align: left;">
@ -155,21 +161,22 @@
</div>
</div>
</div>
<br />
<div class="playlistSection hide">
<div style="display: flex; align-items: center;margin:2em 0 1em">
<h2 style="margin:0;">${TabPlaylist}</h2>
<button is="paper-icon-button-light" class="btnSavePlaylist" title="${ButtonSave}" style="margin-left:1em;">
<i class="material-icons">save</i>
<div class="playlistSection">
<div class="playlistSectionButton flex align-items-center justify-content-center">
<button id="togglePlaylist" is="paper-icon-button-light" class="btnTogglePlaylist" title="${ButtonTogglePlaylist}">
<i class="material-icons queue_music"></i>
</button>
<button is="paper-icon-button-light" class="btnSavePlaylist" title="${ButtonSave}">
<i class="material-icons save"></i>
</button>
</div>
<div class="playlist itemsContainer vertical-list" is="emby-itemscontainer" data-dragreorder="true">
<div id="playlist" class="playlist itemsContainer vertical-list nowPlayingPlaylist hide" is="emby-itemscontainer" data-dragreorder="true"></div>
<div id="contextMenu" class="contextMenu itemsContainer vertical-list nowPlayingContextMenu hide" is="emby-itemscontainer">
<div class="listItem listItem-border contextMenuList contextMenuArtist">
</div>
<div class="listItem listItem-border contextMenuList contextMenuAlbum">
</div>
</div>
</div>
<br />
<br />
<br />
<br />
</div>
</div>

View file

@ -8,7 +8,7 @@
var script = document.createElement("script");
if (self.dashboardVersion) {
src += "?v=" + self.dashboardVersion;
src += `?v=${self.dashboardVersion}`;
}
script.src = src;
@ -29,6 +29,16 @@
);
}
try {
Promise.resolve();
} catch (ex) {
// this checks for several cases actually, typical is
// Promise() being missing on some legacy browser, and a funky one
// is Promise() present but buggy on WebOS 2
window.Promise = undefined;
self.Promise = undefined;
}
if (!self.Promise) {
// Load Promise polyfill if they are not natively supported
injectScriptElement(

View file

@ -1,16 +1,18 @@
define(["backdrop", "userSettings", "libraryMenu"], function (backdrop, userSettings, libraryMenu) {
"use strict";
var cache = {};
function enabled() {
return userSettings.enableBackdrops();
}
function getBackdropItemIds(apiClient, userId, types, parentId) {
var key = "backdrops2_" + userId + (types || "") + (parentId || "");
var key = `backdrops2_${userId + (types || "") + (parentId || "")}`;
var data = cache[key];
if (data) {
console.debug("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);
}
@ -54,7 +56,6 @@ define(["backdrop", "userSettings", "libraryMenu"], function (backdrop, userSett
}
}
var cache = {};
pageClassOn("pageshow", "page", function () {
var page = this;

View file

@ -77,10 +77,10 @@ define([], function () {
var camel = prop.replace(/-([a-z]|[0-9])/ig, function (all, letter) {
return (letter + '').toUpperCase();
});
// Check if the property is supported
var support = (camel in el.style);
// Create test element
var el = document.createElement('div');
// Check if the property is supported
var support = (camel in el.style);
// Assign the property and value to invoke
// the CSS interpreter
el.style.cssText = prop + ':' + value;
@ -292,6 +292,7 @@ define([], function () {
}
if (typeof document !== 'undefined') {
/* eslint-disable-next-line compat/compat */
if (('ontouchstart' in window) || (navigator.maxTouchPoints > 0)) {
browser.touch = true;
}

View file

@ -1,99 +1,57 @@
import { ar, be, bg, ca, cs, da, de, el, enGB, enUS, es, faIR, fi, fr, frCA, he, hi, hr, hu, id, it, kk, ko, lt, ms, nb, nl, pl, ptBR, pt, ro, ru, sk, sl, sv, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale';
import { ar, be, bg, ca, cs, da, de, el, enGB, enUS, es, faIR, fi, fr, frCA, he, hi, hr, hu, id, it, ja, kk, ko, lt, ms, nb,
nl, pl, ptBR, pt, ro, ru, sk, sl, sv, tr, uk, vi, zhCN, zhTW } from 'date-fns/locale';
import globalize from 'globalize';
const dateLocales = (locale) => ({
'ar': ar,
'be-by': be,
'bg-bg': bg,
'ca': ca,
'cs': cs,
'da': da,
'de': de,
'el': el,
'en-gb': enGB,
'en-us': enUS,
'es': es,
'es-ar': es,
'es-mx': es,
'fa': faIR,
'fi': fi,
'fr': fr,
'fr-ca': frCA,
'gsw': de,
'he': he,
'hi-in': hi,
'hr': hr,
'hu': hu,
'id': id,
'it': it,
'ja': ja,
'kk': kk,
'ko': ko,
'lt-lt': lt,
'ms': ms,
'nb': nb,
'nl': nl,
'pl': pl,
'pt-br': ptBR,
'pt-pt': pt,
'ro': ro,
'ru': ru,
'sk': sk,
'sl-si': sl,
'sv': sv,
'tr': tr,
'uk': uk,
'vi': vi,
'zh-cn': zhCN,
'zh-hk': zhCN,
'zh-tw': zhTW
})[locale];
export function getLocale() {
switch (globalize.getCurrentLocale()) {
case 'ar':
return ar;
case 'be-by':
return be;
case 'bg-bg':
return bg;
case 'ca':
return ca;
case 'cs':
return cs;
case 'da':
return da;
case 'de':
return de;
case 'el':
return el;
case 'en-gb':
return enGB;
case 'en-us':
return enUS;
case 'es':
return es;
case 'es-ar':
return es;
case 'es-mx':
return es;
case 'fa':
return faIR;
case 'fi':
return fi;
case 'fr':
return fr;
case 'fr-ca':
return frCA;
case 'gsw':
return de;
case 'he':
return he;
case 'hi-in':
return hi;
case 'hr':
return hr;
case 'hu':
return hu;
case 'id':
return id;
case 'it':
return it;
case 'kk':
return kk;
case 'ko':
return ko;
case 'lt-lt':
return lt;
case 'ms':
return ms;
case 'nb':
return nb;
case 'nl':
return nl;
case 'pl':
return pl;
case 'pt-br':
return ptBR;
case 'pt-pt':
return pt;
case 'ro':
return ro;
case 'ru':
return ru;
case 'sk':
return sk;
case 'sl-si':
return sl;
case 'sv':
return sv;
case 'tr':
return tr;
case 'uk':
return uk;
case 'vi':
return vi;
case 'zh-cn':
return zhCN;
case 'zh-hk':
return zhCN;
case 'zh-tw':
return zhTW;
default:
return enUS;
}
return dateLocales(globalize.getCurrentLocale()) || enUS;
}
export const localeWithSuffix = { addSuffix: true, locale: getLocale() };

View file

@ -14,6 +14,7 @@ import browser from 'browser';
case "Kodi":
return baseUrl + "kodi.svg";
case "Jellyfin Android":
case "Android TV":
return baseUrl + "android.svg";
case "Jellyfin Web":
switch (device.Name || device.DeviceName) {

View file

@ -1,44 +1,49 @@
define(['playbackManager', 'focusManager', 'appRouter', 'dom', 'apphost'], function (playbackManager, focusManager, appRouter, dom, appHost) {
'use strict';
import playbackManager from 'playbackManager';
import focusManager from 'focusManager';
import appRouter from 'appRouter';
import dom from 'dom';
import appHost from 'apphost';
var lastInputTime = new Date().getTime();
/* eslint-disable indent */
function notify() {
let lastInputTime = new Date().getTime();
export function notify() {
lastInputTime = new Date().getTime();
handleCommand('unknown');
}
function notifyMouseMove() {
export function notifyMouseMove() {
lastInputTime = new Date().getTime();
}
function idleTime() {
export function idleTime() {
return new Date().getTime() - lastInputTime;
}
function select(sourceElement) {
export function select(sourceElement) {
sourceElement.click();
}
var eventListenerCount = 0;
function on(scope, fn) {
let eventListenerCount = 0;
export function on(scope, fn) {
eventListenerCount++;
dom.addEventListener(scope, 'command', fn, {});
}
function off(scope, fn) {
export function off(scope, fn) {
if (eventListenerCount) {
eventListenerCount--;
}
dom.removeEventListener(scope, 'command', fn, {});
}
var commandTimes = {};
let commandTimes = {};
function checkCommandTime(command) {
var last = commandTimes[command] || 0;
var now = new Date().getTime();
const last = commandTimes[command] || 0;
const now = new Date().getTime();
if ((now - last) < 1000) {
return false;
@ -48,11 +53,11 @@ define(['playbackManager', 'focusManager', 'appRouter', 'dom', 'apphost'], funct
return true;
}
function handleCommand(name, options) {
export function handleCommand(commandName, options) {
lastInputTime = new Date().getTime();
var sourceElement = (options ? options.sourceElement : null);
let sourceElement = (options ? options.sourceElement : null);
if (sourceElement) {
sourceElement = focusManager.focusableParent(sourceElement);
@ -61,7 +66,7 @@ define(['playbackManager', 'focusManager', 'appRouter', 'dom', 'apphost'], funct
if (!sourceElement) {
sourceElement = document.activeElement || window;
var dlg = document.querySelector('.dialogContainer .dialog.opened');
const dlg = document.querySelector('.dialogContainer .dialog.opened');
if (dlg && (!sourceElement || !dlg.contains(sourceElement))) {
sourceElement = dlg;
@ -69,183 +74,182 @@ define(['playbackManager', 'focusManager', 'appRouter', 'dom', 'apphost'], funct
}
if (eventListenerCount) {
var customEvent = new CustomEvent("command", {
const customEvent = new CustomEvent("command", {
detail: {
command: name
command: commandName
},
bubbles: true,
cancelable: true
});
var eventResult = sourceElement.dispatchEvent(customEvent);
const eventResult = sourceElement.dispatchEvent(customEvent);
if (!eventResult) {
// event cancelled
return;
}
}
switch (name) {
case 'up':
const keyActions = (command) => ({
'up': () => {
focusManager.moveUp(sourceElement);
break;
case 'down':
},
'down': () => {
focusManager.moveDown(sourceElement);
break;
case 'left':
},
'left': () => {
focusManager.moveLeft(sourceElement);
break;
case 'right':
},
'right': () => {
focusManager.moveRight(sourceElement);
break;
case 'home':
},
'home': () => {
appRouter.goHome();
break;
case 'settings':
},
'settings': () => {
appRouter.showSettings();
break;
case 'back':
},
'back': () => {
if (appRouter.canGoBack()) {
appRouter.back();
} else if (appHost.supports('exit')) {
appHost.exit();
}
break;
case 'forward':
break;
case 'select':
},
'select': () => {
select(sourceElement);
break;
case 'pageup':
break;
case 'pagedown':
break;
case 'end':
break;
case 'menu':
break;
case 'info':
break;
case 'nextchapter':
},
'nextchapter': () => {
playbackManager.nextChapter();
break;
case 'next':
case 'nexttrack':
},
'next': () => {
playbackManager.nextTrack();
break;
case 'previous':
case 'previoustrack':
},
'nexttrack': () => {
playbackManager.nextTrack();
},
'previous': () => {
playbackManager.previousTrack();
break;
case 'previouschapter':
},
'previoustrack': () => {
playbackManager.previousTrack();
},
'previouschapter': () => {
playbackManager.previousChapter();
break;
case 'guide':
},
'guide': () => {
appRouter.showGuide();
break;
case 'recordedtv':
},
'recordedtv': () => {
appRouter.showRecordedTV();
break;
case 'record':
break;
case 'livetv':
},
'livetv': () => {
appRouter.showLiveTV();
break;
case 'mute':
},
'mute': () => {
playbackManager.setMute(true);
break;
case 'unmute':
},
'unmute': () => {
playbackManager.setMute(false);
break;
case 'togglemute':
},
'togglemute': () => {
playbackManager.toggleMute();
break;
case 'channelup':
},
'channelup': () => {
playbackManager.channelUp();
break;
case 'channeldown':
},
'channeldown': () => {
playbackManager.channelDown();
break;
case 'volumedown':
},
'volumedown': () => {
playbackManager.volumeDown();
break;
case 'volumeup':
},
'volumeup': () => {
playbackManager.volumeUp();
break;
case 'play':
},
'play': () => {
playbackManager.unpause();
break;
case 'pause':
},
'pause': () => {
playbackManager.pause();
break;
case 'playpause':
},
'playpause': () => {
playbackManager.playPause();
break;
case 'stop':
},
'stop': () => {
if (checkCommandTime('stop')) {
playbackManager.stop();
}
break;
case 'changezoom':
},
'changezoom': () => {
playbackManager.toggleAspectRatio();
break;
case 'changeaudiotrack':
},
'changeaudiotrack': () => {
playbackManager.changeAudioStream();
break;
case 'changesubtitletrack':
},
'changesubtitletrack': () => {
playbackManager.changeSubtitleStream();
break;
case 'search':
},
'search': () => {
appRouter.showSearch();
break;
case 'favorites':
},
'favorites': () => {
appRouter.showFavorites();
break;
case 'fastforward':
},
'fastforward': () => {
playbackManager.fastForward();
break;
case 'rewind':
},
'rewind': () => {
playbackManager.rewind();
break;
case 'togglefullscreen':
},
'togglefullscreen': () => {
playbackManager.toggleFullscreen();
break;
case 'disabledisplaymirror':
},
'disabledisplaymirror': () => {
playbackManager.enableDisplayMirroring(false);
break;
case 'enabledisplaymirror':
},
'enabledisplaymirror': () => {
playbackManager.enableDisplayMirroring(true);
break;
case 'toggledisplaymirror':
},
'toggledisplaymirror': () => {
playbackManager.toggleDisplayMirroring();
break;
case 'nowplaying':
},
'nowplaying': () => {
appRouter.showNowPlaying();
break;
case 'repeatnone':
},
'repeatnone': () => {
playbackManager.setRepeatMode('RepeatNone');
break;
case 'repeatall':
},
'repeatall': () => {
playbackManager.setRepeatMode('RepeatAll');
break;
case 'repeatone':
},
'repeatone': () => {
playbackManager.setRepeatMode('RepeatOne');
break;
default:
break;
}
})[command];
const action = keyActions(commandName);
if (action !== undefined) {
action.call();
} else {
console.debug(`inputManager: tried to process command with no action assigned: ${commandName}`);
}
}
// Alias for backward compatibility
export const trigger = handleCommand;
dom.addEventListener(document, 'click', notify, {
passive: true
});
return {
trigger: handleCommand,
handle: handleCommand,
notify: notify,
notifyMouseMove: notifyMouseMove,
idleTime: idleTime,
on: on,
off: off
};
});
/* eslint-enable indent */
export default {
trigger: handleCommand,
handle: handleCommand,
notify: notify,
notifyMouseMove: notifyMouseMove,
idleTime: idleTime,
on: on,
off: off
};

View file

@ -73,7 +73,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
}
if (user && user.localUser) {
if (headerHomeButton && !layoutManager.mobile) {
if (headerHomeButton) {
headerHomeButton.classList.remove("hide");
}
@ -733,8 +733,8 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
function initHeadRoom(elem) {
require(["headroom"], function (Headroom) {
var headroom = new Headroom([], {});
headroom.add(elem);
var headroom = new Headroom(elem);
headroom.init();
});
}

View file

@ -8,7 +8,7 @@ define(["listView"], function (listView) {
EnableImageTypes: "Primary,Backdrop,Banner,Thumb",
UserId: ApiClient.getCurrentUserId()
};
return ApiClient.getJSON(ApiClient.getUrl("Playlists/" + itemId + "/Items", query));
return ApiClient.getJSON(ApiClient.getUrl(`Playlists/${itemId}/Items`, query));
};
}

View file

@ -1,4 +1,4 @@
define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", "apphost", "imageLoader", "emby-itemscontainer"], function (loading, listView, cardBuilder, libraryMenu, libraryBrowser, appHost, imageLoader) {
define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", "apphost", "imageLoader", "userSettings", "emby-itemscontainer"], function (loading, listView, cardBuilder, libraryMenu, libraryBrowser, appHost, imageLoader, userSettings) {
"use strict";
return function (view, params) {
@ -14,11 +14,15 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", "
IncludeItemTypes: "Playlist",
Recursive: true,
Fields: "PrimaryImageAspectRatio,SortName,CumulativeRunTimeTicks,CanDelete",
StartIndex: 0,
Limit: 100
StartIndex: 0
},
view: libraryBrowser.getSavedView(key) || "Poster"
};
if (userSettings.libraryPageSize() > 0) {
pageData.query['Limit'] = userSettings.libraryPageSize();
}
pageData.query.ParentId = libraryMenu.getTopParentId();
libraryBrowser.loadSavedQueryValues(key, pageData.query);
}
@ -137,7 +141,9 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", "
if (btnNextPage) {
btnNextPage.addEventListener("click", function () {
query.StartIndex += query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex += query.Limit;
}
reloadItems();
});
}
@ -146,7 +152,9 @@ define(["loading", "listView", "cardBuilder", "libraryMenu", "libraryBrowser", "
if (btnPreviousPage) {
btnPreviousPage.addEventListener("click", function () {
query.StartIndex -= query.Limit;
if (userSettings.libraryPageSize() > 0) {
query.StartIndex = Math.max(0, query.StartIndex - query.Limit);
}
reloadItems();
});
}

View file

@ -201,6 +201,20 @@ import events from 'events';
return this.get('screensaver', false);
}
export function libraryPageSize(val) {
if (val != null) {
return this.set('libraryPageSize', parseInt(val, 10), false);
}
var libraryPageSize = parseInt(this.get('libraryPageSize', false), 10);
if (libraryPageSize === 0) {
// Explicitly return 0 to avoid returning 100 because 0 is falsy.
return 0;
} else {
return libraryPageSize || 100;
}
}
export function soundEffects(val) {
if (val != null) {
return this.set('soundeffects', val, false);

View file

@ -350,11 +350,6 @@ var AppInfo = {};
return layoutManager;
}
function createWindowHeadroom(Headroom) {
var headroom = new Headroom([], {});
return headroom;
}
function createSharedAppFooter(appFooter) {
return new appFooter({});
}
@ -588,7 +583,7 @@ var AppInfo = {};
}
}
require(["playerSelectionMenu", "fullscreenManager"]);
require(["playerSelectionMenu"]);
var apiClient = window.ConnectionManager && window.ConnectionManager.currentApiClient();
if (apiClient) {
@ -615,13 +610,17 @@ var AppInfo = {};
}
function registerServiceWorker() {
if (navigator.serviceWorker && "cordova" !== self.appMode && "android" !== self.appMode) {
/* eslint-disable compat/compat */
if (navigator.serviceWorker && self.appMode !== "cordova" && self.appMode !== "android") {
try {
navigator.serviceWorker.register("serviceworker.js");
} catch (err) {
console.error("error registering serviceWorker: " + err);
}
} else {
console.warn("serviceWorker unsupported");
}
/* eslint-enable compat/compat */
}
function onWebComponentsReady(browser) {
@ -700,7 +699,11 @@ var AppInfo = {};
"date-fns",
"page",
"polyfill",
"classlist-polyfill"
"fast-text-encoding",
"intersection-observer",
"classlist-polyfill",
"screenfull",
"headroom"
]
},
urlArgs: urlArgs,
@ -709,6 +712,8 @@ var AppInfo = {};
});
require(["polyfill"]);
require(["fast-text-encoding"]);
require(["intersection-observer"]);
require(["classlist-polyfill"]);
// Expose jQuery globally
@ -757,7 +762,6 @@ var AppInfo = {};
// TODO remove these libraries
// all of these have been modified so we need to fix that first
define("headroom", [componentsPath + "/headroom/headroom"], returnFirstDependency);
define("scroller", [componentsPath + "/scroller"], returnFirstDependency);
define("navdrawer", [componentsPath + "/navdrawer/navdrawer"], returnFirstDependency);
@ -772,6 +776,15 @@ var AppInfo = {};
define("emby-slider", [elementsPath + "/emby-slider/emby-slider"], returnFirstDependency);
define("emby-textarea", [elementsPath + "/emby-textarea/emby-textarea"], returnFirstDependency);
define("emby-toggle", [elementsPath + "/emby-toggle/emby-toggle"], returnFirstDependency);
define("emby-scroller", [elementsPath + "/emby-scroller/emby-scroller"], returnFirstDependency);
define("emby-tabs", [elementsPath + "/emby-tabs/emby-tabs"], returnFirstDependency);
define("emby-scrollbuttons", [elementsPath + "/emby-scrollbuttons/emby-scrollbuttons"], returnFirstDependency);
define("emby-itemrefreshindicator", [elementsPath + "/emby-itemrefreshindicator/emby-itemrefreshindicator"], returnFirstDependency);
define("emby-itemscontainer", [elementsPath + "/emby-itemscontainer/emby-itemscontainer"], returnFirstDependency);
define("emby-playstatebutton", [elementsPath + "/emby-playstatebutton/emby-playstatebutton"], returnFirstDependency);
define("emby-ratingbutton", [elementsPath + "/emby-ratingbutton/emby-ratingbutton"], returnFirstDependency);
define("emby-progressbar", [elementsPath + "/emby-progressbar/emby-progressbar"], returnFirstDependency);
define("emby-programcell", [elementsPath + "/emby-programcell/emby-programcell"], returnFirstDependency);
define("webSettings", [scriptsPath + "/settings/webSettings"], returnFirstDependency);
define("appSettings", [scriptsPath + "/settings/appSettings"], returnFirstDependency);
@ -790,12 +803,7 @@ var AppInfo = {};
define("playerSettingsMenu", [componentsPath + "/playback/playersettingsmenu"], returnFirstDependency);
define("playMethodHelper", [componentsPath + "/playback/playmethodhelper"], returnFirstDependency);
define("brightnessOsd", [componentsPath + "/playback/brightnessosd"], returnFirstDependency);
define("emby-itemscontainer", [componentsPath + "/emby-itemscontainer/emby-itemscontainer"], returnFirstDependency);
define("alphaNumericShortcuts", [componentsPath + "/alphanumericshortcuts/alphanumericshortcuts"], returnFirstDependency);
define("emby-scroller", [componentsPath + "/emby-scroller/emby-scroller"], returnFirstDependency);
define("emby-tabs", [componentsPath + "/emby-tabs/emby-tabs"], returnFirstDependency);
define("emby-scrollbuttons", [componentsPath + "/emby-scrollbuttons/emby-scrollbuttons"], returnFirstDependency);
define("emby-itemrefreshindicator", [componentsPath + "/emby-itemrefreshindicator/emby-itemrefreshindicator"], returnFirstDependency);
define("multiSelect", [componentsPath + "/multiselect/multiselect"], returnFirstDependency);
define("alphaPicker", [componentsPath + "/alphapicker/alphapicker"], returnFirstDependency);
define("tabbedView", [componentsPath + "/tabbedview/tabbedview"], returnFirstDependency);
@ -822,8 +830,6 @@ var AppInfo = {};
define("searchFields", [componentsPath + "/search/searchfields"], returnFirstDependency);
define("searchResults", [componentsPath + "/search/searchresults"], returnFirstDependency);
define("upNextDialog", [componentsPath + "/upnextdialog/upnextdialog"], returnFirstDependency);
define("fullscreen-doubleclick", [componentsPath + "/fullscreen/fullscreen-dc"], returnFirstDependency);
define("fullscreenManager", [componentsPath + "/fullscreenManager", "events"], returnFirstDependency);
define("subtitleAppearanceHelper", [componentsPath + "/subtitlesettings/subtitleappearancehelper"], returnFirstDependency);
define("subtitleSettings", [componentsPath + "/subtitlesettings/subtitlesettings"], returnFirstDependency);
define("displaySettings", [componentsPath + "/displaysettings/displaysettings"], returnFirstDependency);
@ -852,8 +858,6 @@ var AppInfo = {};
define("objectassign", [componentsPath + "/polyfills/objectassign"], returnFirstDependency);
define("focusPreventScroll", [componentsPath + "/polyfills/focusPreventScroll"], returnFirstDependency);
define("userdataButtons", [componentsPath + "/userdatabuttons/userdatabuttons"], returnFirstDependency);
define("emby-playstatebutton", [componentsPath + "/userdatabuttons/emby-playstatebutton"], returnFirstDependency);
define("emby-ratingbutton", [componentsPath + "/userdatabuttons/emby-ratingbutton"], returnFirstDependency);
define("listView", [componentsPath + "/listview/listview"], returnFirstDependency);
define("indicators", [componentsPath + "/indicators/indicators"], returnFirstDependency);
define("viewSettings", [componentsPath + "/viewsettings/viewsettings"], returnFirstDependency);

View file

@ -872,5 +872,11 @@
"CancelSeries": "Откажи сериите",
"CancelRecording": "Откажи записа",
"ButtonSplit": "Раздели",
"ButtonResetEasyPassword": "Нулиране на бързия ПИН код"
"ButtonResetEasyPassword": "Нулиране на бързия ПИН код",
"ButtonRevoke": "Отмени",
"ButtonEditOtherUserPreferences": "Редакция на потребителския профил, изображение и лични предпочитания.",
"BoxRear": "Комплект (стар)",
"BoxSet": "Комплект",
"AuthProviderHelp": "Избор на доставчик на услуга за Автентификация, която ще се използва за автентификация на потребителската парола.",
"AllowedRemoteAddressesHelp": "Списък с IP адреси или IP/маска записи, разделени със запетая, които ще имат отдалечен достъп. Ако полето не е попълнено всички адреси ще имат отдалечен достъп."
}

View file

@ -732,7 +732,7 @@
"XmlTvNewsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes de notícies. Separa'n varis emprant '|'.",
"XmlTvSportsCategoriesHelp": "Els programes amb aquestes categories es mostraran com a programes esportius. Separa'n varis emprant '|'.",
"Books": "Llibres",
"Folders": "Directoris",
"Folders": "Carpetes",
"Photos": "Fotos",
"Shows": "Programes",
"Songs": "Cançons",
@ -741,7 +741,7 @@
"Channels": "Canals",
"Collections": "Col·leccions",
"Favorites": "Preferits",
"HeaderAlbumArtists": "Artistes dels Àlbums",
"HeaderAlbumArtists": "Artistes del Àlbum",
"HeaderFavoriteAlbums": "Àlbums Preferits",
"HeaderFavoriteArtists": "Artistes Preferits",
"HeaderFavoriteEpisodes": "Episodis Preferits",

View file

@ -999,9 +999,9 @@
"OptionWeekly": "Týdenní",
"OriginalAirDateValue": "Datum vysílání originálu: {0}",
"Overview": "Přehled/Obsah",
"PackageInstallCancelled": "Instalace {0} zrušena.",
"PackageInstallCompleted": "Instalace {0} dokončena.",
"PackageInstallFailed": "Instalace {0} selhala.",
"PackageInstallCancelled": "Instalace {0} (verze {1}) zrušena.",
"PackageInstallCompleted": "Instalace {0} (verze {1}) dokončena.",
"PackageInstallFailed": "Instalace {0} (verze {1}) selhala.",
"ParentalRating": "Rodičovské hodnocení",
"PasswordMatchError": "Heslo a potvrzení hesla musí souhlasit.",
"PasswordResetComplete": "Heslo bylo obnoveno.",
@ -1022,7 +1022,7 @@
"PlayNext": "Přehrát další",
"PlayNextEpisodeAutomatically": "Automaticky přehrávat další epizodu",
"PlayOnAnotherDevice": "Přehrát na jiném zařízení",
"PlaybackErrorNoCompatibleStream": "Žádné kompatibilní streamy nejsou v současné době k dispozici. Zkuste to prosím později, nebo pro více podrobností kontaktujte svého správce systému.",
"PlaybackErrorNoCompatibleStream": "Tento klient není kompatibilní s médiem a server neodesílá kompatibilní formát médií.",
"PlaybackErrorNotAllowed": "V současné době nejste oprávněni přehrávat tento obsah. Pro více informací se obraťte se na správce systému.",
"PlaybackErrorPlaceHolder": "Chcete-li toto video přehrát, vložte disk.",
"Played": "Přehráno",
@ -1223,7 +1223,7 @@
"AirDate": "Datum vysílání",
"Aired": "Vysíláno",
"Alerts": "Upozornění",
"AllComplexFormats": "Všechny komplexní formáty (ASS, SSA, VOBSUB, PGS, SUB/IDX, atd.)",
"AllComplexFormats": "Všechny komplexní formáty (ASS, SSA, VOBSUB, PGS, SUB/IDX, atd.)",
"AllLibraries": "Všechny knihovny",
"AllowDeletionFromAll": "Povolit smazání médií ze všech knihoven",
"AllowMediaConversion": "Povolit konverzi médií",
@ -1248,7 +1248,7 @@
"Blacklist": "Černá listina",
"BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)",
"Browse": "Procházet",
"BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při překódování videa. Vynechání tohoto zlepší výkon serveru. Chcete-li vypálit grafické formáty (VOBSUB, PGS, SUB / IDX atd.) a některé titulky ASS / SSA, vyberte možnost Auto.",
"BurnSubtitlesHelp": "Určuje, zda má server vypalovat titulky při překódování videa. Vynechání tohoto zlepší výkon serveru. Chcete-li vypálit grafické formáty (VOBSUB, PGS, SUB / IDX atd.) a některé titulky ASS nebo SSA, vyberte možnost Auto.",
"ButtonInfo": "Info",
"ButtonMenu": "Menu",
"ButtonOk": "Ok",
@ -1575,8 +1575,8 @@
"Track": "Stopa",
"Season": "Sezóna",
"ReleaseGroup": "Vydavatel",
"PreferEmbeddedEpisodeInfosOverFileNames": "Preferovat vložené informace o epizodě před názvy souborů",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Používá se informace o epizodě z vložených metadat, pokud jsou k dispozici.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Preferovat vloženou informaci o epizodě před názvem souboru",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Používat informaci o epizodě z vložených metadat, pokud jsou k dispozici.",
"Person": "Osoba",
"OtherArtist": "Ostatní interpreti",
"Movie": "Film",
@ -1594,5 +1594,14 @@
"PersonRole": "jako {0}",
"ListPaging": "{0}-{1} ze {2}",
"WriteAccessRequired": "Jellyfin Server potřebuje oprávnění pro zápis v této složce. Zkontrolujte oprávnění a zkuste to znovu.",
"PathNotFound": "Cesta nebyla nalezena. Zkontrolujte, zda je platná a zkuste to znovu."
"PathNotFound": "Cesta nebyla nalezena. Zkontrolujte, zda je platná a zkuste to znovu.",
"WeeklyAt": "V {0} v {1}",
"LastSeen": "Naposledy zobrazené {0}",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
"LabelLibraryPageSizeHelp": "Určuje počet položek k zobrazení na stránce knihovny. Nastavte na 0 pro vypnutí stránkování.",
"LabelLibraryPageSize": "Velikost stránky knihovny:",
"LabelDeinterlaceMethod": "Metoda odstranění prokládání:",
"DeinterlaceMethodHelp": "Vyberte metodu odstranění prokládání obrazu při překódování obsahu.",
"UnsupportedPlayback": "Jellyfin nemůže dešifrovat obsah chráněný technologií DRM, ale pokusí se zobrazit o veškerý obsah, včetně chráněných titulů. Některé soubory se mohou zdát úplně černé kvůli šifrování nebo jiným nepodporovaným funkcím, jako jsou například interaktivní funkce."
}

View file

@ -12,11 +12,11 @@
"AllChannels": "Alle kanaler",
"AllEpisodes": "Alle episoder",
"AllLibraries": "Alle biblioteker",
"AllowHWTranscodingHelp": "Hvis aktiveret, omkoder tuneren streams on-the-fly. Dette kan hjælpe med at reducere omkodning der kræves af Jellyfin Server.",
"AllowHWTranscodingHelp": "Lader tuneren omkode streams on-the-fly. Dette kan hjælpe med at reducere omkodning der kræves af serveren.",
"AllowMediaConversion": "Tillad media konvertering",
"AllowMediaConversionHelp": "Giv eller nægt adgang til Konvertér Media featuren.",
"AllowOnTheFlySubtitleExtraction": "Tillad udtræk af undertekster on-the-fly",
"AllowOnTheFlySubtitleExtractionHelp": "Indeholdte undertekster kan trækkes ud af videoer og leveres til Jellyfin apps i ren tekst for at afhjælpe video kodning. På nogle systemer kan dette tage lang tid og forårsage at afspilning kan hænge mens den udtrækker. Slå dette fra, for at have undertekster brændt ind i video kodningen når det er supporteret på klient enheden.",
"AllowOnTheFlySubtitleExtractionHelp": "Indeholdte undertekster kan trækkes ud af videoer og leveres til klienter i ren tekst for at afhjælpe video kodning. På nogle systemer kan dette tage lang tid og forårsage at afspilning kan hænge mens den udtrækker. Slå dette fra, for at have undertekster brændt ind i video kodningen når det er supporteret på klient enheden.",
"AllowRemoteAccess": "Tillad fjernadgang til denne Jellyfin Server.",
"AllowRemoteAccessHelp": "Hvis ikke markeret, vil alle fjernforbindelser blive blokeret.",
"AllowedRemoteAddressesHelp": "Komma seperareret liste over IP adresser og netmasker der har ret til fjernadgang. Hvis blank er alle adresser tilladte.",
@ -29,7 +29,7 @@
"BirthDateValue": "Født: {0}",
"BirthLocation": "Fødselslokation",
"BirthPlaceValue": "Fødselssted: {0}",
"BookLibraryHelp": "Lyd- og tekstbøger er understøttet. Se {0}Jellyfins guide til navngivning af bøger{1}.",
"BookLibraryHelp": "Lyd- og tekstbøger er understøttet. Se {0}bog guide til navngivning af bøger{1}.",
"Browse": "Gennemse",
"BrowsePluginCatalogMessage": "Gennemse vores plugin-katalog for at se tilgængelige plugins.",
"ButtonAdd": "Tilføj",
@ -53,7 +53,7 @@
"ButtonEdit": "Rediger",
"ButtonEditImages": "Rediger billeder",
"ButtonEditOtherUserPreferences": "Rediger denne brugers profil, billede og personlige indstillinger.",
"ButtonForgotPassword": "Glemt adgangskode",
"ButtonForgotPassword": "Glemt Adgangskode",
"ButtonFullscreen": "Fuld skærm",
"ButtonGotIt": "Forstået",
"ButtonHelp": "Hjælp",
@ -136,30 +136,30 @@
"DoNotRecord": "Optag ikke",
"Download": "Hent",
"DrmChannelsNotImported": "Kanaler med DRM importeres ikke.",
"EasyPasswordHelp": "Din pinkode bruges til offline adgang til understøttede Jellyfin apps, og kan også bruges til nemt login inden for eget netværk.",
"EasyPasswordHelp": "Din nemme pin-kode bruges til offline adgang på understøttede klienter og kan også bruges til nem login på netværket.",
"Edit": "Rediger",
"EditImages": "Rediger billeder",
"EditSubtitles": "Rediger undertekster",
"EnableCinemaMode": "Aktiver biograftilstand",
"EnableColorCodedBackgrounds": "Aktiver farvekodet baggrunde",
"EnableCinemaMode": "Aktiver Biograftilstand",
"EnableColorCodedBackgrounds": "Aktiver Farvekodet baggrunde",
"EnableHardwareEncoding": "Aktiver hardware indkoding",
"EnablePhotos": "Aktiver fotos",
"EnablePhotosHelp": "Fotos bliver opdaget og vist sammen med andre mediefiler.",
"EnablePhotos": "Vis fotoer",
"EnablePhotosHelp": "Billeder registreres og vises sammen med andre mediefiler.",
"EnableStreamLooping": "Auto-gentag live streams",
"EnableStreamLoopingHelp": "Aktiver dette hvis live streams kun indeholder få sekunders data og skal efterspørgsel hele tiden. Aktivering af dette uden det er nødvendigt kan forårsage problemer.",
"Ended": "Færdig",
"EndsAtValue": "Slutter {0}",
"ErrorAddingListingsToSchedulesDirect": "Der opstod en fejl under tilføjelse af opstilling til din Schedules Direct-konto. Schedules Direct tillader kun et begrænset antal opstillinger pr. konto. Du bliver muligvis nød til at logge på Schedules Direct-hjemmesiden og fjerne andre lister fra din konto for at fortsætte.",
"ErrorAddingListingsToSchedulesDirect": "Der opstod en fejl ved tilføjelse af lineup til din Schedules Direct-konto. Schedules Direct tillader kun et begrænset antal opstillinger pr. Konto. Det kan være nødvendigt at du logger ind på Schedules Direct-webstedet og fjerner andre lister fra din konto, før du fortsætter.",
"ErrorAddingMediaPathToVirtualFolder": "Der opstod en fejl under tilføjelse af mediesti. Kontroller venligst at stien er gyldig og at Jellyfin Server-processen har adgang til denne lokation.",
"ErrorAddingTunerDevice": "Der opstod en fejl under tilføjelse af tuner-enhed. Kontroller venligst at den er tilgængelig og prøv igen.",
"ErrorAddingXmlTvFile": "Der opstod en fejl under tilgang til XmlTV-filen. Kontroller venligst at filen findes og prøv igen.",
"ErrorGettingTvLineups": "Der opstod en fejl under download af tv-opstillinger. Kontroller venligst at dine informationer er korrekte og prøv igen.",
"ErrorAddingXmlTvFile": "Der opstod en fejl under tilgang til XMLTV-filen. Kontroller venligst at filen findes og prøv igen.",
"ErrorGettingTvLineups": "Der opstod en fejl under download af TV-opstillinger. Kontroller venligst at dine informationer er korrekte og prøv igen.",
"ErrorMessageStartHourGreaterThanEnd": "Slut tid skal være større end start tid.",
"ErrorPleaseSelectLineup": "Vælg venligst en opstilling og prøv igen. Hvis ingen opstillinger er tilgængelige, så kontroller venligst at dit brugernavn, adgangskode og postnummer er korrekt.",
"ErrorSavingTvProvider": "Der opstod en fejl i forsøget på at gemme udbyder. Kontroller venligst at den er tilgængelig og prøv igen.",
"EveryNDays": "Hver {0} dage",
"ExitFullscreen": "Afslut fuldskærm",
"ExtractChapterImagesHelp": "Udvinding af kapitelbilleder lader Jellyfin apps vise grafiske menuer for scenevalg. Processen kan være langsom, cpu-intensiv og kræver muligvis adskillige gigabytes af lagerplads. Den køres når videoer opdages og desuden som en planlagt opgave, natligt. Den planlagte opgave kan konfigureres i området for planlagte opgaver. Det anbefales ikke at køre denne opgave under timer med spidsbelastning.",
"ExtractChapterImagesHelp": "Udtrækning af kapitelbilleder giver klienter mulighed for at vise grafiske scenevalgmenuer. Processen kan være langsom, ressourcekrævende og kan kræve flere gigabyte plads. Det kører, når videoer opdages, og også som en planlagt nat opgave. Skemaet kan konfigureres i det planlagte opgaverområde. Det anbefales ikke at køre denne opgave i de mest brugte timer.",
"FFmpegSavePathNotFound": "Vi er ikke i stand til at finde FFmpeg via stien du har angivet. FFprobe er også påkrævet og skal findes i samme mappe. Disse komponenter er som regel pakket i den samme download. Kontroller venligst stien og prøv igen.",
"FastForward": "Spol fremad",
"Favorite": "Favorit",
@ -170,9 +170,9 @@
"FolderTypeBooks": "Bøger",
"FolderTypeMovies": "Film",
"FolderTypeMusic": "Musik",
"FolderTypeMusicVideos": "Musikvideoer",
"FolderTypeMusicVideos": "Musik Videoer",
"FolderTypeTvShows": "TV",
"FolderTypeUnset": "Ikke valgt (blandet indhold)",
"FolderTypeUnset": "Blandet Indhold",
"Friday": "Fredag",
"Fullscreen": "Fuldskærm",
"General": "Generel",
@ -183,7 +183,7 @@
"H264CrfHelp": "Den Konstante Ratefaktor (CRF) er standardindstillingen for X264-koderen. Du kan sætte værdien i mellem 0 og 51, hvor de lavere værdier resulterer i bedre kvalitet (på bekostning af større filstørrelser). Fornuftige værdier er i mellem 18 og 28. Standarden for X264 er 23, så du kan bruge dette som udgangspunkt.",
"EncoderPresetHelp": "Vælg en hurtigere værdi for at forbedre ydeevne, eller en langsommere værdi for at forbedre kvalitet.",
"HDPrograms": "HD-programmer",
"HardwareAccelerationWarning": "Aktivering af hardwareacceleration kan forårsage ustabilitet i nogle miljøer. Kontroller at dit operativsystem og videodriver er ajourført. Hvis du har problemer med at afspille video efter aktivering af dette, bliver du nød til at skifte tilbage til Auto.",
"HardwareAccelerationWarning": "Aktivering af hardwareacceleration kan forårsage ustabilitet i nogle miljøer. Kontroller at dit operativsystem og videodriver er opdateret. Hvis du har problemer med at afspille video efter aktivering af dette, bliver du nød til at skifte tilbage til Ingen.",
"HeaderAccessSchedule": "Adgangsskema",
"HeaderAccessScheduleHelp": "Skab et adgangsskema for at begrænse adgangen til bestemte tidsrum.",
"HeaderActiveDevices": "Aktive enheder",
@ -197,9 +197,9 @@
"HeaderAdditionalParts": "Andre stier",
"HeaderAlert": "Advarsel",
"HeaderAllowMediaDeletionFrom": "Tillad Media Sletning Fra",
"HeaderApiKey": "API nøgle",
"HeaderApiKeys": "API nøgler",
"HeaderApiKeysHelp": "Eksterne applikationer skal have en API nøgle for at kunne kommunikere med Jellyfin. Nøgler udstedes ved at logge ind med en Jellyfin konto, eller ved manuelt at tildele applikationen en nøgle.",
"HeaderApiKey": "API Nøgle",
"HeaderApiKeys": "API Nøgler",
"HeaderApiKeysHelp": "Eksterne applikationer skal have en API-nøgle for at kunne kommunikere med Jellyfin. Nøgler udstedes ved at logge ind med en Jellyfin konto, eller ved manuelt at tildele applikationen en nøgle.",
"HeaderAudioSettings": "Lydindstillinger",
"HeaderAutomaticUpdates": "Automatiske opdateringer",
"HeaderBlockItemsWithNoRating": "Klokér titler uden eller med ukendt bedømmelses information:",
@ -266,7 +266,7 @@
"HeaderItems": "Element",
"HeaderKeepRecording": "Bevar Optagelse",
"HeaderKeepSeries": "Bevar Serie",
"HeaderKodiMetadataHelp": "For at aktivere NFO metadata, rediger et bibliotek i Jellyfin biblioteks redigering og find metadata gemmer sektionen.",
"HeaderKodiMetadataHelp": "For at aktivere eller deaktivere NFO-metadata skal du redigere et bibliotek i Jellyfin-biblioteksopsætningen og finde afsnittet om metadata.",
"HeaderLatestEpisodes": "Sidste episoder",
"HeaderLatestMedia": "Seneste medier",
"HeaderLatestMovies": "Seneste film",
@ -287,7 +287,7 @@
"HeaderMusicVideos": "Musikvideoer",
"HeaderMyDevice": "Min Enhed",
"HeaderMyMedia": "Mine medier",
"HeaderNewApiKey": "Ny API nøgle",
"HeaderNewApiKey": "Ny API Nøgle",
"HeaderNewDevices": "Nye Enheder",
"HeaderNextUp": "Næste",
"HeaderOnNow": "Vises Nu",
@ -373,7 +373,7 @@
"Images": "Billeder",
"ImportFavoriteChannelsHelp": "Hvis aktiveret, importeres der udelukkende kanaler der er markeret som favoritter på tuner-enheden.",
"ImportMissingEpisodesHelp": "hvis aktiveret, vil information omkring manglende episoder bliver importeret ind i din Jellyfin-database og blive vist i sæsoner og serier. Dette medfører muligvis længere biblioteksscanninger.",
"InstallingPackage": "Installerer {0}",
"InstallingPackage": "Installerer {0} (version {1})",
"InstantMix": "Instant Mix",
"ItemCount": "{0} elementer",
"Items": "emner",
@ -397,13 +397,13 @@
"LabelAll": "Alle",
"LabelAllowHWTranscoding": "Tillad hardware-omkodning",
"LabelAllowServerAutoRestart": "Tillad serveren at genstarte automatisk for at påføre opdateringer",
"LabelAllowServerAutoRestartHelp": "Serveren vil kun genstarte i inaktive perioder, når ingen brugere er aktive",
"LabelAllowServerAutoRestartHelp": "Serveren vil kun genstarte i inaktive perioder, når ingen brugere er aktive.",
"LabelAllowedRemoteAddresses": "Fjernadgang IP adresse filter:",
"LabelAllowedRemoteAddressesMode": "Fjernadgang IP adresse filter mode:",
"LabelAppName": "App navn",
"LabelAppNameExample": "F. eks: Sickbeard, NzbDrone",
"LabelAppNameExample": "F. eks: Sickbeard, Sonarr",
"LabelArtists": "Artister:",
"LabelArtistsHelp": "Angiv flere ved at sætte mellem dem ;",
"LabelArtistsHelp": "Angiv flere ved at sætte ;",
"LabelAudioLanguagePreference": "Foretrukket lydsprog:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Genopfrisk automatisk metadata fra internettet:",
"LabelBindToLocalNetworkAddress": "Bind til lokal netværksadresse:",
@ -411,9 +411,9 @@
"LabelBirthDate": "Fødselsdato:",
"LabelBirthYear": "Fødselsår:",
"LabelBlastMessageInterval": "Interval mellem 'i live' beskeder (sekunder)",
"LabelBlastMessageIntervalHelp": "Angiver intervallet i sekunder mellem serverens 'i live' beskeder.",
"LabelBlastMessageIntervalHelp": "Bestemmer varigheden i sekunder mellem eksplosive levende meddelelser.",
"LabelCachePath": "Cachesti:",
"LabelCachePathHelp": "Angiv en brugerdefineret lokation for server cachefiler, så som billeder. Efterlad blankt for at benytte serverens standard.",
"LabelCachePathHelp": "Angiv en brugerdefineret placering for servercache-filer, såsom billeder. Lad være tom for at bruge serverens standard.",
"LabelCancelled": "Annulleret",
"LabelChannels": "Kanaler:",
"LabelCollection": "Samling:",
@ -425,8 +425,8 @@
"LabelCustomCertificatePath": "Brugerdefineret SSL certifikat sti:",
"LabelCustomCertificatePathHelp": "Sti til PKCS #12 fil indeholdende et certifikat og privat nøgle for at aktivere TLS understøttelse på et brugerdefineret domæne.",
"LabelCustomCss": "Brugerdefineret CSS:",
"LabelCustomCssHelp": "Anvend din egen css til webinterfacet.",
"LabelCustomDeviceDisplayName": "Vist navn:",
"LabelCustomCssHelp": "Anvend din egen stil til webinterfacet.",
"LabelCustomDeviceDisplayName": "Visningsnavn:",
"LabelCustomDeviceDisplayNameHelp": "Angiv en brugerdefineret navn. hvis der ikke angives et navn, bruges det navn enheden sender.",
"LabelCustomRating": "Brugerdefineret bedømmelse:",
"LabelDateAdded": "Dato for tilføjelse:",
@ -444,24 +444,24 @@
"LabelDisplayOrder": "Visningsorden:",
"LabelDisplaySpecialsWithinSeasons": "Vis specialepisoder sammen med den sæson de blev sent i",
"LabelDownMixAudioScale": "Forøg lydstyrke ved nedmiksning:",
"LabelDownMixAudioScaleHelp": "Forøg lydstyrken når der nedmikses. Sæt værdien til 1 for at beholde den originale lydstyrke.",
"LabelDownMixAudioScaleHelp": "Forøg lydstyrken når der nedmikses. Sæt værdien til en, for at beholde den originale lydstyrke.",
"LabelDownloadLanguages": "Hent sprog:",
"LabelDropImageHere": "Smid billede her.",
"LabelDropImageHere": "Drop billede her, eller Tryk for at vælge.",
"LabelEasyPinCode": "Pinkode:",
"LabelEmbedAlbumArtDidl": "Indsæt album billede i DIDL",
"LabelEmbedAlbumArtDidlHelp": "Nogle enheder foretrækker denne metode til overførsel af album billede. Andre kan fejle når dette er aktiveret.",
"LabelEnableAutomaticPortMap": "Aktiver automatisk port mapping",
"LabelEnableAutomaticPortMapHelp": "Forsøg at mappe den offentlige port til den lokale port med uPnP. Dette virker ikke med alle routere.",
"LabelEnableAutomaticPortMapHelp": "Forsøg at mappe den offentlige port til den lokale port med uPnP. Dette virker ikke med alle routere. Ændringerne vil først træde i kræft et en server genstart.",
"LabelEnableBlastAliveMessages": "Masseudsend 'i live' beskeder",
"LabelEnableBlastAliveMessagesHelp": "Aktiver dette hvis UPnP enheder har problemer med forbindelsen til serveren.",
"LabelEnableDlnaClientDiscoveryInterval": "Interval for klientsøgning (sekunder)",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "angiver intervallet i sekunder mellem Jellyfins SSDP søgninger.",
"LabelEnableDlnaDebugLogging": "Aktiver debu logning af DLNA",
"LabelEnableDlnaDebugLoggingHelp": "Dette generer meget store logfiler, og er kun anbefalet at bruge til fejlfindingsformål.",
"LabelEnableDlnaDebugLoggingHelp": "Opret store logfiler og skal kun bruges efter behov til fejlfinding.",
"LabelEnableDlnaPlayTo": "Aktiver DLNA \"Afspil Til\"",
"LabelEnableDlnaPlayToHelp": "Jellyfin kan finde enheder i dit netværk og tilbyde at kontrollere dem.",
"LabelEnableDlnaServer": "Aktiver DNLA server",
"LabelEnableDlnaServerHelp": "Tillader UPnP enheder i dit netværk at gennemse og afspille Jellyfins indhold.",
"LabelEnableDlnaPlayToHelp": "Find enheder i dit netværk og tilbyd at fjernstyre dem.",
"LabelEnableDlnaServer": "Aktiver DLNA server",
"LabelEnableDlnaServerHelp": "Tillader UPnP enheder i dit netværk at gennemse og afspille indhold.",
"LabelEnableRealtimeMonitor": "Aktiver realtidsovervågning",
"LabelEnableRealtimeMonitorHelp": "Ændringer vil blive behandlet øjeblikkeligt på understøttede filsystemer.",
"LabelEnableSingleImageInDidlLimit": "Begræns til et enkelt indlejret billede",
@ -471,56 +471,56 @@
"LabelEvent": "Hændelse:",
"LabelEveryXMinutes": "Hver:",
"LabelExtractChaptersDuringLibraryScan": "Udtræk kapitelbilleder under biblioteksskanning",
"LabelExtractChaptersDuringLibraryScanHelp": "Aktiver dette for at udtrække kapitelbillleder mens videofiler bliver importeret under biblioteksskanningen. Hvi det ikke er aktiveret, bliver de udtrukket når den planlagte opgave kapitelbilleder kører, og lader den almindelige biblioteksskanning afslutte hurtigere.",
"LabelExtractChaptersDuringLibraryScanHelp": "Generere kapitelbillleder mens videofiler bliver importeret under biblioteksskanningen. Alternativt bliver de udtrukket når den planlagte opgave kapitelbilleder kører, hvilket tillader den almindelige biblioteksskanning at afslutte hurtigere.",
"LabelFailed": "Fejlet",
"LabelFileOrUrl": "Fil eller url:",
"LabelFileOrUrl": "Fil eller URL:",
"LabelFinish": "Afslut",
"LabelForgotPasswordUsernameHelp": "Indtast dit brugernavn, hvis du kan huske det.",
"LabelFriendlyName": "System venligt navn:",
"LabelServerNameHelp": "Dette navn bruges til at identificere serveren. Hvis det ikke udfyldes, bruges computerens navn.",
"LabelServerNameHelp": "Dette navn bruges til at identificere serveren. Som udgangspunkt anvendes computerens navn.",
"LabelGroupMoviesIntoCollections": "Grupper film i samlinger",
"LabelGroupMoviesIntoCollectionsHelp": "Film i samlinger vil blive vist som en samlet enhed i filmlister.",
"LabelH264Crf": "H264-kodning CRF:",
"LabelEncoderPreset": "Forudindstillet H264-kodning:",
"LabelHardwareAccelerationType": "Hardwareacceleration:",
"LabelHardwareAccelerationTypeHelp": "Kun tilgængelig for understøttede systemer.",
"LabelHardwareAccelerationTypeHelp": "Hardwareacceleration kræver yderligere konfiguration.",
"LabelHttpsPort": "Lokalt HTTPS portnummer:",
"LabelHttpsPortHelp": "Det portnummer Jellyfins https-server bruger.",
"LabelIconMaxHeight": "Max højde på ikoner:",
"LabelIconMaxHeightHelp": "Maksimumopløsningen på ikoner der bliver vist med upnp:icon",
"LabelIconMaxWidth": "Max bredde på ikoner:",
"LabelIconMaxWidthHelp": "Maksimumopløsningen på ikoner der bliver vist med upnp:icon",
"LabelHttpsPortHelp": "Det TCP-portnummer, som Jellyfins HTTPS-server skal benytte.",
"LabelIconMaxHeight": "Maximal højde af ikoner:",
"LabelIconMaxHeightHelp": "Maksimalopløsningen af ikoner, der bliver vist med upnp:icon.",
"LabelIconMaxWidth": "Maximal bredde på ikoner:",
"LabelIconMaxWidthHelp": "Maksimalopløsningen på ikoner der bliver vist med upnp:icon.",
"LabelIdentificationFieldHelp": "En case-insensitive substring eller regex ekspression.",
"LabelImageFetchersHelp": "Aktiver og ranger dine fortrukne billede-hentere i en prioriteret rækkefølge.",
"LabelImageType": "Billedtype:",
"LabelImportOnlyFavoriteChannels": "Begræns til kanaler der er markeret som favoritter",
"LabelInNetworkSignInWithEasyPassword": "Tillad login inden for eget netværk med pinkode",
"LabelInNetworkSignInWithEasyPasswordHelp": "Aktiver dette for at loge ind i Jellyfin apps med din pinkode inden for dit eget netværk. Din almindelige adgangskode skal du så kun bruge når du ikke er hjemme. Hvis pinkoden er tom, kan du logge ind uden adgangskode inden for dit eget netværk.",
"LabelInNetworkSignInWithEasyPasswordHelp": "Brug den lette pinkode til at logge ind på klienter i dit lokale netværk. Din almindelige adgangskode er kun nødvendig hjemmefra. Hvis pinkoden efterlades tom, behøver du ikke en adgangskode på dit hjemmenetværk.",
"LabelKeepUpTo": "Bevar op til:",
"LabelKidsCategories": "Børnekategorier:",
"LabelKodiMetadataDateFormat": "Format for udgivelsesdato:",
"LabelKodiMetadataDateFormatHelp": "Alle datoer i NFO-filer vil blive læst og skrevet med dette format.",
"LabelKodiMetadataEnableExtraThumbs": "kopier extrafanart til extrathumbs",
"LabelKodiMetadataDateFormatHelp": "Alle datoer i NFO-filer vil blive analyseret med dette format.",
"LabelKodiMetadataEnableExtraThumbs": "Kopier ekstra fanart til extrathumbs",
"LabelKodiMetadataEnableExtraThumbsHelp": "Ved hentning af billeder, kan de gemmes i både extrafanart og extrathumbs. Dette giver maksimal Kodi skin kompatibilitet.",
"LabelKodiMetadataEnablePathSubstitution": "Aktiver stisubstitution",
"LabelKodiMetadataEnablePathSubstitutionHelp": "Aktiverer stisubstitution for billedstier med serverens stisubstitutionsindstillinger.",
"LabelKodiMetadataSaveImagePaths": "Gem stier til billeder i Nfo-filer",
"LabelKodiMetadataSaveImagePathsHelp": "Dette er anbefalet hvis du har billedfiler med navne der ikke lever op til Kodis retningslinjer.",
"LabelKodiMetadataUser": "Gem brugers set data til NFO'er for:",
"LabelKodiMetadataUserHelp": "Aktiver dette for at komme set data til NFO filer som andre programmer kan bruge.",
"LabelKodiMetadataUser": "Gem brugerdata til NFO-filer til:",
"LabelKodiMetadataUserHelp": "Gem overvågningsdata til NFO-filer til andre applikationer.",
"LabelLanNetworks": "LAN netwærk:",
"LabelLanguage": "Sprog:",
"LabelLineup": "Opstilling:",
"LabelLocalHttpServerPortNumber": "Lokalt http portnummer:",
"LabelLocalHttpServerPortNumberHelp": "Det portnummer Jellyfins http-server bruger.",
"LabelLocalHttpServerPortNumber": "Lokalt HTTP-portnummer:",
"LabelLocalHttpServerPortNumberHelp": "Det TCP-portnummer, som Jellyfin's HTTP-server skal binde til.",
"LabelLockItemToPreventChanges": "Lås for at undgå fremtidige ændringer",
"LabelLoginDisclaimer": "Login ansvarsfraskrivelse:",
"LabelLoginDisclaimerHelp": "Dette bliver vist i bunden af loginsiden.",
"LabelManufacturer": "Producent",
"LabelManufacturerUrl": "Producent url",
"LabelLoginDisclaimerHelp": "En besked, som vises i bunden af loginsiden.",
"LabelManufacturer": "Producent:",
"LabelManufacturerUrl": "Producentens URL",
"LabelMaxBackdropsPerItem": "Maksimum antal af bagtæpper per element:",
"LabelMaxParentalRating": "Højst tilladte aldersgrænse:",
"LabelMaxResumePercentage": "Maks. fortsæt procentdel:",
"LabelMaxResumePercentage": "Maksimal fortsæt procentdel:",
"LabelMaxResumePercentageHelp": "Medier anses som fuldt afspillet, hvis de stoppes efter denne tid.",
"LabelMaxScreenshotsPerItem": "Maksimum antal af skærmbilleder per element:",
"LabelMaxStreamingBitrate": "Maks. streaming kvalitet:",
@ -538,9 +538,9 @@
"LabelMethod": "Metode:",
"LabelMinBackdropDownloadWidth": "Minimum baggrundsbillede bredde:",
"LabelMinResumeDuration": "Min. fortsæt tidsrum (sekunder):",
"LabelMinResumeDurationHelp": "Medier med kortere afspilningstid en denne kan ikke fortsættes.",
"LabelMinResumePercentage": "Min. fortsæt procentdel:",
"LabelMinResumePercentageHelp": "Medier anses om ikke afspillet, hvis de stoppes inden denne tid.",
"LabelMinResumeDurationHelp": "Den korteste videolængde i sekunder, der gemmer afspilningsplacering og giver dig mulighed for at genoptage.",
"LabelMinResumePercentage": "Minimal fortsæt procentdel:",
"LabelMinResumePercentageHelp": "Medier anses som ikke afspillede, hvis de stoppes inden denne tid.",
"LabelMinScreenshotDownloadWidth": "Minimum skærmbillede bredde:",
"LabelModelDescription": "Modelbeskrivelse",
"LabelModelName": "Modelnavn",
@ -548,10 +548,10 @@
"LabelMonitorUsers": "Overvåg aktivitet fra:",
"LabelMovieCategories": "Filmkategorier:",
"LabelMoviePrefix": "Film-præfiks:",
"LabelMoviePrefixHelp": "Angiv venligst her hvis der tilføjes et præfiks til filmtitler, så Jellyfin kan håndtere det korrekt.",
"LabelMoviePrefixHelp": "Angiv venligst her hvis der tilføjes et præfiks til filmtitler, så serveren kan håndtere det korrekt.",
"LabelMovieRecordingPath": "Film afspilningssti (valgfri):",
"LabelMusicStreamingTranscodingBitrate": "Bitrate for musiktranskodning:",
"LabelMusicStreamingTranscodingBitrateHelp": "Angiv en maksimal bitrate når der streames musik",
"LabelMusicStreamingTranscodingBitrateHelp": "Angiv en maksimal bitrate når der streames musik.",
"LabelName": "Navn:",
"LabelNewName": "Nyt navn:",
"LabelNewPassword": "Ny kode:",
@ -590,10 +590,10 @@
"LabelProtocol": "Protokol:",
"LabelProtocolInfo": "Protokolinformation:",
"LabelProtocolInfoHelp": "Den værdi der bruges til svar på GetProtocolInfo-forespørgsler fra enheden.",
"LabelPublicHttpPort": "Offentligt http portnummer:",
"LabelPublicHttpPortHelp": "Det offentlige portnummer som bliver knyttet til det lokale http portnummer.",
"LabelPublicHttpsPort": "Offentligt https portnummer:",
"LabelPublicHttpsPortHelp": "Det offentlige portnummer som bliver knyttet til det lokale https portnummer.",
"LabelPublicHttpPort": "Offentligt HTTP-portnummer:",
"LabelPublicHttpPortHelp": "Det offentlige portnummer som bliver knyttet til det lokale HTTP-portnummer.",
"LabelPublicHttpsPort": "Offentligt HTTPS portnummer:",
"LabelPublicHttpsPortHelp": "Det offentlige portnummer som bliver knyttet til det lokale HTTPS portnummer.",
"LabelReadHowYouCanContribute": "Lær hvordan du kan bidrage.",
"LabelRecord": "Optag:",
"LabelRecordingPath": "Standard afspilningssti:",
@ -614,7 +614,7 @@
"LabelSerialNumber": "Serienummer",
"LabelSeriesRecordingPath": "Serier afspilningssti (valgfri):",
"LabelServerHost": "Vært:",
"LabelServerHostHelp": "F. eks: 192.168.1.100 eller https://myserver.com",
"LabelServerHostHelp": "F. eks: 192.168.1.100:8096 eller https://myserver.com",
"LabelSimultaneousConnectionLimit": "samtidige stream begrænsning:",
"LabelSkipIfAudioTrackPresent": "Undlad hvis standardlydsporet er det samme sprog",
"LabelSkipIfAudioTrackPresentHelp": "Angiv ikke dette for at sikre at alle videoer har undertekster, uanset hvilket sprog lydsporet anvender.",
@ -647,7 +647,7 @@
"LabelTranscodingTempPathHelp": "Definér en bugerdefineret sti til transkodede filer til klienter. Lad den stå tom for at bruge standardmappen i serverens datamappe.",
"LabelTranscodingTemporaryFiles": "Midlertidige filer til omkodning:",
"LabelTranscodingThreadCount": "Antal af omkodningstråde:",
"LabelTranscodingThreadCountHelp": "Vælg det maksimale antal af tråde der bruges under omkodning. Reduktion af antallet af tråde sænker cpu-forbrug, men resulterer muligvis i at konverteringer ikke foregår hurtigt nok til en jævn afspilning.",
"LabelTranscodingThreadCountHelp": "Vælg det maksimale antal af tråde der bruges under transcoding. Reduktion af antallet af tråde sænker CPU-forbrug, men resulterer muligvis i at konverteringer ikke foregår hurtigt nok til en jævn afspilning.",
"LabelTriggerType": "Udløsertype:",
"LabelTunerIpAddress": "IP-adresse for Tuner:",
"LabelTunerType": "Tunertype:",
@ -707,37 +707,37 @@
"MessageConfirmRemoveMediaLocation": "Er du sikker på du ønsker at fjerne denne lokalisation?",
"MessageConfirmRestart": "Er du sikker på du ønsker at genstarte Jellyfin?",
"MessageConfirmRevokeApiKey": "Er du sikker på du ønsker at invalidere denne api nøgle? Applikationens forbindelse til Jellyfin vil blive afbrudt øjeblikkeligt.",
"MessageConfirmShutdown": "Er du sikker på du ønsker at lukke Jellyfin?",
"MessageConfirmShutdown": "Er du sikker på du ønsker at slukke for serveren?",
"MessageContactAdminToResetPassword": "Kontakt venligst din systemadministrator for at nulstille din adgangskode.",
"MessageCreateAccountAt": "Opret en konto hos {0}",
"MessageDeleteTaskTrigger": "Er du sikker på du ønsker at slette denne task trigger?",
"MessageDirectoryPickerBSDInstruction": "For BSD skal du muligvis konfigurere lager i dit FreeNAS Jail, før Jellyfin kan tilgå det.",
"MessageDirectoryPickerInstruction": "Netværksstier kan indtastes manuelt i tilfælde af at netværksknappen ikke kan lokalisere dine enheder. Foreksempel, {0} eller {1}.",
"MessageDirectoryPickerLinuxInstruction": "For Linux på Arch Linux, CentOS, Debian, Fedora, OpenSuse eller Ubuntu skal du give Jellyfin-systembrugeren minimum læseadgang til dine lagerlokationer.",
"MessageDirectoryPickerLinuxInstruction": "For Linux på Arch Linux, CentOS, Debian, Fedora, openSUSE eller Ubuntu, skal du give servicebrugeren mindst læseadgang til dine lagerpladser.",
"MessageDownloadQueued": "Download sat i kø.",
"MessageEnablingOptionLongerScans": "Aktivering af denne indstilling kan resultere i væsentlig længere biblioteks skan.",
"MessageFileReadError": "Der opstod en fejl i forsøget på at læse filen.",
"MessageForgotPasswordFileCreated": "Den følgende fil er blevet oprettet på din server og indeholder instruktioner vedrørende hvordan du skal fortsætte:",
"MessageForgotPasswordInNetworkRequired": "Prøv igen inde i dit hjemmenetværk for at igangsætte nulstilling af din adgangskode.",
"MessageInstallPluginFromApp": "Dette plugin skal være installeret inde i den app du ønsker at benytte det fra.",
"MessageInstallPluginFromApp": "Dette plugin skal installeres fra den app, du har til hensigt at bruge det i.",
"MessageInvalidForgotPasswordPin": "En ugyldig eller udløbet pinkode blev indtastet. Prøv igen.",
"MessageInvalidUser": "Ukendt brugernavn eller adgangskode. Prøv igen.",
"MessageItemSaved": "Element gemt.",
"MessageItemsAdded": "Emne tilføjet.",
"MessageLeaveEmptyToInherit": "Efterlad tom for at arve indstillinger fra en overliggende post eller den globale standardværdi.",
"MessageLeaveEmptyToInherit": "Lad være tom for at arve indstillinger fra et overordnet element eller den globale standardværdi.",
"MessageNoAvailablePlugins": "Ingen tilgængelige plugins.",
"MessageNoMovieSuggestionsAvailable": "Ingen filmforslag er tilgængelige. Begynd at se og vurder dine film, og kom tilbage for at se dine anbefalinger.",
"MessageNoPluginsInstalled": "Du har ingen plugins installeret.",
"MessageNoTrailersFound": "Ingen trailere fundet. Installer Trailer kanalen for at tilføje et bibliotek med trailere fra internettet.",
"MessageNothingHere": "Her er ingenting.",
"MessagePasswordResetForUsers": "Adgangskoder blev fjernet for følgende brugere. For at logge ind, skal der benyttes en blank adgangskode.",
"MessagePasswordResetForUsers": "Følgende brugere har fået nulstillet deres adgangskoder. De kan nu logge på med de pinkoder, der blev brugt til at udføre nulstillingen.",
"MessagePleaseEnsureInternetMetadata": "Sørg venligst for at hentning af metadata fra internettet er aktiveret.",
"MessagePleaseWait": "Vent venligst. Dette kan tage et minut.",
"MessagePluginConfigurationRequiresLocalAccess": "For at konfigurerer dette plugin log da venligst direkte ind på din lokale server.",
"MessagePluginInstallDisclaimer": "Plugins fremstillet af medlemmer fra Jellyfin-fællesskabet er en alle tiders måde at forbedre din oplevelse af Jellyfin med yderligere features og fordele. Før installation, bedes du venligst være opmærksom på de effekter de kan have på din Jellyfin Server; så som lange scantider på biblioteker, yderligere baggrundsbehandling og forringet systemstabilitet.",
"MessageReenableUser": "Se nedenfor om genaktivering",
"MessageSettingsSaved": "Indstillinger er gemt.",
"MessageTheFollowingLocationWillBeRemovedFromLibrary": "Følgende medielokationer bliver fjernet fra dit Jellyfin-bibliotek:",
"MessageTheFollowingLocationWillBeRemovedFromLibrary": "Følgende medieplaceringer fjernes fra dit bibliotek:",
"MessageUnableToConnectToServer": "Vi kan ikke forbinde til den valgte server på nuværende tidspunkt. Sikrer dig venligst at serveren kører og prøv igen.",
"MessageUnsetContentHelp": "Indhold vil blive vist som almindelige mapper. For det bedste resultat benyt metadata manageren til at vælge indholdstypen i undermapper.",
"MessageYouHaveVersionInstalled": "Du har version {0} installeret.",
@ -747,10 +747,10 @@
"MinutesBefore": "minutter før",
"Monday": "Mandag",
"MoreFromValue": "Mere fra {0}",
"MoreUsersCanBeAddedLater": "Flere brugere kan tilføjes senere i betjeningspanelet.",
"MoreUsersCanBeAddedLater": "Flere brugere kan tilføjes senere fra dashboardet.",
"MoveLeft": "Flyt mod venstre",
"MoveRight": "Flyt mod højre",
"MovieLibraryHelp": "Gennemse {0}Jellyfin film navngivningsguiden{1}.",
"MovieLibraryHelp": "Gennemse {0}film navngivningsguiden{1}.",
"Movies": "Film",
"Mute": "Afbryd lyd",
"MySubtitles": "Mine Undertekster",
@ -782,7 +782,7 @@
"OptionAllowMediaPlaybackTranscodingHelp": "At begrænse adgang til omkodning kan forårsage afspilningsfejl i Jellyfin apps på grund af usupporterede medie formater.",
"OptionAllowRemoteControlOthers": "Tillad fjernstyring af andre brugere",
"OptionAllowRemoteSharedDevices": "Tillad fjernstyring af delte enheder",
"OptionAllowRemoteSharedDevicesHelp": "DLNA-enheder er delte indtil en bruger begynder at bruge den.",
"OptionAllowRemoteSharedDevicesHelp": "DLNA-enheder betragtes som delt, indtil en bruger begynder at kontrollere dem.",
"OptionAllowSyncTranscoding": "Tillad medie hentning og synkronisering der kræver omkodning",
"OptionAllowUserToManageServer": "Tillad denne bruger at administrere serveren",
"OptionAllowVideoPlaybackRemuxing": "Tillad videoafspilning som kræver konvertering uden omkodning",
@ -811,13 +811,13 @@
"OptionDisableUserHelp": "Hvis deaktiveret vil serveren ikke tillade forbindelser fra denne bruger. Eksisterende forbindelser vil blive afbrudt øjeblikkeligt.",
"OptionDislikes": "Ikke-Lide",
"OptionDisplayFolderView": "Få vist en mappevisning til at se enkle mediemapper",
"OptionDisplayFolderViewHelp": "Hvis aktiveret, vil Jellyfin apps vise en Mappekategori ved siden af dine mediebiblioteker. Dette er brugbart, hvis du vil have vist enkle mappevisninger.",
"OptionDisplayFolderViewHelp": "Vis mapper sammen med dine andre mediebiblioteker. Dette kan være nyttigt, hvis du gerne vil have en almindelig mappevisning.",
"OptionDownloadArtImage": "Billede",
"OptionDownloadBackImage": "Bagside",
"OptionDownloadBoxImage": "Boks",
"OptionDownloadDiscImage": "Disk",
"OptionDownloadImagesInAdvance": "Download billeder på forhånd",
"OptionDownloadImagesInAdvanceHelp": "Som standard downloades billeder kun når de anmodes af en Jellyfin app. Aktiver denne indstilling for at downloade alle billeder på forhånd, i mens nyt medie importeres. Dette resulterer muligvis i længere scanninger af bibliotek.",
"OptionDownloadImagesInAdvanceHelp": "Som standard downloades de fleste billeder kun, når de anmodes fra en Jellyfin-app. Aktivér denne mulighed for at downloade alle billeder på forhånd, da nye medier importeres. Dette kan forårsage betydeligt længere biblioteksscanninger.",
"OptionDownloadPrimaryImage": "Primær",
"OptionDownloadThumbImage": "Miniature",
"OptionDvd": "DVD",
@ -826,7 +826,7 @@
"OptionEnableAccessToAllChannels": "Tillad adgang til alle kanaler",
"OptionEnableAccessToAllLibraries": "Tillad adgang til alle biblioteker",
"OptionEnableExternalContentInSuggestions": "Aktiver eksternt indhold i anbefalinger",
"OptionEnableExternalContentInSuggestionsHelp": "Tillad at internet-trailers og live-tv-programmer bliver inkluderet i det anbefalede indhold.",
"OptionEnableExternalContentInSuggestionsHelp": "Tillad at internet-trailers og live TV programmer bliver inkluderet i det anbefalede indhold.",
"OptionEnableForAllTuners": "Aktiver for alle tuner-enheder",
"OptionEnableM2tsMode": "Aktiver M2ts tilstand",
"OptionEnableM2tsModeHelp": "Aktiver M2ts tilstand når der omkodes til mpegts.",
@ -844,8 +844,8 @@
"OptionHasThemeVideo": "Temavideo",
"OptionHideUser": "Vis ikke denne bruger på loginsiden",
"OptionHideUserFromLoginHelp": "Nyttigt for private kontoer eller skjulte administratorkontoer. Brugeren skal logge ind ved at skive sit brugernavn og adgangskode.",
"OptionHlsSegmentedSubtitles": "Hls segmented undertekster",
"OptionHomeVideos": "Hjemmevideoer og billeder",
"OptionHlsSegmentedSubtitles": "HLS segmenterede undertekster",
"OptionHomeVideos": "Billeder",
"OptionIgnoreTranscodeByteRangeRequests": "Ignorer forespørgsler vedrørende transcode byte interval",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Hvis aktiveret vil disse forespørgsler blive efterkommet, men byte range headeren ignoreret.",
"OptionImdbRating": "IMDB bedømmelse",
@ -883,7 +883,7 @@
"OptionThursday": "Torsdag",
"OptionTrackName": "Nummerets navn",
"OptionTuesday": "Tirsdag",
"OptionTvdbRating": "Tvdb bedømmelse",
"OptionTvdbRating": "TVDB bedømmelse",
"OptionUnairedEpisode": "Ikke sendte episoder",
"OptionUnplayed": "Ikke afspillet",
"OptionWakeFromSleep": "Vågner fra dvale",
@ -893,9 +893,9 @@
"OptionWeekly": "Ugentlig",
"OriginalAirDateValue": "Originalt sendt: {0}",
"Overview": "Overblik",
"PackageInstallCancelled": "{0} installation afbrudt.",
"PackageInstallCompleted": "{0} installation udført.",
"PackageInstallFailed": "{0} installationen mislykkedes.",
"PackageInstallCancelled": "{0} (version {1}) installation annulleret.",
"PackageInstallCompleted": "{0} (version {1}) installation udført.",
"PackageInstallFailed": "{0} (version {1}) installationen mislykkedes.",
"ParentalRating": "Parental Rating",
"PasswordMatchError": "Adgangskode og bekræft adgangskode skal være ens.",
"PasswordResetComplete": "Adgangskoden er blevet nulstillet.",
@ -913,7 +913,7 @@
"Played": "Afspillet",
"PleaseAddAtLeastOneFolder": "Tilføj venligst som minimum en enkelt mappe til dette bibliotek ved at klikke på Tilføj-knappen.",
"PleaseConfirmPluginInstallation": "Klik venligst OK for at bekræfte at du har læst ovenstående og ønsker at fortsætte med installationen af plugin.",
"PleaseEnterNameOrId": "Indtast venligst et navn eller eksternt Id.",
"PleaseEnterNameOrId": "Indtast venligst et navn eller eksternt ID.",
"PleaseRestartServerName": "Genstart venligst Jellyfin Server - {0}.",
"PleaseSelectTwoItems": "Vælg venligst mindst to elementer.",
"PluginInstalledMessage": "Plugin blev installeret med success. Jellyfin serveren skal genstartes for at aktivere det.",
@ -1025,7 +1025,7 @@
"TabProfiles": "Profiler",
"TabRecordings": "Optagelser",
"TabResponses": "Svar",
"TabResumeSettings": "Indstillinger for Genoptag",
"TabResumeSettings": "Genoptag",
"TabScheduledTasks": "Planlagte opgaver",
"TabSeries": "Serier",
"TabSettings": "Indstillinger",
@ -1044,13 +1044,13 @@
"TitlePlayback": "Afspilning",
"TrackCount": "{0} numre",
"Tuesday": "Tirsdag",
"TvLibraryHelp": "Gennemse {0}Jellyfin TV navngivningsguiden{1}.",
"TvLibraryHelp": "Gennemgå {0} TV-navneguiden {1}.",
"UninstallPluginConfirmation": "Er du sikker på du vil afinstallere {0}?",
"UninstallPluginHeader": "Afinstaller plugin",
"Unmute": "Genoptag lyd",
"Unrated": "Ingen bedømmelse",
"UserAgentHelp": "Angiv en brugerdefineret user-agent http header, hvis nødvendigt.",
"UserProfilesIntro": "Jellyfin har indbygget understøttelse af brugerprofiler. Dette giver hver bruger sine egne indstillinger for visning, afspilningsstatus og forældrekontrol.",
"UserAgentHelp": "Angiv en brugerdefineret bruger-agent HTTP-header.",
"UserProfilesIntro": "Jellyfin inkluderer support til brugerprofiler med granuleret displayindstillinger, afspilningstilstand og forældrekontrol.",
"ValueAlbumCount": "{0} album",
"ValueAudioCodec": "Lyd codec: {0}",
"ValueConditions": "Forhold: {0}",
@ -1072,17 +1072,17 @@
"ViewPlaybackInfo": "Vis afspilnings information",
"Wednesday": "Onsdag",
"WelcomeToProject": "Velkommen til Jellyfin!",
"WizardCompleted": "Det er alt vi behøver for nu. Jellyfin er begyndt at indsamle information omkring dit mediebibliotek. Tjek nogle af vores apps og klik derefter på <b>Færdig</b> for at se <b>Server betjeningspanelet</b>.",
"WizardCompleted": "Det er alt, hvad vi har brug for nu. Jellyfin er begyndt at indsamle information om dit mediebibliotek. Se nogle af vores apps, og klik derefter på <b>Udfør</b> for at se <b>Dashboard</b>.",
"Writer": "Forfatter",
"XmlDocumentAttributeListHelp": "Disse attributter bliver tilføjet til rodelementet i alle XML svar.",
"XmlDocumentAttributeListHelp": "Disse attributter anvendes til rodelementet i hvert XML-svar.",
"XmlTvKidsCategoriesHelp": "Programmer med disse kategorier bliver vist som programmer for børn. Adskil flere med '|'.",
"XmlTvMovieCategoriesHelp": "Programmer med disse kategorier bliver vist som film. Adskil flere med '|'.",
"XmlTvNewsCategoriesHelp": "Programmer med disse kategorier bliver vist som nyhedsprogrammer. Adskil flere med '|'.",
"XmlTvPathHelp": "En sti til en xml tv-fil. Jellyfin læser denne fil og kontrollerer periodisk for opdateringer. Du er ansvarlig for at oprette og opdatere filen.",
"XmlTvPathHelp": "En sti til en XMLTV fil. Jellyfin læser denne fil og kontrollerer periodisk for opdateringer. Du er ansvarlig for at oprette og opdatere filen.",
"XmlTvSportsCategoriesHelp": "Programmer med disse kategorier bliver vist som sportsprogrammer. Adskil flere med '|'.",
"Yesterday": "I går",
"AirDate": "Luftdata",
"Albums": "Album",
"Albums": "Albums",
"Artists": "Kunstnere",
"Books": "Bøger",
"Collections": "Samlinger",
@ -1092,15 +1092,15 @@
"Absolute": "Absolut",
"AccessRestrictedTryAgainLater": "Adgang er begrænset. Prøv igen senere.",
"Aired": "Blev sendt",
"AllComplexFormats": "Alle komplekse formater (ASS, SSA, VOBSUB, PGS, SUB/IDX osv.)",
"AllComplexFormats": "Alle Komplekse Formater (ASS, SSA, VOBSUB, PGS, SUB,IDX osv.)",
"AllLanguages": "Alle sprog",
"AlwaysPlaySubtitles": "Afspil altid undertekster",
"AlwaysPlaySubtitles": "Afspil Altid",
"AlwaysPlaySubtitlesHelp": "Undertekster, der matcher dine sprogindstillinger, vil altid blive indlæst uanset lydsprog.",
"HeaderLiveTV": "Live-TV",
"Shows": "Serier",
"Songs": "Sange",
"AndroidUnlockRestoreHelp": "For at gendanne dit tidligere køb skal du sørge for, at du er logget ind på enheden med den samme Google- eller Amazon-konto, som oprindeligt gjorde købet. Sørg for, at app store er aktiveret og ikke begrænset af forældrekontrol, og sørg for, at du har en aktiv internetforbindelse. Du skal kun gøre dette én gang for at gendanne dit tidligere køb.",
"AnyLanguage": "Ethvert sprog",
"AnyLanguage": "Hvilken som helst sprog",
"Art": "Kunst",
"Ascending": "Stigende",
"AudioBitDepthNotSupported": "Lyd bit dybde ikke understøttet",
@ -1121,7 +1121,7 @@
"Blacklist": "Blackliste",
"Box": "Boks",
"BoxRear": "Boks (bagside)",
"BurnSubtitlesHelp": "Bestemmer om serveren skal brænde underteksterne ind i videoen når den konverterer baseret på undertekstformatet. Det vil øge serverens ydeevne ikke at brænde underteksterne i filen. Vælg Automatisk for at brænde billedbaserede formater (VOBSUB, PGS, SUB/IDX, osv) og nogle ASS/SSA undertekster.",
"BurnSubtitlesHelp": "Bestemmer om serveren skal brænde undertekster, når der afspilles transcoding videoer. Undgå dette vil forbedre ydelsen meget. Vælg Auto for at brænde billedbaserede formater (VOBSUB, PGS, SUB, IDX) og bestemte ASS- eller SSA-undertekster.",
"ButtonFilter": "Filter",
"ButtonGuide": "Vejledning",
"ButtonInfo": "Information",
@ -1174,14 +1174,14 @@
"DisplayInOtherHomeScreenSections": "Visning på hjemmeskærm sektioner som seneste medier og se videre",
"DisplayMissingEpisodesWithinSeasons": "Vis manglende afsnit inde i sæsoner",
"DisplayMissingEpisodesWithinSeasonsHelp": "Dette skal også være aktiveret for TV biblioteker i serverens indstillinger.",
"DisplayModeHelp": "Vælg skærmtypen du kører Jellyfin på.",
"DisplayModeHelp": "Vælg det ønskede tema for grænsefladen.",
"Down": "Ned",
"DownloadItemLimitHelp": "Valgfri. Sæt en begrænsning på antallet af ting der vil blive hentet.",
"Downloaded": "Hentet",
"DownloadingDots": "Henter...",
"Downloads": "Hentninger",
"DownloadsValue": "{0} hentninger",
"DropShadow": "Drop skygge",
"DropShadow": "Drop Skygge",
"DvrFeatureDescription": "Tidsindstil individuelle TV optagelser, serie optagelser, og mere med Jellyfin DVR.",
"EditMetadata": "Redigér metadata",
"EnableBackdrops": "Baggrundsbilleder",
@ -1201,7 +1201,7 @@
"ErrorAddingJellyfinConnectAccount1": "Der skete en fejl ved tilføjelsen af Jellyfin Connect kontoen. Har du lavet en Jellyfin konto? Registrer dig på {0}.",
"ErrorAddingJellyfinConnectAccount2": "Hvis du stadig har et problem, så send venligst en email til {0} fra den email adresse tilknyttet Jellyfin kontoen.",
"ErrorDeletingItem": "Der skete en fejl ved sletningen af mediet fra Jellyfin Server. Tjek venligst at Jellyfin Server har skrive adgang til mediemappen og prøv igen.",
"ExtraLarge": "Ekstra stor",
"ExtraLarge": "Ekstra Stor",
"Extras": "Bonusmateriale",
"Features": "Funktioner",
"Filters": "Filtre",
@ -1270,18 +1270,18 @@
"LabelArtist": "Kunstner",
"LabelAudio": "Lyd",
"LabelBitrateMbps": "Bitrate (Mbps):",
"LabelBlockContentWithTags": "Blokér filer med mærkerne:",
"LabelBlockContentWithTags": "Blokér filer med etiketter:",
"LabelBurnSubtitles": "Brænd undertekster:",
"LabelCache": "Cache:",
"LabelCertificatePassword": "Adgangskode til certifikat:",
"LabelCertificatePasswordHelp": "Hvis dit certifikat kræver en adgangskode, skriv det benligst her.",
"LabelCertificatePasswordHelp": "Hvis dit certifikat kræver en adgangskode, skriv det venligst her.",
"LabelConvertTo": "Konvertér til:",
"LabelDashboardTheme": "Server dashboard tema:",
"LabelDateTimeLocale": "Dato og tid område:",
"LabelDefaultScreen": "Standard skærm:",
"LabelDisplayLanguage": "Visningssprog:",
"LabelDisplayLanguageHelp": "Oversættelse af Jellyfin er et vedvarende projekt.",
"LabelDisplayMode": "Visningsmodus:",
"LabelDisplayMode": "Visningstilstand:",
"LabelDropShadow": "Drop skygge:",
"LabelDynamicExternalId": "{0} ID:",
"LabelEmail": "Email:",
@ -1297,7 +1297,7 @@
"LabelMaxBitrate": "Maks bitrate:",
"LabelMaxChromecastBitrate": "Chromecast streaming kvalitet:",
"LabelMetadata": "Metadata:",
"LabelModelUrl": "Model link",
"LabelModelUrl": "Model URL",
"LabelPreferredSubtitleLanguage": "Foretrukket undertekst sprog:",
"LabelProfileCodecs": "Codecs:",
"LabelProfileContainer": "Beholder:",
@ -1378,7 +1378,7 @@
"Off": "Fra",
"OnlyForcedSubtitles": "Kun tvungne undertekster",
"OnlyForcedSubtitlesHelp": "Kun undertekster markeret som tvungne vil blive indlæst.",
"OnlyImageFormats": "Kun billedformater (VOBSUB, PGS, SUB, etc)",
"OnlyImageFormats": "Kun billedformater (VOBSUB, PGS, SUB)",
"Option2Player": "2+",
"Option3D": "3D",
"Option3Player": "3+",
@ -1420,7 +1420,7 @@
"PlayCount": "Afspilninger",
"PlayNext": "Afspil næste",
"PlayNextEpisodeAutomatically": "Afspil næste afsnit automatisk",
"PlaybackErrorNoCompatibleStream": "Ingen kompatible streams er tilgængelige. Prøv venligst igen senere eller kontakt din system administrator for detaljer.",
"PlaybackErrorNoCompatibleStream": "Denne klient er ikke kompatibel med medierne, og serveren sender ikke et kompatibelt medieformat.",
"PlaybackErrorNotAllowed": "Du har ikke adgang til at afspille dette indhold. Kontakt venligst system administratoren for detaljer.",
"PlaybackErrorPlaceHolder": "Indlæs venligst disken for at afspille denne video.",
"PlaybackSettings": "Afspilningsindstillinger",
@ -1436,7 +1436,7 @@
"RefFramesNotSupported": "Antal af video reference billeder ikke understøttet",
"RefreshMetadata": "Genopfrisk metadata",
"RepeatAll": "Gentag alle",
"RepeatMode": "Gentagelsesmode",
"RepeatMode": "Gentagelses tilstand",
"RepeatOne": "Gentag én",
"RestartPleaseWaitMessage": "Vent venligst mens Jellyfin Server lukker og genstarter. Dette kan tage et minut eller to.",
"RunAtStartup": "Kør ved opstart",
@ -1444,7 +1444,7 @@
"Schedule": "Tidsplan",
"Screenshot": "Skærmbillede",
"SecondaryAudioNotSupported": "Lydspor skift ikke understøttet",
"SeriesDisplayOrderHelp": "Sortér afsnit efter sende dato, dvd rækkefølge eller obsolut nummering.",
"SeriesDisplayOrderHelp": "Sortér episoder efter luftdato, DVD-orden eller absolut nummerering.",
"ShowTitle": "Vis titel",
"ShowYear": "Vis år",
"Small": "Lille",
@ -1532,5 +1532,110 @@
"LabelServerName": "Server navn:",
"LabelUserLoginAttemptsBeforeLockout": "Fejlede loginforsøg før bruger lukkes ude:",
"HeaderRestartingServer": "Genstarter Server",
"ButtonAddImage": "Tilføj billede"
"ButtonAddImage": "Tilføj billede",
"AllowFfmpegThrottlingHelp": "Når en omkodning eller remux kommer langt nok foran den nuværende afspildings position, pauses processen så der bruges færre resurser. Dette er mest brugbart når man ikke springer i filmen. Slå dette fra hvis du har problemer med playback.",
"AllowFfmpegThrottling": "Begræns Omkodning",
"AlbumArtist": "Album Artist",
"Album": "Album",
"EveryHour": "Hver time",
"EveryXMinutes": "Hvert {0} minut",
"OnWakeFromSleep": "Når du vågner fra søvn",
"WeeklyAt": "{0}s ved {1}",
"DailyAt": "Dagligt kl. {0}",
"LastSeen": "Sidst set {0}",
"PersonRole": "som {0}",
"ListPaging": "{0}-{1} af {2}",
"WriteAccessRequired": "Jellyfin Server kræver skriveadgang til denne mappe. Sørg for skriveadgang, og prøv igen.",
"PathNotFound": "Stien blev ikke fundet. Sørg for, at stien er gyldig, og prøv igen.",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
"Track": "Spor",
"TabNetworking": "Netværk",
"SubtitleOffset": "Undertekst Offset",
"SelectAdminUsername": "Vælg et brugernavn til administrator kontoen.",
"Season": "Sæson",
"ReleaseGroup": "Release Group",
"Premiere": "Premiere",
"PreferEmbeddedEpisodeInfosOverFileNames": "Foretrækker integreret episode information frem for filnavne",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Dette bruger episode informationen fra de integrerede metadata, hvis den er tilgængelig.",
"PlaybackData": "Afspilningsdata",
"Person": "Person",
"PasswordResetProviderHelp": "Vælg en leverandør af nulstil adgangskode, der skal bruges, når denne bruger anmoder om en nulstilling af adgangskode",
"OtherArtist": "Anden kunstner",
"OptionThumbCard": "Thumb card",
"OptionThumb": "Thumb",
"OptionRandom": "Tilfældig",
"OptionPosterCard": "Plakatkort",
"OptionPoster": "Plakat",
"OptionLoginAttemptsBeforeLockoutHelp": "En værdi på nul betyder at arve standard for tre forsøg for normale brugere og fem for administratorer. Indstilling af dette til -1 vil deaktivere funktionen.",
"OptionLoginAttemptsBeforeLockout": "Bestemmer, hvor mange forkerte loginforsøg, der kan gøres, før lockout finder sted.",
"OptionList": "Liste",
"OptionForceRemoteSourceTranscoding": "Tving transcoding af eksterne mediekilder (som LiveTV)",
"NoCreatedLibraries": "Det ser ud til, at du ikke har oprettet nogen biblioteker endnu. {0} Vil du oprette en nu? {1}",
"MusicVideo": "Musik Video",
"MusicLibraryHelp": "Gennemgå {0} guide til navngivning af musik {1}.",
"MusicArtist": "Musik Artist",
"MusicAlbum": "Musik Album",
"Movie": "Film",
"MoreMediaInfo": "Medieinfo",
"MessageNoServersAvailable": "Der er ikke fundet nogen servere ved hjælp af den automatiske serveropdagelse.",
"MessageNoCollectionsAvailable": "Samlinger tillader dig at nyde personlige grupperinger af Film, Serier og Albums. Klik på + knappen for at skabe en samling.",
"MessageConfirmAppExit": "Vil du afslutte?",
"MediaInfoStreamTypeSubtitle": "Undertekst",
"MediaInfoStreamTypeEmbeddedImage": "Indlejret billede",
"MediaInfoStreamTypeAudio": "Lyd",
"LaunchWebAppOnStartupHelp": "Åben web klienten i den standard web browser når serveren starter første gang. Dette vil ikke ske når restart server funktionen benyttes.",
"LaunchWebAppOnStartup": "Åben webinterfacet når serveren startes",
"LabelWeb": "Web:",
"LabelVideoResolution": "Videoopløsning:",
"LabelVideoBitrate": "Video bitrate:",
"DashboardArchitecture": "Arkitektur: {0}",
"DashboardOperatingSystem": "Styresystem: {0}",
"DashboardServerName": "Server: {0}",
"DashboardVersionNumber": "Version: {0}",
"LabelTranscodingProgress": "Transcoding fremskridt:",
"LabelTranscodingFramerate": "Transcoding framerate:",
"LabelTranscodes": "Transcodes:",
"LabelTranscodePath": "Transcode sti:",
"LabelStreamType": "Stream type:",
"LabelSonyAggregationFlags": "Sony aggregering flag:",
"LabelSize": "Størrelse:",
"EnableFastImageFadeInHelp": "Aktivér hurtigere fade-in-animation til indlæste billeder",
"EnableFastImageFadeIn": "Hurtigt billede indtoning",
"LabelPleaseRestart": "Ændringer vil træde i kraft efter web klienten er blevet genindlæst manuelt.",
"LabelPlayMethod": "Afspilnings metode:",
"LabelPlayerDimensions": "Afspillerdimensioner:",
"LabelPlayer": "Afspiller:",
"LabelPasswordResetProvider": "Udbyder til nulstilling as kodeord:",
"LabelLibraryPageSizeHelp": "Indstiller mængden af genstande, der skal vises på en bibliotekside. Indstil til 0 for at deaktivere.",
"LabelLibraryPageSize": "Biblioteks størrelse:",
"LabelFolder": "Mappe:",
"LabelBaseUrl": "Base URL:",
"LabelBaseUrlHelp": "Du kan tilføje en speciel undermappe her for, at have adgang til serveren fra en mere unik URL.",
"LabelDroppedFrames": "Tabte frames:",
"LabelDeinterlaceMethod": "Konventerings metode:",
"LabelCorruptedFrames": "Korrupte frames:",
"LabelBitrate": "Bitrate:",
"LabelAuthProvider": "Autentificeringsudbyder:",
"LabelAudioSampleRate": "Lydeksempelfrekvens:",
"LabelAudioCodec": "Lyd codec:",
"LabelAudioChannels": "Lyd kanaler:",
"LabelAudioBitrate": "Lyd bitrate:",
"LabelAudioBitDepth": "Lyd bitdybde:",
"HeaderFavoritePeople": "Foretrukne Personer",
"HeaderFavoriteBooks": "Foretrukne Bøger",
"FetchingData": "Henter yderligere data",
"Episode": "Afsnit",
"DeinterlaceMethodHelp": "Vælg hvilken konverteringsmulighed der skal bruges til transkodning af indhold.",
"CopyStreamURLError": "Der skete en fejl med at kopiere URL'en.",
"CopyStreamURLSuccess": "URL er kopiret succesfuldt.",
"CopyStreamURL": "Kopir Stream URL",
"ClientSettings": "Klient Indstillinger",
"ButtonSplit": "Opdel",
"BoxSet": "Box Set",
"AuthProviderHelp": "Vælg en godkendelse udbyder, der skal bruges til at godkende denne brugers adgangskode.",
"AskAdminToCreateLibrary": "Spørg en administrator om at oprette et bibliotek.",
"Artist": "Artist",
"EveryXHours": "Hver {0} time",
"OnApplicationStartup": "Ved programstart"
}

View file

@ -1097,7 +1097,7 @@
"RefreshMetadata": "Aktualisiere Metadaten",
"RefreshQueued": "Aktualisierung eingereiht.",
"ReleaseDate": "Veröffentlichungsdatum",
"RememberMe": "Erinnere mich",
"RememberMe": "Angemeldet bleiben",
"RemoveFromCollection": "Aus Sammlung entfernen",
"RemoveFromPlaylist": "Von Wiedergabeliste entfernen",
"Repeat": "Wiederholen",
@ -1490,7 +1490,7 @@
"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}",
"AllowFfmpegThrottling": "Transkodierung drosseln",
"PlaybackErrorNoCompatibleStream": "Es gab ein Problem bei der Erkennung des Wiedergabeprofils des Clients und der Server sendet kein kompatibles Format.",
"PlaybackErrorNoCompatibleStream": "Dieser Client ist nicht mit den Medien kompatibel und der Server sendet kein kompatibles Medienformat.",
"AllowFfmpegThrottlingHelp": "Wenn eine Transkodierung oder ein Remux weit genug über die aktuelle Abspielposition fortgeschritten ist, pausiere sie sodass weniger Ressourcen verbraucht werden. Dies ist am nützlichsten, wenn wenig geskippt wird. Bei Wiedergabeproblemen sollte diese Option deaktiviert werden.",
"ClientSettings": "Client Einstellungen",
"OnApplicationStartup": "Beim Starten der Applikation",
@ -1515,5 +1515,11 @@
"Artist": "Künstler",
"AlbumArtist": "Album Künstler",
"Album": "Album",
"BoxSet": "Box Set"
"BoxSet": "Box Set",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
"LabelLibraryPageSizeHelp": "Setzt die Anzahl der auf einer Seite angezeigten Objekte. Setze auf 0, um alle Elemente auf einer Seite anzuzeigen.",
"LabelLibraryPageSize": "Bibliothek Seiten Größe:",
"DeinterlaceMethodHelp": "Wähle die Deinterlacing-Methode zum Transkodieren von Inhalten im Zeilensprungverfahren (Interlace).",
"LabelDeinterlaceMethod": "Deinterlacing-Methode:"
}

View file

@ -75,9 +75,9 @@
"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.",
"AlwaysPlaySubtitles": "Always play subtitles",
"AlwaysPlaySubtitles": "Always Play",
"AlwaysPlaySubtitlesHelp": "Subtitles matching the language preference will be loaded regardless of the audio language.",
"AnyLanguage": "Any language",
"AnyLanguage": "Any Language",
"Anytime": "Anytime",
"AroundTime": "Around {0}",
"Art": "Art",
@ -100,7 +100,7 @@
"Box": "Box",
"BoxRear": "Box (rear)",
"Browse": "Browse",
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when converting video depending on the subtitle format. Avoiding burning in subtitles will improve server performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB/IDX, etc) and certain ASS/SSA subtitles.",
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX) and certain ASS or SSA subtitles.",
"ButtonAdd": "Add",
"ButtonAddMediaLibrary": "Add Media Library",
"ButtonAddScheduledTaskTrigger": "Add Trigger",
@ -233,7 +233,7 @@
"DisplayInOtherHomeScreenSections": "Display in home screen sections such as latest media and continue watching",
"DisplayMissingEpisodesWithinSeasons": "Display missing episodes within seasons",
"DisplayMissingEpisodesWithinSeasonsHelp": "This must also be enabled for TV libraries in the server configuration.",
"DisplayModeHelp": "Select the type of screen you're running Jellyfin on.",
"DisplayModeHelp": "Select the layout style you want for the interface.",
"DoNotRecord": "Do not record",
"Down": "Down",
"Download": "Download",
@ -617,9 +617,9 @@
"PasswordResetComplete": "The password has been reset.",
"PasswordMatchError": "Password and password confirmation must match.",
"ParentalRating": "Parental rating",
"PackageInstallFailed": "{0} installation failed.",
"PackageInstallCompleted": "{0} installation completed.",
"PackageInstallCancelled": "{0} installation cancelled.",
"PackageInstallFailed": "{0} (version {1}) installation failed.",
"PackageInstallCompleted": "{0} (version {1}) installation completed.",
"PackageInstallCancelled": "{0} (version {1}) installation cancelled.",
"OriginalAirDateValue": "Original air date: {0}",
"OptionWeekly": "Weekly",
"OptionWeekends": "Weekends",
@ -690,12 +690,12 @@
"OptionAlbumArtist": "Album Artist",
"OptionAlbum": "Album",
"Option3D": "3D",
"OnlyImageFormats": "Only image formats (VOBSUB, PGS, SUB, etc)",
"OnlyImageFormats": "Only Image Formats (VOBSUB, PGS, SUB)",
"OnlyForcedSubtitlesHelp": "Only subtitles marked as forced will be loaded.",
"Normal": "Normal",
"None": "None",
"NoSubtitlesHelp": "Subtitles will not be loaded by default. They can still be turned on manually during playback.",
"NoSubtitles": "No subtitles",
"NoSubtitles": "None",
"NoPluginConfigurationMessage": "This plugin has no settings to configure.",
"NoNextUpItemsMessage": "None found. Start watching your shows!",
"No": "No",
@ -871,7 +871,7 @@
"MessageConfirmProfileDeletion": "Are you sure you wish to delete this profile?",
"LaunchWebAppOnStartup": "Launch the web interface when starting the server",
"LabelYourFirstName": "Your first name:",
"OnlyForcedSubtitles": "Only forced subtitles",
"OnlyForcedSubtitles": "Only Forced",
"Off": "Off",
"NumLocationsValue": "{0} folders",
"Name": "Name",
@ -1030,7 +1030,7 @@
"LabelEnableDlnaDebugLoggingHelp": "Create large log files and should only be used as needed for troubleshooting purposes.",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Jellyfin.",
"LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models. Changes will not apply until after a server restart.",
"InstallingPackage": "Installing {0}",
"InstallingPackage": "Installing {0} (version {1})",
"ImportMissingEpisodesHelp": "If enabled, information about missing episodes will be imported into your Jellyfin database and displayed within seasons and series. This may cause significantly longer library scans.",
"HeaderSubtitleAppearance": "Subtitle Appearance",
"LabelProtocol": "Protocol:",
@ -1472,7 +1472,39 @@
"CopyStreamURLError": "There was an error copying the URL.",
"NoCreatedLibraries": "Seems like you haven't created any libraries yet. {0}Would you like to create one now?{1}",
"AskAdminToCreateLibrary": "Ask an administrator to create a library.",
"PlaybackErrorNoCompatibleStream": "There was an issue with the client profiling and the server isn't sending a compatible media format.",
"PlaybackErrorNoCompatibleStream": "This client isn't compatible with the media and the server isn't sending a compatible media format.",
"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.",
"AllowFfmpegThrottling": "Throttle Transcodes"
"AllowFfmpegThrottling": "Throttle Transcodes",
"OnApplicationStartup": "On application startup",
"EveryXHours": "Every {0} hours",
"EveryHour": "Every hour",
"EveryXMinutes": "Every {0} minutes",
"OnWakeFromSleep": "On wake from sleep",
"WeeklyAt": "{0}s at {1}",
"DailyAt": "Daily at {0}",
"LastSeen": "Last seen {0}",
"PersonRole": "as {0}",
"ListPaging": "{0}-{1} of {2}",
"WriteAccessRequired": "Jellyfin Server requires write access to this folder. Please ensure write access and try again.",
"PathNotFound": "The path could not be found. Please ensure the path is valid and try again.",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
"Track": "Track",
"Season": "Season",
"ReleaseGroup": "Release Group",
"PreferEmbeddedEpisodeInfosOverFileNames": "Prefer embedded episode information over filenames",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "This uses the episode information from the embedded metadata if available.",
"Person": "Person",
"OtherArtist": "Other Artist",
"Movie": "Movie",
"LabelLibraryPageSizeHelp": "Sets the amount of items to show on a library page. Set to 0 in order to disable paging.",
"LabelLibraryPageSize": "Library page size:",
"LabelDeinterlaceMethod": "Deinterlacing method:",
"Episode": "Episode",
"DeinterlaceMethodHelp": "Select the deinterlacing method to use when transcoding interlaced content.",
"ClientSettings": "Client Settings",
"BoxSet": "Box Set",
"Artist": "Artist",
"AlbumArtist": "Album Artist",
"Album": "Album"
}

View file

@ -694,6 +694,8 @@
"LabelKodiMetadataUserHelp": "Save watch data to NFO files for other applications to utilize.",
"LabelLanNetworks": "LAN networks:",
"LabelLanguage": "Language:",
"LabelLibraryPageSize": "Library page size:",
"LabelLibraryPageSizeHelp": "Sets the amount of items to show on a library page. Set to 0 in order to disable paging.",
"LabelLineup": "Lineup:",
"LabelLocalHttpServerPortNumber": "Local HTTP port number:",
"LabelLocalHttpServerPortNumberHelp": "The TCP port number that Jellyfin's HTTP server should bind to.",
@ -988,6 +990,7 @@
"MessageInstallPluginFromApp": "This plugin must be installed from within the app you intend to use it in.",
"MessageInvalidForgotPasswordPin": "An invalid or expired pin code was entered. Please try again.",
"MessageInvalidUser": "Invalid username or password. Please try again.",
"MessageUnauthorizedUser": "You are not authorized to access the server at this time. Please contact your server administrator for more information.",
"MessageItemSaved": "Item saved.",
"MessageItemsAdded": "Items added.",
"MessageLeaveEmptyToInherit": "Leave empty to inherit settings from a parent item or the global default value.",
@ -1248,8 +1251,8 @@
"PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
"PreferEmbeddedTitlesOverFileNames": "Prefer embedded titles over filenames",
"PreferEmbeddedTitlesOverFileNamesHelp": "This determines the default display title when no internet metadata or local metadata is available.",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "This uses the episode informations from the embedded metadata if available.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Prefer embedded episode informations over filenames",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "This uses the episode information from the embedded metadata if available.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Prefer embedded episode information over filenames",
"PreferredNotRequired": "Preferred, but not required",
"Premiere": "Premiere",
"Premieres": "Premieres",
@ -1481,8 +1484,8 @@
"XmlTvNewsCategoriesHelp": "Programs with these categories will be displayed as news programs. Separate multiple with '|'.",
"XmlTvPathHelp": "A path to a XMLTV file. Jellyfin will read this file and periodically check it for updates. You are responsible for creating and updating the file.",
"XmlTvSportsCategoriesHelp": "Programs with these categories will be displayed as sports programs. Separate multiple with '|'.",
"Yadif": "Yadif",
"YadifBob": "Yadif Bob",
"Yadif": "YADIF",
"YadifBob": "YADIF Bob",
"Yes": "Yes",
"Yesterday": "Yesterday",
"PathNotFound": "The path could not be found. Please ensure the path is valid and try again.",
@ -1496,5 +1499,6 @@
"EveryXMinutes": "Every {0} minutes",
"EveryHour": "Every hour",
"EveryXHours": "Every {0} hours",
"OnApplicationStartup": "On application startup"
"OnApplicationStartup": "On application startup",
"UnsupportedPlayback": "Jellyfin cannot decrypt content protected by DRM but all content will be attempted regardless, including protected titles. Some files may appear completely black due to encryption or other unsupported features, such as interactive titles."
}

View file

@ -38,7 +38,7 @@
"Folders": "Carpetas",
"Genres": "Géneros",
"HeaderAlbumArtists": "Artistas de álbum",
"HeaderContinueWatching": "Continuar viendo",
"HeaderContinueWatching": "Seguir viendo",
"HeaderNextUp": "A Continuación",
"Movies": "Películas",
"Photos": "Fotos",
@ -361,23 +361,23 @@
"EnableThemeSongs": "Canciones temáticas",
"EnableThemeSongsHelp": "Reproducir canciones temáticas en el fondo mientras se navega por la biblioteca.",
"EnableThemeVideos": "Videos temáticos",
"EnableThemeVideosHelp": "Al habilitarse, los videos de tema se reproducirán de fondo mientras navegues por la biblioteca.",
"EnableThemeVideosHelp": "Al habilitarse, los vídeos de tema se reproducirán de fondo mientras navegues por la biblioteca.",
"Ended": "Finalizado",
"EndsAtValue": "Termina en {0}",
"Episodes": "Episodios",
"ErrorAddingListingsToSchedulesDirect": "Ocurrió un error al añadir el alineamiento a tu cuenta de Schedules Direct. Schedules Direct solo permite una cantidad limitada de alineamientos por cuenta. Quizás necesites ingresar al sitio de Schedules Direct y eliminar otros alineamientos de tu cuenta antes de continuar.",
"ErrorAddingMediaPathToVirtualFolder": "Ocurrió un error al agregar la ruta de medios. Por favor, asegurate que la ruta es válida y que el proceso que sirve Jellyfin tiene acceso a esa ubicación.",
"ErrorAddingTunerDevice": "Ocurrió un error al añadir el dispositivo sintonizador. Por favor asegurate que está disponible e intenta de nuevo.",
"ErrorAddingXmlTvFile": "Ocurrió un error al acceder al archivo de XmlTV. Por favor asegurate de que el archivo existe e intenta de nuevo.",
"ErrorAddingXmlTvFile": "Ocurrió un error al acceder al archivo de XmlTV. Por favor asegúrate de que el archivo existe e intenta de nuevo.",
"ErrorDeletingItem": "Ocurrió un error al eliminar el ítem del servidor Jellyfin. Por favor verifica que el servidor Jellyfin tiene permiso de escritura a la carpeta de medios e intenta de nuevo.",
"ErrorGettingTvLineups": "Ocurrió un error al descargar los alineamientos de TV. Por favor asegúrate que tu información es correcta e intenta de nuevo.",
"ErrorGettingTvLineups": "Ocurrió un error al descargar la guía de programación de TV. Por favor asegúrate que tu información es correcta e intenta de nuevo.",
"ErrorMessageStartHourGreaterThanEnd": "La hora de fin tiene que ser mayor que la de inicio.",
"ErrorPleaseSelectLineup": "Por favor selecciona un alineamiento e intenta de nuevo. Si no existen alineamientos disponibles, asegúrate de que tu nombre de usuario, contraseña y código postal son correctos.",
"ErrorSavingTvProvider": "Ocurrió un error al guardar el proveedor de TV. Por favor asegúrate de que está disponible e intenta de nuevo.",
"EveryNDays": "Cada {0} días",
"ExitFullscreen": "Salir de pantalla completa",
"ExtraLarge": "Extra grande",
"ExtractChapterImagesHelp": "Extraer imágenes de los capítulos permitirá a las aplicaciones de Jellyfin mostrar menúes gráficos de selección de escena. El proceso puede ser lento, ocupar mucho tiempo de cpu y puede ocupar varios gigabytes de almacenamiento. El proceso corre cuando los videos son descubiertos, y también como un proceso periódico por la noche. El horario del proceso periódico se puede configurar en el área de procesos periódicos. No se recomienda correr este proceso durante horas de alto uso.",
"ExtractChapterImagesHelp": "Extraer imágenes de los capítulos permitirá a las aplicaciones de Jellyfin mostrar menús gráficos de selección de escena. El proceso puede ser lento, ocupar mucho tiempo de cpu y puede ocupar varios gigabytes de almacenamiento. El proceso corre cuando los vídeos son descubiertos, y también como un proceso periódico por la noche. El horario del proceso periódico se puede configurar en el área de procesos periódicos. No se recomienda correr este proceso durante horas de alto uso.",
"Extras": "Extras",
"FFmpegSavePathNotFound": "No pudimos localizar FFmpeg usando la ruta que has ingresado. FFprobe también es necesario y debe existir en la misma carpeta. Éstos componentes normalmente están incluidos en la misma descarga. Por favor, revisa la ruta e intenta de nuevo.",
"FastForward": "Avanzar Rápido",
@ -391,8 +391,8 @@
"FolderTypeBooks": "Libros",
"FolderTypeMovies": "Películas",
"FolderTypeMusic": "Música",
"FolderTypeMusicVideos": "Videos Musicales",
"FolderTypeUnset": "Sin especificar (Contenido Mixto)",
"FolderTypeMusicVideos": "Vídeos Musicales",
"FolderTypeUnset": "Contenido Mixto",
"FormatValue": "Formato: {0}",
"Friday": "Viernes",
"Fullscreen": "Pantalla Completa",
@ -421,7 +421,7 @@
"HeaderCancelRecording": "Cancelar Grabación",
"HeaderBranding": "Marca",
"HeaderBooks": "Libros",
"HeaderBlockItemsWithNoRating": "Bloquear elementos con rating de información no reconocible:",
"HeaderBlockItemsWithNoRating": "Bloquear elementos con rating de información vacía o no reconocible:",
"HeaderAutomaticUpdates": "Actualizaciones Automáticas",
"HeaderAudioSettings": "Configuración del Audio",
"HeaderAudioBooks": "Audiolibros",
@ -429,7 +429,7 @@
"HeaderApp": "Aplicación",
"HeaderApiKeysHelp": "Las aplicaciones externas requieren una llave API para poder comunicarse con el servidor Jellyfin. Las llaves se emiten iniciando sesión con una cuenta Jellyfin u otorgando manualmente una clave a la aplicación.",
"HeaderApiKeys": "Llaves API",
"HeaderApiKey": "Llave API",
"HeaderApiKey": "Contraseña API",
"HeaderAllowMediaDeletionFrom": "Permitir el borrado de medios desde",
"HeaderAlert": "Alerta",
"HeaderAlbums": "Albumes",
@ -444,10 +444,10 @@
"HeaderActiveDevices": "Dispositivos activos",
"HeaderAccessScheduleHelp": "Crear un calendario de acceso, para limitar el acceso en determinadas horas.",
"HeaderAccessSchedule": "Acceder al Calendario",
"HardwareAccelerationWarning": "Habilitar la aceleración de hardware puede causar inestabilidad en algunos entornos. Asegúrese de que su sistema operativo y los controladores de video estén completamente actualizados. Si tiene dificultades para reproducir el video después de habilitarlo, deberá volver a cambiar la configuración a \"Nada\".",
"HardwareAccelerationWarning": "Habilitar la aceleración de hardware puede causar inestabilidad en algunos entornos. Asegúrese de que su sistema operativo y los controladores de vídeo estén completamente actualizados. Si tiene dificultades para reproducir el vídeo después de habilitarlo, deberá volver a cambiar la configuración a \"Nada\".",
"HandledByProxy": "Manejado por un proxy reverso",
"HDPrograms": "Programas en HD",
"EncoderPresetHelp": "Elige un valor más rápido para mejorar la performance, o elige un valor más lento para mejorar la calidad.",
"EncoderPresetHelp": "Elige un valor más rápido para mejorar el desempeño, o elige un valor más lento para mejorar la calidad.",
"FetchingData": "Obteniendo información adicional",
"Episode": "Episodio",
"Yesterday": "Ayer",
@ -455,5 +455,49 @@
"BoxSet": "Colección",
"Artist": "Artista",
"AlbumArtist": "Artista del Album",
"Album": "Album"
"Album": "Album",
"HeaderDateIssued": "Fecha de Emisión",
"HeaderCustomDlnaProfiles": "Perfiles personalizados",
"HeaderContinueListening": "Seguir escuchando",
"HeaderContainerProfileHelp": "Los perfiles de contenedor indican las limitaciones de un dispositivo cuando se reproducen formatos específicos. Si se aplica una limitación, los medios se transcodificarán, incluso si el formato está configurado para reproducción directa.",
"HeaderContainerProfile": "Perfil de contenedor",
"HeaderConnectionFailure": "Conexión fallida",
"HeaderConnectToServer": "Conectar al servidor",
"HeaderConfirmRevokeApiKey": "Revocar llave de API",
"HeaderConfirmProfileDeletion": "Confirmar borrado de perfil",
"HeaderConfirmPluginInstallation": "Confirmar instalación del complemento",
"HeaderConfigureRemoteAccess": "Configurar acceso remoto",
"HeaderCodecProfileHelp": "Los perfiles de códec indican las limitaciones de un dispositivo cuando se reproducen códecs específicos. Si se aplica una limitación, los medios se transcodificarán, incluso si el códec está configurado para reproducción directa.",
"HeaderCodecProfile": "Perfil del códec",
"HeaderChapterImages": "Imágenes del capitulo",
"HeaderChannels": "Canales",
"HeaderChannelAccess": "Acceso al canal",
"HeaderCastCrew": "Reparto",
"HeaderCastAndCrew": "Reparto",
"HeaderCancelSeries": "Cancelar serie",
"H264CrfHelp": "El Factor de velocidad constante (CRF) es la configuración de calidad predeterminada para el codificador x264. Puede establecer los valores entre 0 y 51, donde valores más bajos resultarían en una mejor calidad (a expensas de tamaños de archivo más altos). Los valores correctos están entre 18 y 28. El valor predeterminado para x264 es 23, por lo que puede usar esto como punto de partida.",
"DeinterlaceMethodHelp": "Seleccione el método de desentrelazado que se usará al transcodificar contenido entrelazado.",
"HeaderFavoriteVideos": "Videos favoritos",
"HeaderFavoritePeople": "Gente favorita",
"HeaderFavoriteMovies": "Películas Favoritas",
"HeaderFavoriteBooks": "Libros favoritos",
"HeaderExternalIds": "IDs externos:",
"HeaderError": "Error",
"HeaderEpisodes": "Episodios",
"HeaderEnabledFields": "Campos habilitados",
"HeaderEditImages": "Editar imágenes",
"HeaderEasyPinCode": "Pin sencillo",
"HeaderDownloadSync": "Descargar y sincronizar",
"HeaderDisplay": "Pantalla",
"HeaderDirectPlayProfile": "Perfil Direct Play",
"HeaderDevices": "Dispositivos",
"HeaderDeviceAccess": "Acceso al dispositivo",
"HeaderDeveloperInfo": "Información para desarrolladores",
"HeaderDetectMyDevices": "Detectar mis dispositivos",
"HeaderDeleteTaskTrigger": "Elminar disparador de acciones",
"HeaderDeleteProvider": "Eliminar proveedor",
"HeaderDeleteItems": "Eliminar ítems",
"HeaderDeleteItem": "Eliminar ítem",
"HeaderDeleteDevice": "Eliminar dispositivo",
"HeaderDefaultRecordingSettings": "Ajustes de grabación por defecto"
}

View file

@ -310,7 +310,7 @@
"HeaderLatestMovies": "Últimas películas",
"HeaderLatestMusic": "Última música",
"HeaderLatestRecordings": "Últimas grabaciones",
"HeaderLibraries": "Blibliotecas",
"HeaderLibraries": "Bibliotecas",
"HeaderLibraryAccess": "Acceso a la biblioteca",
"HeaderLibraryFolders": "Carpetas de la biblioteca",
"HeaderLibraryOrder": "Orden de la biblioteca",
@ -1248,7 +1248,7 @@
"Descending": "Descendiente",
"DirectStreamHelp1": "El tipo de archivo (H.264, AC3, etc.) y la resolución son compatibles con el dispositivo, pero no el contenedor (mkv, avi, wmv, etc.). El vídeo será re-empaquetado al vuelo antes de transmitirlo al dispositivo.",
"DirectStreamHelp2": "La transmisión directa del archivo usa muy poco procesamiento sin ninguna pérdida de calidad en el vídeo.",
"Director": "Dirección",
"Director": "Dirección de",
"Directors": "Directores",
"Display": "Mostrar",
"DisplayInMyMedia": "Mostrar en la pantalla de inicio",
@ -1500,5 +1500,13 @@
"BoxSet": "Box Set",
"Artist": "Artista",
"AlbumArtist": "Artista del álbum",
"Album": "Álbum"
"Album": "Álbum",
"LabelDeinterlaceMethod": "Metodo de desentrelazar:",
"DeinterlaceMethodHelp": "Seleccione el método de desentrelazar para el transcodificar de contenido entrelazado.",
"LabelLibraryPageSize": "Tamaño de la página de la biblioteca:",
"LabelLibraryPageSizeHelp": "Establece la cantidad de artículos a mostrar en una página de la biblioteca. Ponlo en 0 para desactivar la paginación.",
"UnsupportedPlayback": "No es posible desencriptar contenido protegido mediante DRM; sin embargo se intentará su reproducción. Algunos archivos pueden aparecer completamente negros debido a encriptación u otras características no soportadas, como títulos interactivos.",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
"MessageUnauthorizedUser": "No tiene autorización para acceder al servidor en este momento. Póngase en contacto con el administrador del servidor para obtener más información."
}

View file

@ -1,8 +1,8 @@
{
"All": "همه",
"AllowMediaConversion": "اجازه تبدیل رسانه ها",
"AllowMediaConversionHelp": "دادن یا ندادن دسترسی به ویژگی تبدیل رسانه ها",
"AllowRemoteAccess": "اجازه دادن اتصال از راه دور به سرور Jellyfin",
"AllowMediaConversion": "اجازه تبدیل رسانهها",
"AllowMediaConversionHelp": "دادن یا ندادن دسترسی به ویژگی تبدیل رسانهها.",
"AllowRemoteAccess": "اجازه بدهید اتصال‌های از راه دور به این سرور Jellyfin متصل شوند.",
"AllowRemoteAccessHelp": "اگرانتخاب نشود، تمامی اتصال های از راه دور بلوکه می شوند.",
"Browse": "مرور کردن",
"ButtonAddUser": "افزودن کاربر",
@ -19,11 +19,11 @@
"ButtonSort": "مرتب سازی",
"DeleteMedia": "حذف رسانه",
"Disabled": "غیرفعال شده",
"FolderTypeBooks": "کتاب ها",
"FolderTypeMovies": "سینمایی ها",
"FolderTypeMusic": "موسیقی",
"FolderTypeMusicVideos": "موزیک ویدئوها",
"FolderTypeTvShows": "سریال تلویزیونی",
"FolderTypeBooks": "کتابها",
"FolderTypeMovies": "فیلم‌ها",
"FolderTypeMusic": "موسیقیها",
"FolderTypeMusicVideos": "موزیک ویدیوها",
"FolderTypeTvShows": "سریال‌های تلویزیونی",
"HeaderAddUser": "اضافه کردن کاربر",
"HeaderContinueWatching": "ادامه تماشا",
"HeaderCustomDlnaProfiles": "پروفایل های سفارشی",
@ -45,15 +45,15 @@
"HeaderTypeImageFetchers": "{0} هماهنگ کننده تصویر",
"HeaderUsers": "کاربران",
"LabelAudioLanguagePreference": "اولویت زبان صدا:",
"LabelContentType": "نوع محتوی",
"LabelCountry": "کشور",
"LabelContentType": "نوع محتوا:",
"LabelCountry": "کشور:",
"LabelCurrentPassword": "رمز فعلی:",
"LabelCustomCertificatePath": "مسیر اختصصای گواهینامه SSL:",
"LabelCustomCertificatePath": "مسیر اختصاصی گواهینامه SSL:",
"LabelCustomCertificatePathHelp": "پچ به فایل PKCS #12 حاوی یک گواهینامه و کلید خصوصی است تا پشتیبانی از TLS را در یک دامنه شخصی فعال کند.",
"LabelDisplayMissingEpisodesWithinSeasons": "نمایش قسمت های ناموجود در بین فصل ها",
"LabelFinish": "پایان",
"LabelLanguage": "زبان",
"LabelMaxParentalRating": "حداکثر درجه سنی مجاز والدین",
"LabelLanguage": "زبان:",
"LabelMaxParentalRating": "حداکثر امتیاز سنی مجاز والدین:",
"LabelNewPassword": "رمز جدید:",
"LabelNewPasswordConfirm": "تایید رمز جدید:",
"LabelNext": "بعدی",
@ -64,7 +64,7 @@
"LabelSecureConnectionsMode": "حالت اتصال ایمن:",
"LabelSelectUsers": "انتخاب کاربران:",
"LabelTimeLimitHours": "محدودیت زمان (ساعت):",
"LabelTypeMetadataDownloaders": "{0} دانلود کننده ی متاداده:",
"LabelTypeMetadataDownloaders": "{0} دانلود کننده فراداده:",
"LabelYourFirstName": "اسم کوچک شما:",
"LabelYoureDone": "به پایان رسید!",
"LibraryAccessHelp": "انتخاب پوشه های رسانه برای اشتراک گذاری با این کاربر. مدیر سیستم میتواند با استفاده از مدیریت متاداده همه ی پوشه ها را ویرایش کند.",
@ -95,9 +95,9 @@
"TabArtists": "هنرمندان",
"TabEpisodes": "قسمت ها",
"TabGenres": "ژانرها",
"TabLatest": "آخرین",
"TabMetadata": "اطلاعات محتوی",
"TabMusicVideos": "موزیک ویدیو ها",
"TabLatest": "جدیدترین‌ها",
"TabMetadata": "فراداده",
"TabMusicVideos": "موزیک ویدیوها",
"TabNetworks": "شبکه ها",
"TabNotifications": "اعلان ها",
"TabPassword": "رمز عبور",
@ -109,10 +109,10 @@
"TabSuggestions": "پیشنهادات",
"TabUpcoming": "بزودی",
"TellUsAboutYourself": "در مورد خودتان به ما بگویید",
"ThisWizardWillGuideYou": "این ویزارد برای انجام تنظیمات به شما کمک می کند. برای شروع، لطفا زبان مورد نظر خود را انتخاب فرمایید",
"ThisWizardWillGuideYou": "این عمل برای انجام تنظیمات به شما کمک می‌کند. برای شروع، لطفا زبان مورد نظر خود را انتخاب کنید.",
"UserProfilesIntro": "Jellyfin دارای پشتیبانی داخلی از پروفایل کاربران می باشد. با فعال سازی هر کاربر، او می تواند تنظیمات ، وضعیت پخش و کنترل والدین خاص خودش را داشته باشد.",
"WelcomeToProject": "به Jellyfin خوش آمدید!",
"WizardCompleted": "همه چیزی که فعلا می خواهیم همین است.جمع آوری اطلاعات کتابخانه های شما هم اکنون توسط Jellyfin آغاز شده است. اپلیکیشن های ما را امتحان کنید و سپس بر روی <b> پایان </b> کلیک کنید تا <b> پیشخوان سرور </b> را مشاهده نمایید.",
"WizardCompleted": "همه چیزی که فعلا می‌خواهیم همین است. جمع آوری اطلاعات کتابخانه‌های شما هم اکنون توسط Jellyfin آغاز شده است. اپلیکیشن‌های ما را امتحان کنید و سپس بر روی <b> پایان</b> کلیک کنید تا <b>پیشخوان سرور</b> را مشاهده نمایید.",
"Albums": "آلبوم‌ها",
"Artists": "هنرمندان",
"Books": "کتاب‌ها",
@ -127,7 +127,7 @@
"HeaderFavoriteAlbums": "آلبوم‌های مورد علاقه",
"HeaderFavoriteArtists": "هنرمندان مورد علاقه",
"HeaderFavoriteSongs": "آهنگ‌های مورد علاقه",
"HeaderLiveTV": "پخش زنده تلویزیون",
"HeaderLiveTV": "پخش زنده",
"Movies": "فیلم‌ها",
"Photos": "عکس‌ها",
"Playlists": "لیست‌های پخش",
@ -135,11 +135,11 @@
"Songs": "موسیقی‌ها",
"Sync": "همگام‌سازی",
"ValueSpecialEpisodeName": "ویژه - {0}",
"AllEpisodes": "تمام قسمت ها",
"AllLanguages": "تمام زبان ها",
"AllLibraries": "تمام کتابخانه ها",
"AllEpisodes": "تمام قسمتها",
"AllLanguages": "تمام زبانها",
"AllLibraries": "تمام کتابخانهها",
"AllowHWTranscodingHelp": "اگر فعال شود, اجازه می‌دهید تبدیل کیفیت در لحظه انجام شود. این ممکن است به کاهش کدگذاری لازم برای Jellyfin منجر بشود.",
"AllowOnTheFlySubtitleExtraction": "اجازه میدهد در لحظه زیرنویس بازشود",
"AllowOnTheFlySubtitleExtraction": "اجازه میدهد در لحظه زیرنویس بازشود",
"Add": "افزودن",
"Actor": "بازیگر",
"AccessRestrictedTryAgainLater": "دسترسی در حال حاضر محدود شده است. لطفا دوباره تلاش کنید.",
@ -149,7 +149,7 @@
"ButtonSelectView": "انتخاب نما",
"ButtonSelectServer": "انتخاب سرور",
"ButtonSearch": "جستجو",
"ButtonScanAllLibraries": "پویش تمام کتابخانه‌ها",
"ButtonScanAllLibraries": "اسکن تمام کتابخانه‌ها",
"ButtonRevoke": "ابطال",
"ButtonResume": "ادامه",
"ButtonRestart": "راه اندازی مجدد",
@ -215,9 +215,9 @@
"AroundTime": "حدود {0}",
"Anytime": "هر زمانی",
"AnyLanguage": "هر زبانی",
"AlwaysPlaySubtitles": "همیشه زیرنویس را نمایش بده",
"AlwaysPlaySubtitles": "همیشه پخش کن",
"AllowFfmpegThrottling": "گلوگاه تبدیل کیفیت",
"AllChannels": "همه‌ی کانال‌ها",
"AllChannels": "همه کانال‌ها",
"Alerts": "هشدارها",
"Aired": "پخش شده",
"AirDate": "تاریخ پخش",
@ -239,11 +239,11 @@
"EnableHardwareEncoding": "فعال سازی رمزگذاری سخت افزاری",
"EnableExternalVideoPlayersHelp": "یک منوی پخش کننده ویدیوی خارجی، زمانی که شروع به پخش ویدیو می‌شود نمایش داده خواهد شد.",
"EnableExternalVideoPlayers": "پخش کننده ویدیوی خارجی",
"EnableDisplayMirroring": "نمایش حالت آینه",
"EnableDisplayMirroring": "نمایش آینه",
"EnableCinemaMode": "حالت سینما",
"EnableBackdrops": "پشت‌زمینه‌ها",
"EditSubtitles": "ویرایش زیرنویس‌ها",
"EditMetadata": "ویرایش ابرداده",
"EditMetadata": "ویرایش فراداده",
"EditImages": "ویرایش عکس‌ها",
"Edit": "ویرایش",
"DropShadow": "سایه پشت زمینه",
@ -252,7 +252,7 @@
"Download": "بارگیری",
"Down": "پایین",
"DoNotRecord": "ضبط نکن",
"DisplayModeHelp": "نوع صفحه نمایشی که Jellyfin را اجرا می‌کنید را انتخاب کنید‌‌.",
"DisplayModeHelp": "سبک رابط کاربری مورد نظر خود را انتخاب کنید.",
"DisplayMissingEpisodesWithinSeasons": "قسمت‌های ناموجود در فصل‌ها را نمایش بده",
"DisplayInMyMedia": "نمایش در صفحه‌ی خانه",
"Display": "نمایش",
@ -358,13 +358,13 @@
"HeaderLibraryFolders": "پوشه‌های کتابخانه",
"HeaderLibraryAccess": "دسترسی به کتابخانه",
"HeaderLibraries": "کتابخانه‌ها",
"HeaderLatestRecordings": "آخرین ضبط‌ها",
"HeaderLatestMusic": "آخرین آهنگ‌ها",
"HeaderLatestMovies": "آخرین فیلم‌ها",
"HeaderLatestMedia": "آخرین رسانه‌ها",
"HeaderLatestRecordings": "جدیدترین‌ ضبط‌ها",
"HeaderLatestMusic": "جدیدترین‌ آهنگ‌ها",
"HeaderLatestMovies": "جدیدترین‌ فیلم‌ها",
"HeaderLatestMedia": "جدیدترین‌ رسانه‌ها",
"HeaderKeepSeries": "سریال ادامه دهید",
"HeaderKeepRecording": "ضبط را ادامه دهید",
"HeaderItems": "موارد",
"HeaderItems": "آیتم‌ها",
"HeaderInstall": "نصب",
"HeaderImageSettings": "تنظیمات عکس",
"HeaderIdentifyItemHelp": "یک یا بیشتر مورد برای جستجو وارد کنید. موارد را حذف کنید تا نتیجه جستجو را افزایش دهید.",
@ -415,5 +415,203 @@
"HeaderCancelSeries": "لغو سریال",
"HeaderCancelRecording": "لغو ضبط",
"HeaderBooks": "کتاب‌ها",
"HeaderBlockItemsWithNoRating": "موارد مسدود شده با نقص یا عدم وجود اطلاعات امتیاز:"
"HeaderBlockItemsWithNoRating": "موارد مسدود شده با نقص یا عدم وجود اطلاعات امتیاز:",
"LabelSkipIfAudioTrackPresentHelp": "این گزینه را عدم انتخاب کنید تا اطمینان حاصل کنید که همه ویدیوها فارغ از زبان صوت، زیرنویس دارند.",
"LabelSkipIfAudioTrackPresent": "اگر صدای پیش‌فرض با زبان دانلودی یکسان است پرش کن",
"LabelSkipForwardLength": "میزان رفتن به جلو:",
"LabelSkipBackLength": "میزان بازگشت به عقب:",
"LabelSkin": "پوسته:",
"LabelSize": "سایز:",
"LabelSimultaneousConnectionLimit": "محدودیت پخش همزمان:",
"LabelServerName": "نام سرور:",
"LabelServerHostHelp": "192.168.1.100:8096 یا https://myserver.com",
"LabelServerHost": "میزبان:",
"LabelSerialNumber": "شماره سریال",
"LabelSendNotificationToUsers": "ارسال اعلان به:",
"LabelSelectVersionToInstall": "نسخه مورد نظر برای نصب را انتخاب کنید:",
"LabelVersionInstalled": "{0} نصب شده است",
"EncoderPresetHelp": "یک مقدار سریع‌تر انتخاب کنید تا کارایی بهبود پیدا کند یا یک مقدار کُندتر انتخاب کنید تا کیفیت بهبود پیدا کند.",
"ShowYear": "نمایش سال",
"ShowTitle": "نمایش عنوان",
"ButtonAudioTracks": "آهنگ‌ها",
"AlbumArtist": "هنرمند آلبوم",
"Album": "آلبوم",
"HeaderAddScheduledTaskTrigger": "افزودن فعال‌ساز",
"HeaderActivity": "فعالیت‌ها",
"HeaderActiveRecordings": "ضبط‌های فعال",
"HeaderActiveDevices": "دستگاه‌های فعال",
"HeaderAccessScheduleHelp": "یک زمان‌بندی دسترسی ایجاد کنید تا دسترسی به ساعاتی مشخص محدود شود.",
"HeaderAccessSchedule": "زمان‌بندی دسترسی",
"HandledByProxy": "توسط reverse proxy مدیریت می‌شود",
"HDPrograms": "برنامه‌های HD",
"Filters": "صافی‌ها",
"FileReadError": "خطایی هنگام خواندن فایل رخ داد.",
"FileReadCancelled": "خواندن فایل لغو شد.",
"FileNotFound": "فایل پیدا نشد.",
"File": "فایل",
"FetchingData": "در حال دریافت داده‌های اضافی",
"Features": "برجسته‌ها",
"Favorite": "مورد علاقه",
"FastForward": "سریع جلو",
"Extras": "موارد اضافی",
"ExtraLarge": "فوق العاده بزرگ",
"BoxSet": "جعبه ست",
"Art": "هنر",
"Artist": "هنرمند",
"AllComplexFormats": "تمام فرمت‌های پیچیده (ASS, SSA, VOBSUB, PGS, SUB, IDX)",
"GuideProviderLogin": "ورود",
"Guide": "راهنما",
"GuestStar": "ستاره‌ی مهمان",
"GroupVersions": "نسخه‌های گروه",
"GroupBySeries": "گروه بندی بر اساس سریال‌ها",
"Genre": "ژانر",
"General": "عمومی",
"Fullscreen": "تمام صفحه",
"Friday": "جمعه",
"FormatValue": "قالب‌ها: {0}",
"FolderTypeUnset": "محتواهای مخلوط",
"TabMyPlugins": "افزونه‌های من",
"TabMusic": "موسیقی‌ها",
"TabMovies": "فیلم‌ها",
"TabLogs": "واقعه نگار‌ها",
"TabLiveTV": "تلویزیون زنده",
"LatestFromLibrary": "جدیدترین‌های {0}",
"Large": "بزرگ",
"LabelffmpegPath": "مسیر FFmpeg:",
"LabelZipCode": "کدپستی:",
"LabelYear": "سال:",
"LabelWeb": "وب:",
"LabelVideoResolution": "کیفیت ویدیو:",
"LabelVideo": "ویدیو",
"DashboardArchitecture": "معماری: {0}",
"DashboardOperatingSystem": "سیستم عامل: {0}",
"DashboardServerName": "سرور: {0}",
"DashboardVersionNumber": "نسخه: {0}",
"LabelVersion": "نسخه:",
"LabelValue": "مقدار:",
"LabelVaapiDevice": "دستگاه VA API:",
"LabelUsername": "نام کاربری:",
"LabelUserLibrary": "کتابخانه کاربر:",
"LabelUserAgent": "عامل کاربر:",
"LabelUser": "کاربر:",
"LabelUseNotificationServices": "استفاده از سرویس‌های زیر:",
"LabelTypeText": "متن",
"LabelType": "نوع:",
"LabelKodiMetadataEnablePathSubstitution": "فعال سازی تعویض مسیر",
"LabelKodiMetadataDateFormatHelp": "تمام تاریخ‌های موجود در فایل‌های NFO با استفاده از این قالب تجزیه می‌شوند.",
"LabelKodiMetadataDateFormat": "قالب تاریخ انتشار:",
"LabelKidsCategories": "دسته‌بندی‌های کودکان:",
"OnApplicationStartup": "هنگام شروع برنامه",
"EveryXHours": "هر {0} ساعت",
"EveryHour": "هر ساعت",
"EveryXMinutes": "هر {0} دقیقه",
"OnWakeFromSleep": "هنگام بیداری از خواب",
"WeeklyAt": "{0} در {1}",
"DailyAt": "روزانه در {0}",
"LastSeen": "آخرین بازدید {0}",
"PersonRole": "در نقش {0}",
"ListPaging": "{0}-{1} از {2}",
"Yesterday": "دیروز",
"Yes": "بلی",
"YadifBob": "Yadif Bob",
"Yadif": "Yadif",
"ValueConditions": "شرایط: {0}",
"ValueCodec": "کدک: {0}",
"ValueAudioCodec": "کدک صدا: {0}",
"ValueAlbumCount": "{0} آلبوم",
"Upload": "آپلود",
"Up": "بالا",
"Unrated": "بدون امتیاز",
"Unplayed": "پخش نشده",
"Unmute": "صدادار",
"UninstallPluginHeader": "حذف نصب افزونه",
"UninstallPluginConfirmation": "آیا اطمینان دارید که می‌خواهید {0} را حذف نصب کنید؟",
"Uniform": "یکپارچه",
"Tuesday": "سه‌شنبه",
"Transcoding": "کدگذاری",
"Trailers": "تریلرها",
"Track": "آهنگ",
"TrackCount": "{0} آهنگ",
"TitlePlayback": "پخش",
"TitleHostingSettings": "تنظیمات میزبانی",
"TitleHardwareAcceleration": "تسریع کننده سخت افزاری",
"Thursday": "پنج‌شنبه",
"Thumb": "بندانگشتی",
"ThemeVideos": "تم ویدیوها",
"ThemeSongs": "آهنگ‌های تم",
"TagsValue": "برچسب‌ها: {0}",
"Tags": "برچسب‌ها",
"TabUsers": "کاربران",
"Absolute": "کامل",
"Writer": "نویسنده",
"Whitelist": "لیست سفید",
"Wednesday": "چهارشنبه‌ها",
"Watched": "مشاهده شده",
"ViewPlaybackInfo": "مشاهده اطلاعات پخش",
"ViewArtist": "مشاهده هنرمند",
"ViewAlbum": "مشاهده آلبوم",
"VideoRange": "محدوده ویدیو",
"Vertical": "عمودی",
"ValueVideoCodec": "کدک ویدیو: {0}",
"ValueTimeLimitSingleHour": "محدودیت زمانی: 1 ساعت",
"ValueTimeLimitMultiHour": "محدودیت زمانی: {0} ساعت",
"ValueSongCount": "{0} آهنگ",
"ValueSeriesCount": "{0} سریال",
"ValueSeconds": "{0} ثانیه",
"ValueOneSong": "1 آهنگ",
"ValueOneSeries": "1 سریال",
"ValueOneMusicVideo": "1 موزیک ویدیو",
"ValueOneMovie": "1 فیلم",
"ValueOneEpisode": "1 قسمت",
"ValueOneAlbum": "1 آلبوم",
"ValueMusicVideoCount": "{0} موزیک ویدیو",
"ValueMovieCount": "{0} فیلم",
"ValueMinutes": "{0} دقیقه",
"ValueEpisodeCount": "{0} قسمت",
"ValueDiscNumber": "دیسک {0}",
"LabelImportOnlyFavoriteChannels": "محدود کردن کانال‌هایی که به عنوان مورد علاقه انتخاب شده‌اند",
"LabelDateAdded": "تاریخ اضافه شده:",
"LabelDashboardTheme": "تم داشبورد سرور:",
"LabelCustomRating": "امتیازدهی سفارشی:",
"LabelCustomDeviceDisplayName": "نام نمایشی:",
"LabelCustomCssHelp": "ظاهر سفارشی مورد نظر خود را در رابط وب اعمال کنید.",
"LabelCustomCss": "CSS سفارشی:",
"LabelCriticRating": "امتیاز منتقدان:",
"LabelCorruptedFrames": "فریم‌های خراب شده:",
"LabelImageType": "نوع عکس:",
"LabelIconMaxWidth": "حداکثر عرض آیکن:",
"LabelIconMaxHeight": "حداکثر ارتفاع آیکن:",
"LabelHttpsPort": "شماره پورت HTTPS محلی:",
"LabelHomeNetworkQuality": "کیفیت شبکه خانگی:",
"LabelHardwareAccelerationTypeHelp": "تسریع کننده سخت افزاری نیاز به پیکربندی اضافی دارد.",
"LabelSupportedMediaTypes": "نوع‌ رسانه‌های پشتیبانی شده:",
"LabelSubtitles": "زیرنویس‌ها",
"LabelSubtitlePlaybackMode": "حالت زیرنویس:",
"LabelSubtitleFormatHelp": "مثال: srt",
"LabelSubtitleDownloaders": "دانلود کننده زیرنویس:",
"LabelStreamType": "نوع پخش:",
"LabelStopping": "در حال توقف",
"LabelStopWhenPossible": "هنگامی که ممکن است متوقف شود:",
"LabelStatus": "وضعیت:",
"LabelStartWhenPossible": "هنگامی که ممکن است شروع شود:",
"LabelSportsCategories": "دسته‌بندی‌های ورزشی:",
"LabelSpecialSeasonsDisplayName": "نام نمایشی فصل مخصوص:",
"LabelSource": "منبع:",
"LabelSoundEffects": "جلوه‌های صدا:",
"LabelSortTitle": "مرتب‌سازی عنوان:",
"LabelSortOrder": "ترتیب مرتب‌سازی:",
"LabelSortBy": "مرتب‌سازی بر اساس:",
"LabelSonyAggregationFlags": "پرچم‌های جمع‌آوری سونی:",
"LabelSkipIfGraphicalSubsPresent": "صرف نظر کردن اگر ویدیو پیش از این زیرنویس چسبیده در خود دارد",
"EnableColorCodedBackgrounds": "پشت‌ زمینه‌های کدگذاری شده رنگی",
"DisplayMissingEpisodesWithinSeasonsHelp": "این مورد همچنین باید برای کتابخانه های تلویزیون در پیکربندی سرور فعال شود.",
"DisplayInOtherHomeScreenSections": "در بخش‌های صفحه اصلی مانند آخرین رسانه‌ها و ادامه تماشا نمایش بده",
"Desktop": "دسکتاپ",
"CustomDlnaProfilesHelp": "برای هدف قرار دادن یک دستگاه جدید یا سرپوش گذاشتن روی نمایه سیستم ، یک نمایه سفارشی ایجاد کنید.",
"ConfirmDeleteItems": "حذف این مورد، آن را هم از فایل سیستمی و هم از کتابخانه رسانه شما حذف می کند. آیا اطمینان دارید که می‌خواهید ادامه دهید؟",
"ConfirmDeleteItem": "حذف این مورد، آن را هم از فایل سیستمی و هم از کتابخانه رسانه شما حذف می کند. آیا اطمینان دارید که می‌خواهید ادامه دهید؟",
"AlwaysPlaySubtitlesHelp": "زیرنویس‌های متناسب با توجه به اولویت زبان بدون در نظر گرفتن زبان صوتی ویدیو پخش می شوند.",
"AllowedRemoteAddressesHelp": "لیستی از آدرس های IP یا ورودی‌های IP/netmask برای شبکه هایی که به آنها امکان ارتباط از راه دور داده می‌شود ، با کاما از هم جدا شدند. در صورت خالی ماندن ، تمام آدرسهای راه دور مجاز خواهند بود.",
"AllowOnTheFlySubtitleExtractionHelp": "زیرنویس های جاسازی شده را می‌توان از فیلم‌ها استخراج کرد و به منظور جلوگیری از کدگذاری فیلم ، به صورت متن ساده به بازدید کننده ارسال کرد. در بعضی از سیستم‌ها این می‌تواند مدت زیادی طول بکشد و باعث شود پخش فیلم در طول فرآیند استخراج متوقف شود. این گزینه را غیرفعال کنید تا زیرنویس‌های جاسازی شده با استفاده از رمزگذاری ویدیو در حالی که به طور محلی توسط دستگاه بازدیدکننده پشتیبانی نمی‌شوند ارسال شود.",
"AdditionalNotificationServices": "برای نصب سرویس‌های اعلان اضافی، در فروشگاه افزونه‌ها جستجو کنید."
}

View file

@ -164,7 +164,7 @@
"ButtonOff": "Pois päältä",
"ButtonOk": "Ok",
"ButtonOpen": "Avoin",
"BurnSubtitlesHelp": "Määrittää jos palvelimen pitäisi upottaa tekstitykset suoraan videotiedostoon muuntamisvaiheessa tekstitysformaatista riippuen. Upottamisen välttäminen parantaa palvelimen suorituskykyä. Valitse Automaattinen upottaaksesi sekä kuvapohjaiset- (esim. VOBSUB, PGS, SUB/IDX, jne.) että ASS/SSA tekstitysmuodot",
"BurnSubtitlesHelp": "Määrittää mikäli palvelimen pitäisi polttaa tekstitykset suoraan videoon muunnoksen aikana riippuen tekstitysten formaatista. Tekstitysten polttamisen välttäminen parantaa palvelimen suorituskykyä. Valitse Automaattinen polttaaksesi sekä kuva- (esim. VOBSUB, PGS, SUB/IDX, jne.) että tekstipohjaiset (ASS/SSA) formaatit.",
"ButtonParentalControl": "Lapsilukko",
"ButtonPause": "Tauko",
"ButtonPlay": "Toista",
@ -267,7 +267,7 @@
"ButtonAddImage": "Lisää kuva",
"Movies": "Elokuvat",
"HeaderNextUp": "Seuraavaksi",
"HeaderLiveTV": "TV-lähetykset",
"HeaderLiveTV": "Suorat lähetykset",
"HeaderFavoriteSongs": "Lempikappaleet",
"HeaderFavoriteShows": "Lempisarjat",
"HeaderFavoriteEpisodes": "Lempijaksot",
@ -319,5 +319,7 @@
"ErrorAddingXmlTvFile": "XMLTV-tiedostoa käyttäessä tapahtui virhe. Varmista, että tiedosto on olemassa ja kokeile uudestaan.",
"ErrorAddingTunerDevice": "Viritintä lisätessä ilmeni ongelma. Varmista, että se on kytketty oikein ja kokeile uudestaan.",
"EnableThemeVideosHelp": "Soita tunnusvideoita taustalla, selatessasi kirjastoa.",
"EnableThemeVideos": "Teeman videot"
"EnableThemeVideos": "Teeman videot",
"AlbumArtist": "Albumin Artisti",
"Album": "Albumi"
}

View file

@ -199,10 +199,10 @@
"EditMetadata": "Éditer les métadonnées",
"EditSubtitles": "Modifier les sous-titres",
"EnableBackdrops": "Images d'arrière-plans",
"EnableBackdropsHelp": "Afficher les images d'arrière-plans sur certaines pages pendant la navigation dans la médiathèque.",
"EnableBackdropsHelp": "Afficher des images d'arrière-plans sur certaines pages pendant la navigation dans la médiathèque.",
"EnableCinemaMode": "Mode cinéma",
"EnableColorCodedBackgrounds": "Fonds avec code couleur",
"EnableDisplayMirroring": "Partage d'écran",
"EnableDisplayMirroring": "Affichage en miroir",
"EnableExternalVideoPlayers": "Lecteurs vidéo externes",
"EnableExternalVideoPlayersHelp": "Une liste des lecteurs externes sera affichée au lancement de la lecture d'une vidéo.",
"EnableHardwareEncoding": "Activer l'encodage matériel",
@ -231,7 +231,7 @@
"EveryNDays": "Tous les {0} jours",
"ExitFullscreen": "Sortir du plein écran",
"ExtraLarge": "Très Grand",
"ExtractChapterImagesHelp": "L'extraction d'images de chapitre permettra aux applications d'afficher des menus visuels pour la sélection des scènes. Le processus peut être long, consommateur de ressources et peut nécessiter de nombreux gigaoctets de stockage. Il s'exécute lorsque des vidéos sont découvertes et également comme tâche planifiée. La planification peut être modifiée dans les options du planificateur de tâches. Il n'est pas conseillé d'exécuter cette tâche pendant les heures d'usage intensif.",
"ExtractChapterImagesHelp": "L'extraction d'images de chapitre permettra aux applications d'afficher des menus visuels pour la sélection des scènes. Le processus peut être lent, gourmand en ressources et peut nécessiter plusieurs gigaoctets de stockage. Il s'exécute lorsque des vidéos sont découvertes et également comme tâche planifiée. L'horaire est configurable dans les options du planificateur de tâches. Il n'est pas recommandé d'exécuter cette tâche pendant les heures d'usage intensif.",
"FFmpegSavePathNotFound": "Nous ne pouvons pas localiser FFmpeg en utilisant le chemin que vous avez saisi. FFprobe est également nécessaire et doit exister dans le même dossier. Ces composants sont généralement regroupés dans le même téléchargement. Veuillez vérifier le chemin et essayer à nouveau.",
"FastForward": "Avance rapide",
"Favorite": "Favori",
@ -274,7 +274,7 @@
"HeaderAddUser": "Ajouter un utilisateur",
"HeaderAdditionalParts": "Parties additionelles",
"HeaderAdmin": "Administrateur",
"HeaderAlbumArtists": "Artistes d'album",
"HeaderAlbumArtists": "Artistes de l'album",
"HeaderAlert": "Alerte",
"HeaderAllowMediaDeletionFrom": "Autoriser la suppression de médias à partir de",
"HeaderApiKey": "Clé API",
@ -624,7 +624,7 @@
"LabelKidsCategories": "Catégories jeunesse :",
"LabelKodiMetadataDateFormat": "Format de la date de sortie :",
"LabelKodiMetadataDateFormatHelp": "Toutes les dates des fichiers NFO seront anlysés en utilisant ce format.",
"LabelKodiMetadataEnableExtraThumbs": "Copier les extrafanart vers le champ extrathumbs",
"LabelKodiMetadataEnableExtraThumbs": "Copier les extrafanart dans les champs extrathumbs",
"LabelKodiMetadataEnableExtraThumbsHelp": "Pendant le téléchargement, les images peuvent être enregistrées en tant qu'extrafanart et extrathumbs pour améliorer la compatibilité avec le skin Kodi.",
"LabelKodiMetadataEnablePathSubstitution": "Activer la substitution des chemins",
"LabelKodiMetadataEnablePathSubstitutionHelp": "Active la substitution du chemin des images en utilisant les paramètres de substitution des chemins du serveur.",
@ -1399,7 +1399,7 @@
"AuthProviderHelp": "Sélectionner un fournisseur d'authentification pour authentifier le mot de passe de cet utilisateur.",
"PasswordResetProviderHelp": "Choisissez un Fournisseur de réinitialisation de mot de passe à utiliser lorsqu'un utilisateur demande la réinitialisation de son mot de passe",
"HeaderHome": "Accueil",
"LabelUserLoginAttemptsBeforeLockout": "Essais manqués restants avant verrouillage utilisateur :",
"LabelUserLoginAttemptsBeforeLockout": "Tentatives de connexion échouées avant que l'utilisateur ne soit verrouillé:",
"DashboardOperatingSystem": "Système d'Exploitation: {0}",
"DashboardArchitecture": "Architecture : {0}",
"LaunchWebAppOnStartup": "Démarrer l'interface web dans mon navigateur quand le serveur est démarré",
@ -1409,7 +1409,7 @@
"MessageNoServersAvailable": "Aucun serveur n'a été trouvé en utilisant la recherche automatique de serveur.",
"OptionBanner": "Bannière",
"OptionList": "Liste",
"OptionLoginAttemptsBeforeLockout": "Détermine le nombre de tentative de connexion infructueuse avant le blocage d'accès.",
"OptionLoginAttemptsBeforeLockout": "Définis le nombre de tentatives de connexion échouées avant blocage du compte.",
"OptionPoster": "Affiche",
"OptionPosterCard": "Affichette",
"OptionThumb": "Vignette",
@ -1437,10 +1437,10 @@
"LabelVideoBitrate": "Débit vidéo :",
"LabelTranscodingProgress": "Progression du transcodage :",
"LabelTranscodingFramerate": "Taux de rafraîchissement du transcodage :",
"LabelPleaseRestart": "Les changements prendront effet lors d'un rechargement manuel du client web.",
"LabelPleaseRestart": "Les changements prendront effet après un rechargement manuel du client web.",
"LabelPlayMethod": "Méthode de lecture :",
"LabelPlayer": "Lecteur :",
"LabelBaseUrl": "Lien d'origine :",
"LabelBaseUrl": "URL de base :",
"LabelAudioSampleRate": "Taux déchantillonnage audio :",
"LabelAudioCodec": "Codec audio :",
"LabelAudioChannels": "Canaux audio :",
@ -1448,7 +1448,7 @@
"FetchingData": "Récuperer des données suplémentaires",
"CopyStreamURLSuccess": "URL copiée avec succès.",
"CopyStreamURL": "Copier l'URL du flux",
"LabelBaseUrlHelp": "Vous pouvez ajouter un sous-répertoire personalisé ici pour accéder au serveur depuis une URL plus exclusive.",
"LabelBaseUrlHelp": "Vous pouvez ajouter un sous-répertoire personnalisé ici pour accéder au serveur via un lien unique.",
"HeaderFavoritePeople": "Personnes préférées",
"OptionRandom": "Aléatoire",
"ButtonSplit": "Séparer",
@ -1458,16 +1458,16 @@
"MessageConfirmAppExit": "Voulez-vous quitter ?",
"LabelVideoResolution": "Résolution vidéo :",
"LabelStreamType": "Type de flux :",
"EnableFastImageFadeInHelp": "Activer un transition plus rapide pour images téléchargées",
"EnableFastImageFadeIn": "Transition d'image rapide",
"EnableFastImageFadeInHelp": "Activer un fondu plus rapide pour l'animation des images chargées",
"EnableFastImageFadeIn": "Fondu d'image rapide",
"LabelPlayerDimensions": "Dimension du lecteur :",
"LabelDroppedFrames": "Images perdues :",
"LabelCorruptedFrames": "Images corrompues:",
"CopyStreamURLError": "Il y a eu une erreur lors de la copie du URL.",
"CopyStreamURLError": "Une erreur est survenue lors de la copie de l'URL.",
"AskAdminToCreateLibrary": "Demander à un administrateur de créer une médiathèque.",
"AllowFfmpegThrottlingHelp": "Quand le transcodage ou le remultiplexage est suffisamment loin de la position de lecture, le processus se mettra en pause afin déconomiser des ressources. Plus utile lors dune lecture continue. À désactiver en cas de problèmes de lecture.",
"AllowFfmpegThrottling": "Adapter la Vitesse du Transcodage",
"NoCreatedLibraries": "Il semblerait que vous n'ayez créé aucune librairie. {0}Voulez-vous en créer une maintenant ?{1}",
"NoCreatedLibraries": "Il semble que vous n'ayez pas encore créé de bibliothèques. {0}Voulez-vous en créer une maintenant ?{1}",
"PlaybackErrorNoCompatibleStream": "Ce client n'est pas compatible avec le média et le serveur n'envoie pas de format compatible.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Préférer les informations intégrées aux noms de fichiers",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Utilise les informations des métadonnées intégrées, si disponible.",
@ -1495,8 +1495,12 @@
"ListPaging": "{0}-{1} de {2}",
"WriteAccessRequired": "Le serveur Jellyfin a besoin d'un accès en écriture à ce dossier. Merci de vérifier laccès en écriture et réessayez.",
"PathNotFound": "Le chemin d'accès n'a pas pu être trouvé. Merci de le vérifier et de réessayer.",
"YadifBob": "Yadif Bob",
"Yadif": "Yadif",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
"LabelDeinterlaceMethod": "Méthode de désentrelacement :",
"DeinterlaceMethodHelp": "Sélectionnes la méthode de désentrelacement à utiliser lors du transcodage de contenu entrelacé."
"DeinterlaceMethodHelp": "Sélectionnes la méthode de désentrelacement à utiliser lors du transcodage de contenu entrelacé.",
"LabelLibraryPageSize": "Taille de la page de la médiathèque :",
"LabelLibraryPageSizeHelp": "Définit la quantité d'éléments à afficher sur une page de médiathèque. Définir à 0 afin de désactiver la pagination.",
"UnsupportedPlayback": "Jellyfin ne peut pas décoder du contenu protégé par un système de gestion des droits numériques, mais une tentative de lecture sera effectuée sur tout le contenu, y compris les titres protégés. Certains fichiers peuvent apparaître complètement noir, du fait de protections ou de fonctionnalités non supportées, comme les titres interactifs.",
"MessageUnauthorizedUser": "Vous n'êtes pas autorisé à accéder au serveur pour le moment. Veuillez contacter l'administrateur de votre serveur pour plus d'informations."
}

View file

@ -277,10 +277,10 @@
"MaxParentalRatingHelp": "תוכן עם דירוג גובה יותר יוסתר מהמשתמש.",
"MessageAreYouSureDeleteSubtitles": "האם אתה בטוח שברצונך למחוק קובץ כתובית זה?",
"MessageConfirmRecordingCancellation": "‏האם אתה בטוח שברצונך לבטל הקלטה זו?",
"MessageDownloadQueued": "הורד תור",
"MessageDownloadQueued": "הורדה נוספה לתור.",
"MessageItemSaved": "הפריט נשמר.",
"MessageItemsAdded": "פריטים נוספו.",
"MessageLeaveEmptyToInherit": "השאר ריק כדי לרשת את ההגדרות מפריט אב, או את ערך ברירת המחדל הגלובלי.",
"MessageLeaveEmptyToInherit": "השאר ריק כדי לרשת את ההגדרות מפריט אב או את ערך ברירת המחדל הגלובלי.",
"MessageNothingHere": "אין כאן כלום.",
"MessagePleaseEnsureInternetMetadata": "בבקשה וודא כי הורדת מידע מהאינטרנט מאופשרת",
"MinutesAfter": "דקות אחרי",
@ -528,7 +528,7 @@
"Audio": "שמע",
"AspectRatio": "יחס גובה-רוחב",
"AlwaysPlaySubtitlesHelp": "כתוביות בשפה המועדפת ייטענו ללא קשר לשפת השמע.",
"AlwaysPlaySubtitles": "הפעל כתוביות תמיד",
"AlwaysPlaySubtitles": "הפעל תמיד",
"AllowRemoteAccessHelp": "אם לא מסומן, כל החיבורים המרוחקים ייחסמו.",
"AllowRemoteAccess": "אפשר חיבור מרוחק לשרת Jellyfin זה.",
"AllowMediaConversionHelp": "אפשר או חסום גישה להמרת מדיה.",
@ -548,8 +548,8 @@
"HeaderContinueWatching": "המשך לצפות",
"AllowOnTheFlySubtitleExtraction": "אפשר חילוץ כתוביות בזמן אמת",
"AllowHWTranscodingHelp": "אפשר למלקט לקודד הזרמות בזמן אמת. זה עשוי לעזור בהפחתת הקידוד שנעשה ע\"י השרת.",
"AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB\\IDX וכדומה)",
"AddItemToCollectionHelp": "הוסף פריטים לאוספים ע\"י חיפושם ושימוש בלחצן ימני או הקשה על התפריט כדי להוסיף אותם לאוסף.",
"AllComplexFormats": "כל הפורמטים המורכבים (ASS, SSA, VOBSUB, PGS, SUB/IDX)",
"AddItemToCollectionHelp": "הוסף חפצים לאוסף על ידי חיפוש שלהם ולחיצה על כפתור ימני בעכבר או כפתור התפריט כדי להוסיף לאוסף.",
"Songs": "שירים",
"Shows": "סדרות",
"DownloadsValue": "{0} הורדות",
@ -741,5 +741,25 @@
"Browse": "עיין",
"BoxRear": "מארז (מאחור)",
"BookLibraryHelp": "ניתן להוסיף ספרים מוקלטים וספרים כתובים. עיינו {0}במדריך מתן שמות לספרים{1}.",
"Desktop": "שולחן עבודה"
"Desktop": "שולחן עבודה",
"MessageUnauthorizedUser": "אין לך גישה לשרת ברגע זה. אנא צור קשר עם מנהל השרת למידע נוסף.",
"MessageDeleteTaskTrigger": "האם אתה בטוח שברצונך למחוק את מפעיל המשימה הזה?",
"LastSeen": "נראה לאחרונה ב-{0}",
"PersonRole": "כ-{0}",
"ListPaging": "{0}-{1} מתוך {2}",
"EveryXHours": "בכל {0} שעות",
"OnApplicationStartup": "באתחול היישום",
"DeleteUserConfirmation": "האם אתה בטוח שברצונך למחוק את המשתמש?",
"DeleteDeviceConfirmation": "האם אתה בטוח שברצונך למחוק את המכשיר? הוא יופיע שוב בפעם הבאה שמשתמש ייכנס באמצעותו.",
"ColorSpace": "מרחב צבע",
"CinemaModeConfigurationHelp": "מצב קולנוע מביא את חוויית הקולנוע היישר אל הסלון עם האפשרות להפעיל טריילרים וקדימונים מותאמים אישית לפני הסרט.",
"ChannelAccessHelp": "בחר את הערוצים לשיתוף עם משתמש זה. מנהלים יוכלו לערוך את כל הערוצים בעזרת \"מנהל המטא-דאטה\".",
"ButtonResetEasyPassword": "אתחל קוד פין פשוט",
"ButtonOff": "כיבוי",
"ButtonLibraryAccess": "הרשאות גישה לספרייה",
"BurnSubtitlesHelp": "מחליט אם על השרת לצרוב כתוביות בזמן קידוד וידאו. הימנעות מכך תשפר מאוד את הביצועים. בחר \"אוטומטי\" לצריבת כתוביות על בסיס פורמט תמונה (VOBSUB, PGS, SUB, IDX) וכתוביות ASS או SSA מסויימות.",
"Artist": "אמן",
"AllowedRemoteAddressesHelp": "רשימת IP \\ מיסוך רשת המופרדת בפסיקים עבור רשתות שיורשו להתחבר מרחוק. במידה ותישאר ריקה, כל הכתובות יורשו להתחבר.",
"Album": "אלבום",
"AlbumArtist": "אמן האלבום"
}

View file

@ -758,7 +758,7 @@
"HeaderMusicQuality": "Zene minősége",
"HeaderNewApiKey": "Új API kulcs",
"HeaderNewDevices": "Új eszközök",
"HeaderNextEpisodePlayingInValue": "Következő epizód lejátszása {0} múlva",
"HeaderNextEpisodePlayingInValue": "A következő epizód {0} múlva automatikusan elindul",
"HeaderNextVideoPlayingInValue": "Következő videó lejátszása {0}",
"HeaderOtherItems": "Egyéb elemek",
"HeaderPasswordReset": "Jelszó visszaállítása",
@ -786,7 +786,7 @@
"MediaInfoCodecTag": "Kódek címke",
"Photos": "Fényképek",
"Playlists": "Lejátszási listák",
"Shows": "Műsorok",
"Shows": "Sorozatok",
"Songs": "Dalok",
"ValueSpecialEpisodeName": "Special - {0}",
"EnableThemeVideos": "Videók témák",
@ -1473,8 +1473,8 @@
"PlaybackErrorNoCompatibleStream": "Ez a kliens nem kompatibilis ezzel a médiával és a szerver nem tud kompatibilis streamet küldeni az eszközre.",
"AllowFfmpegThrottlingHelp": "Ha az átkódolás vagy remux eléggé előtöltődött a jelenlegi lejátszási pozícióhoz képest, ez megállítja a folyamatot, hogy kevesebb erőforrást vegyen igénybe. Ez akkor hasznos, ha ritkán ugrálsz előre a lejátszott videókban. Kapcsold ki, ha lejátszási problémákba ütközöl.",
"AllowFfmpegThrottling": "Átkódolás visszafogása",
"PreferEmbeddedEpisodeInfosOverFileNames": "Inkább a beágyazott epizódokra vonatkozó információkat részesítse előnyben a fájlnevekkel szemben",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Ez a beágyazott metaadatok epizódinformációit használja, ha rendelkezésre állnak.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Az epizódból elérhető beágyazott információkat használja inkább, fájlnevek helyett",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Ez az epizóddal kapcsolatos beágyazott metaadatokat használja, ha azok elérhetőek.",
"OnApplicationStartup": "Az alkalmazás indításakor",
"EveryXHours": "{0} óránként",
"EveryHour": "Óránként",
@ -1484,7 +1484,7 @@
"DailyAt": "Naponta ekkor: {0}",
"LastSeen": "Utoljára elérhető {0}",
"PersonRole": "mint {0}",
"ListPaging": "{0}-{1} ennyiből: {2}",
"ListPaging": "{0}-{1} / {2}",
"WriteAccessRequired": "A Jellyfin Szerver írási jogosultságot igényel ehhez a könyvtárhoz. Kérjük, ellenőrizd, hogy van-e jogod írni ide, majd próbáld újra.",
"PathNotFound": "Az elérési út nem található. Kérjük, ellenőrizd, hogy az elérési út megfelelő-e, majd próbáld újra.",
"Track": "Szám",
@ -1494,8 +1494,17 @@
"Movie": "Film",
"Episode": "Epizód",
"ClientSettings": "Kliens beállítások",
"BoxSet": "Dobozos készlet",
"BoxSet": "Dobozos kiadások",
"Artist": "Előadó",
"AlbumArtist": "Album előadó",
"Album": "Album"
"Album": "Album",
"LabelLibraryPageSizeHelp": "Az oldalnként megmutatott elemek száma. Nullára állítva a lapozási funkció ki lesz kapcsolva.",
"LabelLibraryPageSize": "Könyvtár oldalméret:",
"LabelDeinterlaceMethod": "Deinterlacing mód:",
"DeinterlaceMethodHelp": "Válassza ki a váltottsorosság megszűntetéséhez használandó módszert a váltottsoros tartalmak transzkódolásakor.",
"UnsupportedPlayback": "Jellyfin nem tud DRM-titkosított tartalmak dekriptálására, ettől függetlenül a lejátszással mindig megpróbálkozik. Néhány fájl emiatt teljesen fekete képernyőt ad, amely vagy a titkosítás miatt van, vagy nem olyan nem támogatott tartalmak miatt, mint az interaktív címek.",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
"ReleaseGroup": "Kiadócsoport",
"MessageUnauthorizedUser": "Jelenleg nincs jogosultságod a szerverhez való hozzáféréshez. Kérjük, lépj kapcsolatba az adminisztrátorral további információkért!"
}

View file

@ -93,7 +93,7 @@
"ButtonRename": "Rinomina",
"ButtonRepeat": "Ripeti",
"ButtonResetEasyPassword": "Resetta codice PIN",
"ButtonResetPassword": "Ripristina Password",
"ButtonResetPassword": "Reset Password",
"ButtonRestart": "Riavvia",
"ButtonResume": "Riprendi",
"ButtonRevoke": "Revocare",
@ -202,7 +202,7 @@
"EnableStreamLoopingHelp": "Abilita questo se gli streaming in diretta contengono solo pochi secondi di dati e devono essere costantemente richiesti. L'abilitazione di questa funzione quando non è servita può causare problemi.",
"EnableThemeSongs": "Canzoni a tema",
"EnableThemeSongsHelp": "Le canzoni a tema saranno riprodotte mentre visualizzi la tua libreria.",
"EnableThemeVideos": "VIdeo a tema",
"EnableThemeVideos": "Video a tema",
"EnableThemeVideosHelp": "Riproduzione dei video a tema sullo sfondo mentre visualizzi la tua libreria.",
"Ended": "Finito",
"EndsAtValue": "Finirà alle {0}",
@ -461,7 +461,7 @@
"Images": "Immagini",
"ImportFavoriteChannelsHelp": "Se abilitata, solo i canali che sono contrassegnati come preferiti sul dispositivo di sintonizzazione verranno importati.",
"ImportMissingEpisodesHelp": "Se abilitato, le informazioni relative agli episodi mancanti saranno importate nel database di Jellyfin e mostrate all'interno di Serie e Stagioni. Questo può causare scansioni della libreria più lente.",
"InstallingPackage": "Installazione di {0}",
"InstallingPackage": "Installazione di {0} (versione {1})",
"InstantMix": "Mix istantaneo",
"ItemCount": "{0} elementi",
"Items": "Elementi",
@ -1035,14 +1035,14 @@
"OptionWeekly": "Settimanale",
"OriginalAirDateValue": "Prima messa in onda (originale): {0}",
"Overview": "Trama",
"PackageInstallCancelled": "Installazione di {0} annullata.",
"PackageInstallCompleted": "Installazione di {0} completa.",
"PackageInstallFailed": "Installazione di {0} fallita.",
"PackageInstallCancelled": "Installazione di {0} (versione {1}) annullata.",
"PackageInstallCompleted": "Installazione di {0} (versione {1}) completata.",
"PackageInstallFailed": "Installazione di {0} (versione {1}) fallita.",
"ParentalRating": "Classificazione per genitori",
"PasswordMatchError": "Le password non coincidono.",
"PasswordResetComplete": "la password è stata ripristinata.",
"PasswordResetConfirmation": "Sei sicuro di voler ripristinare la password?",
"PasswordResetHeader": "Ripristina Password",
"PasswordResetComplete": "Reset della password eseguito.",
"PasswordResetConfirmation": "Sicuro di voler eseguire il reset della password?",
"PasswordResetHeader": "Reset Password",
"PasswordSaved": "Password salvata.",
"People": "Attori",
"PerfectMatch": "Corrispondenza perfetta",
@ -1202,7 +1202,7 @@
"TabProfiles": "Profili",
"TabRecordings": "Registrazioni",
"TabResponses": "Risposte",
"TabResumeSettings": "Ripristina",
"TabResumeSettings": "Riprendi",
"TabScheduledTasks": "Operazioni Pianificate",
"TabSeries": "Serie TV",
"TabSettings": "Impostazioni",
@ -1355,7 +1355,7 @@
"OptionProtocolHls": "Streaming in Diretta HTTP",
"OptionDownloadArtImage": "Art",
"OptionMax": "Massimo",
"PasswordResetProviderHelp": "Scegli un Provider Reset Password da utilizzare quando questo utente richiede un reset della password",
"PasswordResetProviderHelp": "Scegli un Provider Reset Password da utilizzare quando questo utente ne richiede il reset",
"PlaybackData": "Dati di Riproduzione",
"TagsValue": "Tag: {0}",
"Whitelist": "Lista bianca",
@ -1457,7 +1457,7 @@
"CopyStreamURLError": "Si è verificato un errore nel copiare l'indirizzo.",
"EnableFastImageFadeInHelp": "Abilita la dissolvenza veloce per le immagini caricate",
"EnableFastImageFadeIn": "Dissolvenza immagine veloce",
"PlaybackErrorNoCompatibleStream": "C'era un problema con il profiling del client e il server non sta inviando un formato compatibile.",
"PlaybackErrorNoCompatibleStream": "Il client è incompatibile con il media e il server non sta inviando un formato compatibile.",
"OptionForceRemoteSourceTranscoding": "Forza la transcodifica da fonti di media remoti (come LiveTV)",
"NoCreatedLibraries": "Sembra che tu non abbia ancora creato delle librerie. {0}Vuoi crearne una adesso?{1}",
"LabelVideoResolution": "Risoluzione video:",
@ -1471,5 +1471,35 @@
"PreferEmbeddedEpisodeInfosOverFileNames": "Preferisci le informazioni incorporate nell'episodio rispetto ai nomi dei file",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Questo utilizza le informazioni dell'episodio provenienti dai metadata incorporati, se disponibili.",
"ClientSettings": "Impostazioni del client",
"Album": "Album"
"Album": "Album",
"OnWakeFromSleep": "Al risveglio",
"Person": "Persona",
"LabelDeinterlaceMethod": "Metodo di deinterlacciamento:",
"DeinterlaceMethodHelp": "Metodo di deinterlacciamento da usare durante la transcodifica.",
"Artist": "Artista",
"OnApplicationStartup": "All'avvio",
"EveryXHours": "Ogni {0} ore",
"EveryHour": "Ogni ora",
"EveryXMinutes": "Ogni {0} minuti",
"WeeklyAt": "Tutti i {0} alle {1}",
"DailyAt": "Tutti i giorni alle {0}",
"LastSeen": "Visto l'ultima volta {0}",
"PersonRole": "nel ruolo di {0}",
"ListPaging": "{0}-{1} di {2}",
"WriteAccessRequired": "Jellyfin Server richiede il permesso di scrittura su questa cartella. Verificare l'autorizzazione e riprovare.",
"PathNotFound": "Percorso non trovato. Assicurarsi che sia valido e riprovare.",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
"Track": "Traccia",
"Season": "Stagione",
"OtherArtist": "Altri Artisti",
"Movie": "Film",
"LabelLibraryPageSizeHelp": "Numero di elementi presenti nella paginazione della libreria. Il valore 0 disabilita la paginazione.",
"LabelLibraryPageSize": "Elementi nella paginazione della libreria:",
"Episode": "Episodio",
"BoxSet": "Cofanetto",
"AlbumArtist": "Artisti dell'Album",
"ReleaseGroup": "Release Group",
"UnsupportedPlayback": "Jellyfin non è in grado di decriptare i contenuti protetti da DRM ma tutti i contenuti verranno tentati a prescindere, compresi quelli protetti. Alcuni file potrebbero apparire completamente neri a causa della crittografia o di altre funzionalità non supportate, come i titoli interattivi.",
"MessageUnauthorizedUser": "Non sei autorizzato ad accedere in questo momento al server. Contatta l'amministratore per ulteriori dettagli."
}

Some files were not shown because too many files have changed in this diff Show more