1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge remote-tracking branch 'upstream/master' into nowplaying-hotfixes

This commit is contained in:
ferferga 2020-06-30 19:40:07 +02:00
commit 647cc72767
88 changed files with 2257 additions and 813 deletions

View file

@ -66,7 +66,7 @@
"hls.js": "^0.13.1",
"howler": "^2.2.0",
"intersection-observer": "^0.10.0",
"jellyfin-apiclient": "^1.2.2",
"jellyfin-apiclient": "^1.3.0",
"jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto",
"jquery": "^3.5.1",
"jstree": "^3.3.10",

View file

@ -24,10 +24,6 @@
padding-top: 7em !important;
}
.layout-mobile .libraryPage {
padding-top: 4em !important;
}
.itemDetailPage {
padding-top: 0 !important;
}
@ -164,6 +160,7 @@
display: flex;
flex-direction: column;
contain: layout style paint;
transition: background ease-in-out 0.5s;
}
.hiddenViewMenuBar .skinHeader {
@ -438,12 +435,14 @@
background-repeat: no-repeat;
background-position: center;
background-attachment: fixed;
height: 50vh;
height: 40vh;
position: relative;
animation: backdrop-fadein 800ms ease-in normal both;
}
.layout-mobile .itemBackdrop {
background-attachment: scroll;
height: 26.5vh;
}
.layout-desktop .itemBackdrop::after,
@ -463,10 +462,20 @@
.detailPageContent {
display: flex;
flex-direction: column;
padding-left: 2%;
padding-left: 32.45vw;
padding-right: 2%;
}
.layout-mobile .detailPageContent {
padding-left: 5%;
padding-right: 5%;
}
.layout-desktop .detailPageContent .emby-scroller,
.layout-tv .detailPageContent .emby-scroller {
margin-left: 0;
}
.layout-desktop .noBackdrop .detailPageContent,
.layout-tv .noBackdrop .detailPageContent {
margin-top: 2.5em;
@ -477,6 +486,10 @@
margin-top: 0;
}
.detailSectionContent a {
color: inherit;
}
.personBackdrop {
background-size: contain;
}
@ -495,7 +508,23 @@
.parentName {
display: block;
margin-bottom: 0.5em;
margin: 0 0 0;
}
.layout-mobile .parentName {
margin: 0.6em 0 0;
}
.musicParentName {
margin: 0.15em 0 0.2em;
}
.layout-mobile .musicParentName {
margin: -0.25em 0 0.25em;
}
.layout-mobile .itemExternalLinks {
display: none;
}
.mainDetailButtons {
@ -503,8 +532,6 @@
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
-webkit-flex-wrap: wrap;
flex-wrap: wrap;
margin: 1em 0;
}
@ -520,6 +547,35 @@
font-weight: 600;
}
.itemName.originalTitle {
margin: 0.2em 0 0.2em;
}
.itemName.parentNameLast {
margin: 0 0 0;
}
.layout-mobile .itemName.parentNameLast {
margin: 0.4em 0 0.4em;
}
.layout-mobile h1.itemName,
.layout-mobile h1.parentName {
font-size: 1.6em;
}
.itemName.parentNameLast.withOriginalTitle {
margin: 0 0 0;
}
.layout-mobile .itemName.parentNameLast.withOriginalTitle {
margin: 0.6em 0 0;
}
.layout-mobile .itemName.originalTitle {
margin: 0.5em 0 0.5em;
}
.nameContainer {
display: flex;
flex-direction: column;
@ -546,6 +602,19 @@
text-align: center;
}
.layout-mobile .mainDetailButtons {
margin-top: 1em;
margin-bottom: 0.5em;
}
.subtitle {
margin: 0.15em 0 0.2em;
}
.layout-mobile .subtitle {
margin: 0.2em 0 0.2em;
}
.detailPagePrimaryContainer {
display: flex;
align-items: center;
@ -556,7 +625,7 @@
.layout-mobile .detailPagePrimaryContainer {
display: block;
position: relative;
top: 0;
padding: 0.5em 3.3% 0.5em;
}
.layout-tv #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer,
@ -566,13 +635,14 @@
padding-left: 32.45vw;
}
.layout-desktop .detailSticky,
.layout-tv .detailSticky {
.layout-desktop .detailRibbon,
.layout-tv .detailRibbon {
margin-top: -7.2em;
height: 7.18em;
}
.layout-desktop .noBackdrop .detailSticky,
.layout-tv .noBackdrop .detailSticky {
.layout-desktop .noBackdrop .detailRibbon,
.layout-tv .noBackdrop .detailRibbon {
margin-top: 0;
}
@ -584,6 +654,9 @@
white-space: nowrap;
text-overflow: ellipsis;
text-align: left;
min-width: 0;
max-width: 100%;
overflow: hidden;
}
.layout-mobile .infoText {
@ -594,13 +667,29 @@
margin: 1.25em 0;
}
.detailImageContainer {
position: relative;
margin-top: -25vh;
margin-bottom: 10vh;
.layout-mobile .detailPageSecondaryContainer {
margin: 1em 0;
}
.layout-mobile .detailImageContainer {
display: none;
}
.detailImageContainer .card {
position: absolute;
top: 50%;
float: left;
width: 25vw;
z-index: 3;
transform: translateY(-50%);
}
.detailImageContainer .card.backdropCard {
top: 35%;
}
.detailImageContainer .card.squareCard {
top: 40%;
}
.layout-desktop .noBackdrop .detailImageContainer,
@ -613,11 +702,11 @@
}
.detailLogo {
width: 30vw;
height: 25vh;
width: 25vw;
height: 16vh;
position: absolute;
top: 10vh;
right: 20vw;
right: 25vw;
background-size: contain;
}
@ -657,14 +746,19 @@ div.itemDetailGalleryLink.defaultCardBackground {
position: relative;
}
.layout-desktop .detailPageWrapperContainer,
.layout-tv .detailPageWrapperContainer {
margin-top: 7.2em;
.layout-desktop .itemBackdrop,
.layout-tv .itemBackdrop {
height: 40vh;
}
.layout-tv #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer,
.layout-desktop #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer {
padding-left: 3.3%;
.layout-desktop .detailPageWrapperContainer,
.layout-tv .detailPageWrapperContainer {
margin-top: 0.1em;
}
.layout-desktop .detailImageContainer .card,
.layout-tv .detailImageContainer .card {
top: 10%;
}
.btnPlaySimple {
@ -680,12 +774,12 @@ div.itemDetailGalleryLink.defaultCardBackground {
.emby-button.detailFloatingButton {
position: absolute;
background-color: rgba(0, 0, 0, 0.5) !important;
z-index: 1;
top: 50%;
left: 50%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 3;
top: 100%;
left: 90%;
margin: -2.2em 0 0 -2.2em;
padding: 0.4em !important;
padding: 0.4em;
color: rgba(255, 255, 255, 0.76);
}
@ -695,16 +789,12 @@ div.itemDetailGalleryLink.defaultCardBackground {
@media all and (max-width: 62.5em) {
.parentName {
margin-bottom: 1em;
margin-bottom: 0;
}
.itemDetailPage {
padding-top: 0 !important;
}
.detailimg-hidemobile {
display: none;
}
}
@media all and (min-width: 31.25em) {
@ -868,6 +958,10 @@ div.itemDetailGalleryLink.defaultCardBackground {
}
}
.detailVerticalSection .emby-scrollbuttons {
padding-top: 0.4em;
}
.layout-tv .detailVerticalSection {
margin-bottom: 3.4em !important;
}
@ -956,6 +1050,10 @@ div.itemDetailGalleryLink.defaultCardBackground {
margin-bottom: 2.7em;
}
.layout-mobile .verticalSection-extrabottompadding {
margin-bottom: 1em;
}
.sectionTitleButton,
.sectionTitleIconButton {
margin-right: 0 !important;
@ -981,7 +1079,13 @@ div.itemDetailGalleryLink.defaultCardBackground {
div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
margin: 0;
padding-top: 1.25em;
padding-top: 0.5em;
padding-bottom: 0.2em;
}
.layout-mobile :not(.sectionTitleContainer-cards) > .sectionTitle-cards {
margin: 0;
padding-top: 0.5em;
}
.sectionTitleButton {
@ -1134,6 +1238,12 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
.trackSelections .selectContainer .selectLabel {
margin: 0 0.2em 0 0;
line-height: 1.75;
}
.layout-mobile .detailsGroupItem .label,
.layout-mobile .trackSelections .selectContainer .selectLabel {
flex-basis: 4.5em;
}
.trackSelections .selectContainer .detailTrackSelect {

View file

@ -16,7 +16,7 @@ function getOffsets(elems) {
return results;
}
for (let elem of elems) {
for (const elem of elems) {
let box = elem.getBoundingClientRect();
results.push({
@ -135,7 +135,7 @@ export function show(options) {
let renderIcon = false;
let icons = [];
let itemIcon;
for (let item of options.items) {
for (const item of options.items) {
itemIcon = item.icon || (item.selected ? 'check' : null);

View file

@ -1310,7 +1310,7 @@ import 'programStyles';
}
const mediaSourceCount = item.MediaSourceCount || 1;
if (mediaSourceCount > 1) {
if (mediaSourceCount > 1 && options.disableIndicators !== true) {
innerCardFooter += '<div class="mediaSourceIndicator">' + mediaSourceCount + '</div>';
}
@ -1391,6 +1391,7 @@ import 'programStyles';
cardBoxClose = '</div>';
cardScalableClose = '</div>';
if (options.disableIndicators !== true) {
let indicatorsHtml = '';
if (options.missingIndicator !== false) {
@ -1420,6 +1421,7 @@ import 'programStyles';
if (indicatorsHtml) {
cardImageContainerOpen += '<div class="cardIndicators">' + indicatorsHtml + '</div>';
}
}
if (!imgUrl) {
cardImageContainerOpen += getDefaultText(item, options);
@ -1467,7 +1469,7 @@ import 'programStyles';
let additionalCardContent = '';
if (layoutManager.desktop) {
additionalCardContent += getHoverMenuHtml(item, action);
additionalCardContent += getHoverMenuHtml(item, action, options);
}
return '<' + tagName + ' data-index="' + index + '"' + timerAttributes + actionAttribute + ' data-isfolder="' + (item.IsFolder || false) + '" data-serverid="' + (item.ServerId || options.serverId) + '" data-id="' + (item.Id || item.ItemId) + '" data-type="' + item.Type + '"' + mediaTypeData + collectionTypeData + channelIdData + positionTicksData + collectionIdData + playlistIdData + contextData + parentIdData + ' data-prefix="' + prefix + '" class="' + className + '">' + cardImageContainerOpen + innerCardFooter + cardImageContainerClose + overlayButtons + additionalCardContent + cardScalableClose + outerCardFooter + cardBoxClose + '</' + tagName + '>';
@ -1477,9 +1479,10 @@ import 'programStyles';
* Generates HTML markup for the card overlay.
* @param {object} item - Item used to generate the card overlay.
* @param {string} action - Action assigned to the overlay.
* @param {Array} options - Card builder options.
* @returns {string} HTML markup of the card overlay.
*/
function getHoverMenuHtml(item, action) {
function getHoverMenuHtml(item, action, options) {
let html = '';
html += '<div class="cardOverlayContainer itemAction" data-action="' + action + '">';
@ -1494,12 +1497,12 @@ import 'programStyles';
const userData = item.UserData || {};
if (itemHelper.canMarkPlayed(item)) {
if (itemHelper.canMarkPlayed(item) && !options.disableHoverMenu) {
require(['emby-playstatebutton']);
html += '<button is="emby-playstatebutton" type="button" data-action="none" class="' + btnCssClass + '" data-id="' + item.Id + '" data-serverid="' + item.ServerId + '" data-itemtype="' + item.Type + '" data-played="' + (userData.Played) + '"><span class="material-icons cardOverlayButtonIcon cardOverlayButtonIcon-hover check"></span></button>';
}
if (itemHelper.canRate(item)) {
if (itemHelper.canRate(item) && !options.disableHoverMenu) {
const likes = userData.Likes == null ? '' : userData.Likes;
@ -1507,7 +1510,9 @@ import 'programStyles';
html += '<button is="emby-ratingbutton" type="button" data-action="none" class="' + btnCssClass + '" data-id="' + item.Id + '" data-serverid="' + item.ServerId + '" data-itemtype="' + item.Type + '" data-likes="' + likes + '" data-isfavorite="' + (userData.IsFavorite) + '"><span class="material-icons cardOverlayButtonIcon cardOverlayButtonIcon-hover favorite"></span></button>';
}
if (!options.disableHoverMenu) {
html += '<button is="paper-icon-button-light" class="' + btnCssClass + '" data-action="menu"><span class="material-icons cardOverlayButtonIcon cardOverlayButtonIcon-hover more_vert"></span></button>';
}
html += '</div>';
html += '</div>';

View file

@ -22,7 +22,7 @@ define(['dom', 'appRouter', 'connectionManager'], function (dom, appRouter, conn
return void appRouter.showItem(items[0]);
}
var url = 'itemdetails.html?id=' + itemId + '&serverId=' + serverId;
var url = 'details?id=' + itemId + '&serverId=' + serverId;
Dashboard.navigate(url);
});
e.stopPropagation();

View file

@ -212,8 +212,15 @@ import 'css!./style';
}
}
export function setLazyImage(element, url) {
element.classList.add('lazy');
element.setAttribute('data-src', url);
lazyImage(element);
}
/* eslint-enable indent */
export default {
serLazyImage: setLazyImage,
fillImages: fillImages,
fillImage: fillImage,
lazyImage: lazyImage,

View file

@ -1,14 +1,12 @@
define(['apphost', 'globalize'], function (appHost, globalize) {
'use strict';
function getDisplayName(item, options) {
function getDisplayName(item, options = {}) {
if (!item) {
throw new Error('null item passed into getDisplayName');
}
options = options || {};
if (item.Type === 'Timer') {
item = item.ProgramInfo || item;
}

View file

@ -125,10 +125,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
var largeTitleTagName = layoutManager.tv ? 'h2' : 'div';
for (var i = 0, length = textlines.length; i < length; i++) {
var text = textlines[i];
for (const [i, text] of textlines.entries()) {
if (!text) {
continue;
}
@ -438,8 +435,6 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
html += '<div class="' + cssClass + '">';
const moreIcon = 'more_vert';
html += getTextLinesHtml(textlines, isLargeStyle);
if (options.mediaInfo !== false) {
@ -490,10 +485,6 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
html += '<button is="paper-icon-button-light" class="listItemButton itemAction" data-action="addtoplaylist"><span class="material-icons playlist_add"></span></button>';
}
if (options.moreButton !== false) {
html += '<button is="paper-icon-button-light" class="listItemButton itemAction" data-action="menu"><span class="material-icons ' + moreIcon + '"></span></button>';
}
if (options.infoButton) {
html += '<button is="paper-icon-button-light" class="listItemButton itemAction" data-action="link"><span class="material-icons info_outline"></span></button>';
}
@ -507,14 +498,18 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
var userData = item.UserData || {};
var likes = userData.Likes == null ? '' : userData.Likes;
if (itemHelper.canMarkPlayed(item)) {
if (itemHelper.canMarkPlayed(item) && options.enablePlayedButton !== false) {
html += '<button is="emby-playstatebutton" type="button" class="listItemButton paper-icon-button-light" data-id="' + item.Id + '" data-serverid="' + item.ServerId + '" data-itemtype="' + item.Type + '" data-played="' + (userData.Played) + '"><span class="material-icons check"></span></button>';
}
if (itemHelper.canRate(item)) {
if (itemHelper.canRate(item) && options.enableRatingButton !== false) {
html += '<button is="emby-ratingbutton" type="button" class="listItemButton paper-icon-button-light" data-id="' + item.Id + '" data-serverid="' + item.ServerId + '" data-itemtype="' + item.Type + '" data-likes="' + likes + '" data-isfavorite="' + (userData.IsFavorite) + '"><span class="material-icons favorite"></span></button>';
}
}
if (options.moreButton !== false) {
html += '<button is="paper-icon-button-light" class="listItemButton itemAction" data-action="menu"><span class="material-icons more_vert"></span></button>';
}
}
html += '</div>';

View file

@ -41,6 +41,8 @@
width: auto !important;
height: auto !important;
font-size: 1.4em;
margin-right: 0.125em;
color: #f2b01e;
}
.mediaInfoCriticRating {

View file

@ -126,7 +126,7 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
for (const artist of item.ArtistItems) {
let artistName = artist.Name;
let artistId = artist.Id;
artistsSeries += `<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=${artistId}&amp;serverId=${nowPlayingServerId}">${artistName}</a>`;
artistsSeries += `<a class="button-link emby-button" is="emby-linkbutton" href="details?id=${artistId}&serverId=${nowPlayingServerId}">${artistName}</a>`;
if (artist !== item.ArtistItems.slice(-1)[0]) {
artistsSeries += ', ';
}
@ -143,18 +143,18 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
}
}
context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries;
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('.nowPlayingAlbum').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.AlbumId + `&serverId=${nowPlayingServerId}">${albumName}</a>`;
}
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>`;
context.querySelector('.nowPlayingSeason').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.SeasonId + `&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>`;
context.querySelector('.nowPlayingSerie').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.SeriesId + `&serverId=${nowPlayingServerId}">${seriesName}</a>`;
} else {
context.querySelector('.nowPlayingSerie').innerHTML = seriesName;
}
@ -562,7 +562,6 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
if (!state.NextMediaType) {
updatePlayerState(player, dlg, {});
//onPlaylistUpdate();
Emby.Page.back();
}
}

View file

@ -1,12 +1,18 @@
.subtitleSync {
position: absolute;
width: 100%;
}
.subtitleSyncContainer {
width: 40%;
margin-left: 30%;
margin-right: 30%;
min-width: 18em;
margin-left: auto;
margin-right: auto;
height: 4.2em;
background: rgba(28, 28, 28, 0.8);
border-radius: 0.3em;
color: #fff;
position: absolute;
position: relative;
}
.subtitleSync-closeButton {

View file

@ -65,6 +65,9 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html',
event.preventDefault();
}
}
// FIXME: TV layout will require special handling for navigation keys. But now field is not focusable
event.stopPropagation();
});
subtitleSyncTextField.blur = function() {
@ -87,14 +90,6 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html',
getOffsetFromPercentage(this.value));
});
subtitleSyncSlider.addEventListener('touchmove', function () {
// set new offset
playbackManager.setSubtitleOffset(getOffsetFromPercentage(this.value), player);
// synchronize with textField value
subtitleSyncTextField.updateOffset(
getOffsetFromPercentage(this.value));
});
subtitleSyncSlider.getBubbleHtml = function (value) {
var newOffset = getOffsetFromPercentage(value);
return '<h1 class="sliderBubbleText">' +

View file

@ -1,7 +1,9 @@
<div class="subtitleSyncContainer">
<div class="subtitleSync">
<div class="subtitleSyncContainer">
<button type="button" is="paper-icon-button-light" class="subtitleSync-closeButton"><span class="material-icons close"></span></button>
<div class="subtitleSyncTextField" contenteditable="true" spellcheck="false">0s</div>
<div class="sliderContainer subtitleSyncSliderContainer">
<input is="emby-slider" type="range" step="1" min="0" max="100" value="50" class="subtitleSyncSlider" />
<input is="emby-slider" type="range" step="1" min="0" max="100" value="50" class="subtitleSyncSlider" data-slider-keep-progress="true" />
</div>
</div>
</div>

View file

@ -37,7 +37,7 @@ function showNewJoinGroupSelection (button, user, apiClient) {
console.debug('No item is currently playing.');
}
apiClient.sendSyncPlayCommand(sessionId, 'ListGroups').then(function (response) {
apiClient.sendSyncPlayCommand('ListGroups').then(function (response) {
response.json().then(function (groups) {
var menuItems = groups.map(function (group) {
return {
@ -83,9 +83,9 @@ function showNewJoinGroupSelection (button, user, apiClient) {
actionsheet.show(menuOptions).then(function (id) {
if (id == 'new-group') {
apiClient.sendSyncPlayCommand(sessionId, 'NewGroup');
apiClient.sendSyncPlayCommand('NewGroup');
} else {
apiClient.sendSyncPlayCommand(sessionId, 'JoinGroup', {
apiClient.sendSyncPlayCommand('JoinGroup', {
GroupId: id,
PlayingItemId: playingItemId
});
@ -140,7 +140,7 @@ function showLeaveGroupSelection (button, user, apiClient) {
actionsheet.show(menuOptions).then(function (id) {
if (id == 'leave-group') {
apiClient.sendSyncPlayCommand(sessionId, 'LeaveGroup');
apiClient.sendSyncPlayCommand('LeaveGroup');
}
}).catch((error) => {
console.error('SyncPlay: unexpected error showing group menu:', error);

View file

@ -139,7 +139,7 @@ class SyncPlayManager {
return;
}
apiClient.sendSyncPlayCommand(sessionId, 'UpdatePing', {
apiClient.sendSyncPlayCommand('UpdatePing', {
Ping: ping
});
}
@ -447,7 +447,7 @@ class SyncPlayManager {
if (!success) {
console.warning('Error reporting playback state to server. Joining group will fail.');
}
apiClient.sendSyncPlayCommand(sessionId, 'JoinGroup', {
apiClient.sendSyncPlayCommand('JoinGroup', {
GroupId: groupId,
PlayingItemId: playingItemId
});
@ -658,8 +658,7 @@ class SyncPlayManager {
*/
playRequest (player) {
var apiClient = connectionManager.currentApiClient();
var sessionId = getActivePlayerId();
apiClient.sendSyncPlayCommand(sessionId, 'PlayRequest');
apiClient.sendSyncPlayCommand('PlayRequest');
}
/**
@ -667,8 +666,7 @@ class SyncPlayManager {
*/
pauseRequest (player) {
var apiClient = connectionManager.currentApiClient();
var sessionId = getActivePlayerId();
apiClient.sendSyncPlayCommand(sessionId, 'PauseRequest');
apiClient.sendSyncPlayCommand('PauseRequest');
// Pause locally as well, to give the user some little control
playbackManager._localUnpause(player);
}
@ -678,8 +676,7 @@ class SyncPlayManager {
*/
seekRequest (PositionTicks, player) {
var apiClient = connectionManager.currentApiClient();
var sessionId = getActivePlayerId();
apiClient.sendSyncPlayCommand(sessionId, 'SeekRequest', {
apiClient.sendSyncPlayCommand('SeekRequest', {
PositionTicks: PositionTicks
});
}

View file

@ -1,8 +1,5 @@
<div id="itemDetailPage" data-role="page" class="page libraryPage itemDetailPage noSecondaryNavPage selfBackdropPage noBackdrop" data-backbutton="true">
<div id="itemDetailPage" data-role="page" class="page libraryPage itemDetailPage noSecondaryNavPage selfBackdropPage" data-backbutton="true">
<div id="itemBackdrop" class="itemBackdrop">
<button is="emby-button" type="button" class="btnPlay detailFloatingButton hide fab autoSize" title="${ButtonPlay}" data-mode="resume">
<span class="material-icons play_arrow"></span>
</button>
</div>
<div class="detailLogo"></div>
@ -15,94 +12,75 @@
</div>
<div class="mainDetailButtons">
<button is="emby-button" type="button" class="button-flat btnResume hide detailButton detailButtonHideonMobile" data-mode="resume">
<button is="emby-button" type="button" class="button-flat btnResume hide detailButton" title="${ButtonResume}" data-mode="resume">
<div class="detailButton-content">
<span class="material-icons detailButton-icon play_arrow"></span>
<div class="detailButton-text">${ButtonResume}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnPlay hide detailButton detailButtonHideonMobile" data-mode="play">
<button is="emby-button" type="button" class="button-flat btnPlay hide detailButton" title="${ButtonPlay}" data-mode="play">
<div class="detailButton-content">
<span class="material-icons detailButton-icon play_arrow"></span>
<div class="detailButton-text">${ButtonPlay}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnDownload hide detailButton">
<button is="emby-button" type="button" class="button-flat btnDownload hide detailButton" title="${ButtonDownload}">
<div class="detailButton-content">
<span class="material-icons detailButton-icon get_app"></span>
<div class="detailButton-text">${ButtonDownload}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnPlayTrailer hide detailButton">
<button is="emby-button" type="button" class="button-flat btnPlayTrailer hide detailButton" title="${ButtonTrailer}">
<div class="detailButton-content">
<span class="material-icons detailButton-icon theaters"></span>
<div class="detailButton-text">${ButtonTrailer}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnInstantMix hide detailButton">
<button is="emby-button" type="button" class="button-flat btnInstantMix hide detailButton" title="${HeaderInstantMix}">
<div class="detailButton-content">
<span class="material-icons detailButton-icon explore"></span>
<div class="detailButton-text">${HeaderInstantMix}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnShuffle hide detailButton">
<button is="emby-button" type="button" class="button-flat btnShuffle hide detailButton" title="${ButtonShuffle}">
<div class="detailButton-content">
<span class="material-icons detailButton-icon shuffle"></span>
<div class="detailButton-text">${ButtonShuffle}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnCancelSeriesTimer hide detailButton">
<button is="emby-button" type="button" class="button-flat btnCancelSeriesTimer hide detailButton" title="${CancelSeries}">
<div class="detailButton-content">
<span class="material-icons detailButton-icon delete"></span>
<div class="detailButton-text">${CancelSeries}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnCancelTimer hide detailButton">
<button is="emby-button" type="button" class="button-flat btnCancelTimer hide detailButton" title="${StopRecording}">
<div class="detailButton-content">
<span class="material-icons detailButton-icon stop"></span>
<div class="detailButton-text">${StopRecording}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnDeleteItem hide detailButton">
<div class="detailButton-content">
<span class="material-icons detailButton-icon delete"></span>
<div class="detailButton-text">${Delete}</div>
</div>
</button>
<button is="emby-playstatebutton" type="button" class="button-flat btnPlaystate hide detailButton">
<button is="emby-playstatebutton" type="button" class="button-flat btnPlaystate hide detailButton" title="">
<div class="detailButton-content">
<span class="material-icons detailButton-icon check"></span>
<div class="detailButton-text button-text"></div>
</div>
</button>
<button is="emby-ratingbutton" type="button" class="button-flat btnUserRating hide detailButton">
<button is="emby-ratingbutton" type="button" class="button-flat btnUserRating hide detailButton" title="${Rate}">
<div class="detailButton-content">
<span class="material-icons detailButton-icon favorite"></span>
<div class="detailButton-text button-text">${Rate}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnSplitVersions hide detailButton">
<button is="emby-button" type="button" class="button-flat btnSplitVersions hide detailButton" title="${ButtonSplit}">
<div class="detailButton-content">
<span class="material-icons detailButton-icon call_split"></span>
<div class="detailButton-text">${ButtonSplit}</div>
</div>
</button>
<button is="emby-button" type="button" class="button-flat btnMoreCommands hide detailButton">
<button is="emby-button" type="button" class="button-flat btnMoreCommands hide detailButton" title="${ButtonMore}">
<div class="detailButton-content">
<span class="material-icons detailButton-icon more_vert"></span>
<div class="detailButton-text">${ButtonMore}</div>
</div>
</button>
</div>
@ -110,7 +88,7 @@
<div class="detailPageSecondaryContainer">
<div class="detailImageContainer padded-left"></div>
<div class="detailPageContent">
<div class="detailPagePrimaryContent padded-left padded-right">
<div class="detailPagePrimaryContent padded-right">
<div class="detailSection">
<div class="itemMiscInfo nativeName hide"></div>
@ -124,6 +102,11 @@
<div class="directorsLabel label"></div>
<div class="directors content"></div>
</div>
<div class="detailsGroupItem writersGroup hide">
<div class="writersLabel label"></div>
<div class="writers content"></div>
</div>
</div>
<form class="trackSelections hide focuscontainer-x">
@ -164,15 +147,15 @@
</div>
<div class="seriesTimerScheduleSection verticalSection detailVerticalSection hide" style="margin-top:-3em;">
<h2 class="sectionTitle padded-left">${HeaderSchedule}</h2>
<div class="seriesTimerSchedule padded-left padded-right"></div>
<h2 class="sectionTitle">${HeaderSchedule}</h2>
<div class="seriesTimerSchedule padded-right"></div>
</div>
<div class="collectionItems"></div>
<div class="collectionItems hide"></div>
<div class="nextUpSection verticalSection detailVerticalSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left">${HeaderNextUp}</h2>
<div is="emby-itemscontainer" class="nextUpItems vertical-wrap padded-left padded-right"></div>
<h2 class="sectionTitle sectionTitle-cards">${HeaderNextUp}</h2>
<div is="emby-itemscontainer" class="nextUpItems vertical-wrap padded-right"></div>
</div>
<div class="programGuideSection hide verticalSection detailVerticalSection">
@ -180,64 +163,64 @@
</div>
<div id="childrenCollapsible" class="hide verticalSection detailVerticalSection">
<h2 class="childrenSectionHeader sectionTitle sectionTitle-cards padded-left">
<h2 class="childrenSectionHeader sectionTitle sectionTitle-cards hide">
<span id="childrenTitle"></span>
</h2>
<div id="childrenContent">
<div is="emby-itemscontainer" class="childrenItemsContainer itemsContainer padded-left padded-right" style="text-align: left;"></div>
<div is="emby-itemscontainer" class="childrenItemsContainer itemsContainer padded-right" style="text-align: left;"></div>
</div>
</div>
<div id="additionalPartsCollapsible" class="verticalSection detailVerticalSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderAdditionalParts}</h2>
<div id="additionalPartsContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right"></div>
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderAdditionalParts}</h2>
<div id="additionalPartsContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-right"></div>
</div>
<div class="verticalSection itemVerticalSection moreFromSeasonSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right"></h2>
<div class="verticalSection detailVerticalSection moreFromSeasonSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-right"></h2>
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
</div>
</div>
<div class="verticalSection itemVerticalSection moreFromArtistSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right"></h2>
<div class="verticalSection detailVerticalSection moreFromArtistSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-right"></h2>
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
</div>
</div>
<div id="castCollapsible" class="verticalSection detailVerticalSection hide">
<h2 id="peopleHeader" class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderCastCrew}</h2>
<h2 id="peopleHeader" class="sectionTitle sectionTitle-cards padded-right">${HeaderCastCrew}</h2>
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
<div id="castContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
</div>
</div>
<div id="seriesScheduleSection" class="verticalSection detailVerticalSection hide">
<h2 class="sectionTitle padded-left padded-right">${HeaderUpcomingOnTV}</h2>
<div id="seriesScheduleList" is="emby-itemscontainer" class="itemsContainer vertical-list padded-left padded-right"></div>
<h2 class="sectionTitle padded-right">${HeaderUpcomingOnTV}</h2>
<div id="seriesScheduleList" is="emby-itemscontainer" class="itemsContainer vertical-list padded-right"></div>
</div>
<div id="specialsCollapsible" class="verticalSection detailVerticalSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderSpecialFeatures}</h2>
<div id="specialsContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right"></div>
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderSpecialFeatures}</h2>
<div id="specialsContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-right"></div>
</div>
<div id="musicVideosCollapsible" class="verticalSection detailVerticalSection hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderMusicVideos}</h2>
<div id="musicVideosContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right"></div>
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderMusicVideos}</h2>
<div id="musicVideosContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-right"></div>
</div>
<div id="scenesCollapsible" class="verticalSection itemVerticalSection verticalSection-extrabottompadding hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderScenes}</h2>
<div id="scenesCollapsible" class="verticalSection detailVerticalSection verticalSection-extrabottompadding hide">
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderScenes}</h2>
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
<div id="scenesContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
</div>
</div>
<div id="similarCollapsible" class="verticalSection itemVerticalSection verticalSection-extrabottompadding hide">
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderMoreLikeThis}</h2>
<div id="similarCollapsible" class="verticalSection detailVerticalSection verticalSection-extrabottompadding hide">
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderMoreLikeThis}</h2>
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer similarContent"></div>
</div>

View file

@ -28,15 +28,11 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function hideAll(page, className, show) {
var i;
var length;
var elems = page.querySelectorAll('.' + className);
for (i = 0, length = elems.length; i < length; i++) {
for (const elem of page.querySelectorAll('.' + className)) {
if (show) {
elems[i].classList.remove('hide');
elem.classList.remove('hide');
} else {
elems[i].classList.add('hide');
elem.classList.add('hide');
}
}
}
@ -51,7 +47,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
positionTo: button,
cancelTimer: false,
record: false,
deleteItem: true === item.IsFolder,
deleteItem: item.CanDelete === true,
shuffle: false,
instantMix: false,
user: user,
@ -75,7 +71,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
moreButton: false,
recordButton: false
});
return html += '</div>';
html += '</div>';
return html;
}
function renderSeriesTimerSchedule(page, apiClient, seriesTimerId) {
@ -143,9 +141,13 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
var mediaSources = item.MediaSources;
instance._currentPlaybackMediaSources = mediaSources;
page.querySelector('.trackSelections').classList.remove('hide');
select.setLabel(globalize.translate('LabelVersion'));
var currentValue = select.value;
var selectedId = mediaSources[0].Id;
select.innerHTML = mediaSources.map(function (v) {
var selected = v.Id === selectedId ? ' selected' : '';
@ -172,7 +174,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
return m.Id === mediaSourceId;
})[0];
var tracks = mediaSource.MediaStreams.filter(function (m) {
return 'Video' === m.Type;
return m.Type === 'Video';
});
var select = page.querySelector('.selectVideo');
select.setLabel(globalize.translate('LabelVideo'));
@ -242,12 +244,24 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
select.setLabel(globalize.translate('LabelSubtitles'));
var selectedId = null == mediaSource.DefaultSubtitleStreamIndex ? -1 : mediaSource.DefaultSubtitleStreamIndex;
if (tracks.length) {
var videoTracks = mediaSource.MediaStreams.filter(function (m) {
return 'Video' === m.Type;
});
// This only makes sence on Video items
if (videoTracks.length) {
var selected = -1 === selectedId ? ' selected' : '';
select.innerHTML = '<option value="-1">' + globalize.translate('Off') + '</option>' + tracks.map(function (v) {
selected = v.Index === selectedId ? ' selected' : '';
return '<option value="' + v.Index + '" ' + selected + '>' + v.DisplayTitle + '</option>';
}).join('');
if (tracks.length > 1) {
select.removeAttribute('disabled');
} else {
select.setAttribute('disabled', 'disabled');
}
page.querySelector('.selectSubtitlesContainer').classList.remove('hide');
} else {
select.innerHTML = '';
@ -278,7 +292,15 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
var enableShuffle = item.IsFolder || -1 !== ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type);
hideAll(page, 'btnShuffle', enableShuffle);
canPlay = true;
hideAll(page, 'btnResume', item.UserData && item.UserData.PlaybackPositionTicks > 0);
const isResumable = item.UserData && item.UserData.PlaybackPositionTicks > 0;
hideAll(page, 'btnResume', isResumable);
if (isResumable) {
for (const elem of page.querySelectorAll('.btnPlay')) {
elem.querySelector('.detailButton-icon').classList.replace('play_arrow', 'replay');
}
}
} else {
hideAll(page, 'btnPlay');
hideAll(page, 'btnResume');
@ -324,8 +346,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
function getArtistLinksHtml(artists, serverId, context) {
var html = [];
for (var i = 0, length = artists.length; i < length; i++) {
var artist = artists[i];
for (const artist of artists) {
var href = appRouter.getRouteUrl(artist, {
context: context,
itemType: 'MusicArtist',
@ -333,10 +354,18 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
});
html.push('<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + href + '">' + artist.Name + '</a>');
}
html = html.join(' / ');
return html = html.join(' / ');
return html;
}
function renderName(item, container, isStatic, context) {
/**
* Renders the item's name block
* @param {Object} item - Item used to render the name.
* @param {HTMLDivElement} container - Container to render the information into.
* @param {Object} context - Application context.
*/
function renderName(item, container, context) {
var parentRoute;
var parentNameHtml = [];
var parentNameLast = false;
@ -410,16 +439,12 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
if (parentNameLast) {
// Music
if (layoutManager.mobile) {
html = '<h3 class="parentName" style="margin: .25em 0;">' + parentNameHtml.join('</br>') + '</h3>';
html = '<h3 class="parentName musicParentName">' + parentNameHtml.join('</br>') + '</h3>';
} else {
html = '<h3 class="parentName" style="margin: .25em 0;">' + parentNameHtml.join(' - ') + '</h3>';
html = '<h3 class="parentName musicParentName">' + parentNameHtml.join(' - ') + '</h3>';
}
} else {
if (layoutManager.mobile) {
html = '<h1 class="parentName" style="margin: 0.2em 0 0">' + parentNameHtml.join('</br>') + '</h1>';
} else {
html = '<h1 class="parentName" style="margin: 0.2em 0 0">' + tvShowHtml + '</h1>';
}
html = '<h1 class="parentName">' + tvShowHtml + '</h1>';
}
}
@ -428,17 +453,19 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
});
if (html && !parentNameLast) {
if (!layoutManager.mobile && tvSeasonHtml) {
html += '<h3 class="itemName infoText" style="margin: 0.2em 0 0">' + tvSeasonHtml + ' - ' + name + '</h3>';
if (tvSeasonHtml) {
html += '<h3 class="itemName infoText subtitle">' + tvSeasonHtml + ' - ' + name + '</h3>';
} else {
html += '<h3 class="itemName infoText" style="margin: 0.2em 0 0">' + name + '</h3>';
html += '<h3 class="itemName infoText subtitle">' + name + '</h3>';
}
} else if (item.OriginalTitle && item.OriginalTitle != item.Name) {
html = '<h1 class="itemName infoText parentNameLast withOriginalTitle">' + name + '</h1>' + html;
} else {
html = '<h1 class="itemName infoText" style="margin: 0.4em 0 0">' + name + '</h1>' + html;
html = '<h1 class="itemName infoText parentNameLast">' + name + '</h1>' + html;
}
if (item.OriginalTitle && item.OriginalTitle != item.Name) {
html += '<h4 class="itemName infoText" style="margin: 0 0 0;">' + item.OriginalTitle + '</h4>';
html += '<h4 class="itemName infoText originalTitle">' + item.OriginalTitle + '</h4>';
}
container.innerHTML = html;
@ -470,43 +497,18 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
var imgUrl;
var hasbackdrop = false;
var itemBackdropElement = page.querySelector('#itemBackdrop');
var usePrimaryImage = item.MediaType === 'Video' && item.Type !== 'Movie' && item.Type !== 'Trailer' ||
item.MediaType && item.MediaType !== 'Video' ||
item.Type === 'MusicAlbum' ||
item.Type === 'Person';
if (!layoutManager.mobile && !userSettings.detailsBanner()) {
return false;
}
if ('Program' === item.Type && item.ImageTags && item.ImageTags.Thumb) {
imgUrl = apiClient.getScaledImageUrl(item.Id, {
type: 'Thumb',
maxWidth: dom.getScreenWidth(),
index: 0,
tag: item.ImageTags.Thumb
});
page.classList.remove('noBackdrop');
imageLoader.lazyImage(itemBackdropElement, imgUrl);
hasbackdrop = true;
} else if (usePrimaryImage && item.ImageTags && item.ImageTags.Primary) {
imgUrl = apiClient.getScaledImageUrl(item.Id, {
type: 'Primary',
maxWidth: dom.getScreenWidth(),
index: 0,
tag: item.ImageTags.Primary
});
page.classList.remove('noBackdrop');
imageLoader.lazyImage(itemBackdropElement, imgUrl);
hasbackdrop = true;
} else if (item.BackdropImageTags && item.BackdropImageTags.length) {
if (item.BackdropImageTags && item.BackdropImageTags.length) {
imgUrl = apiClient.getScaledImageUrl(item.Id, {
type: 'Backdrop',
maxWidth: dom.getScreenWidth(),
index: 0,
tag: item.BackdropImageTags[0]
});
page.classList.remove('noBackdrop');
imageLoader.lazyImage(itemBackdropElement, imgUrl);
hasbackdrop = true;
} else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
@ -516,50 +518,35 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
index: 0,
tag: item.ParentBackdropImageTags[0]
});
page.classList.remove('noBackdrop');
imageLoader.lazyImage(itemBackdropElement, imgUrl);
hasbackdrop = true;
} else if (item.ImageTags && item.ImageTags.Thumb) {
imgUrl = apiClient.getScaledImageUrl(item.Id, {
type: 'Thumb',
maxWidth: dom.getScreenWidth(),
index: 0,
tag: item.ImageTags.Thumb
});
page.classList.remove('noBackdrop');
imageLoader.lazyImage(itemBackdropElement, imgUrl);
hasbackdrop = true;
} else {
itemBackdropElement.style.backgroundImage = '';
}
if ('Person' === item.Type) {
// FIXME: This hides the backdrop on all persons to fix a margin issue. Ideally, a proper fix should be made.
page.classList.add('noBackdrop');
itemBackdropElement.classList.add('personBackdrop');
} else {
itemBackdropElement.classList.remove('personBackdrop');
}
return hasbackdrop;
}
function reloadFromItem(instance, page, params, item, user) {
var context = params.context;
page.querySelector('.detailPagePrimaryContainer').classList.add('detailSticky');
const apiClient = connectionManager.getApiClient(item.ServerId);
renderName(item, page.querySelector('.nameContainer'), false, context);
var apiClient = connectionManager.getApiClient(item.ServerId);
renderSeriesTimerEditor(page, item, apiClient, user);
renderTimerEditor(page, item, apiClient, user);
renderImage(page, item, apiClient, user);
renderLogo(page, item, apiClient);
Emby.Page.setTitle('');
setInitialCollapsibleState(page, item, apiClient, context, user);
renderDetails(page, item, apiClient, context);
renderTrackSelections(page, instance, item);
// Start rendering the artwork first
renderImage(page, item);
renderLogo(page, item, apiClient);
renderBackdrop(item);
renderDetailPageBackdrop(page, item, apiClient);
// Render the main information for the item
page.querySelector('.detailPagePrimaryContainer').classList.add('detailRibbon');
renderName(item, page.querySelector('.nameContainer'), params.context);
renderDetails(page, item, apiClient, params.context);
renderTrackSelections(page, instance, item);
renderSeriesTimerEditor(page, item, apiClient, user);
renderTimerEditor(page, item, apiClient, user);
setInitialCollapsibleState(page, item, apiClient, params.context, user);
var canPlay = reloadPlayButtons(page, item);
if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf('PlayTrailers')) {
@ -570,12 +557,6 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
setTrailerButtonVisibility(page, item);
if (item.CanDelete && !item.IsFolder) {
hideAll(page, 'btnDeleteItem', true);
} else {
hideAll(page, 'btnDeleteItem');
}
if ('Program' !== item.Type || canPlay) {
hideAll(page, 'mainDetailButtons', true);
} else {
@ -667,18 +648,15 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderLogo(page, item, apiClient) {
var url = logoImageUrl(item, apiClient, {
maxWidth: 400
});
var detailLogo = page.querySelector('.detailLogo');
var url = logoImageUrl(item, apiClient, {});
if (!layoutManager.mobile && !userSettings.enableBackdrops()) {
detailLogo.classList.add('hide');
} else if (url) {
detailLogo.classList.remove('hide');
detailLogo.classList.add('lazy');
detailLogo.setAttribute('data-src', url);
imageLoader.lazyImage(detailLogo);
imageLoader.setLazyImage(detailLogo, url);
} else {
detailLogo.classList.add('hide');
}
@ -704,172 +682,60 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
}
function renderLinks(linksElem, item) {
var html = [];
function renderLinks(page, item) {
var externalLinksElem = page.querySelector('.itemExternalLinks');
var links = [];
if (!layoutManager.tv && item.HomePageUrl) {
links.push('<a style="color:inherit;" is="emby-linkbutton" class="button-link" href="' + item.HomePageUrl + '" target="_blank">' + globalize.translate('ButtonWebsite') + '</a>');
links.push(`<a is="emby-linkbutton" class="button-link" href="${item.HomePageUrl}" target="_blank">${globalize.translate('ButtonWebsite')}</a>`);
}
if (item.ExternalUrls) {
for (var i = 0, length = item.ExternalUrls.length; i < length; i++) {
var url = item.ExternalUrls[i];
links.push('<a style="color:inherit;" is="emby-linkbutton" class="button-link" href="' + url.Url + '" target="_blank">' + url.Name + '</a>');
for (const url of item.ExternalUrls) {
links.push(`<a is="emby-linkbutton" class="button-link" href="${url.Url}" target="_blank">${url.Name}</a>`);
}
}
var html = [];
if (links.length) {
html.push(links.join(', '));
}
linksElem.innerHTML = html.join(', ');
externalLinksElem.innerHTML = html.join(', ');
if (html.length) {
linksElem.classList.remove('hide');
externalLinksElem.classList.remove('hide');
} else {
linksElem.classList.add('hide');
externalLinksElem.classList.add('hide');
}
}
function renderDetailImage(page, elem, item, apiClient, editable, imageLoader, indicators) {
if ('SeriesTimer' === item.Type || 'Program' === item.Type) {
editable = false;
}
elem.classList.add('detailimg-hidemobile');
var imageTags = item.ImageTags || {};
if (item.PrimaryImageTag) {
imageTags.Primary = item.PrimaryImageTag;
}
var url;
var html = '';
var shape = 'portrait';
var detectRatio = false;
/* In the following section, getScreenWidth() is multiplied by 0.5 as the posters
are 25vw and we need double the resolution to counter Skia's scaling. */
// TODO: Find a reliable way to get the poster width
if (imageTags.Primary) {
url = apiClient.getScaledImageUrl(item.Id, {
type: 'Primary',
maxWidth: Math.round(dom.getScreenWidth() * 0.5),
tag: item.ImageTags.Primary
});
detectRatio = true;
} else if (item.BackdropImageTags && item.BackdropImageTags.length) {
url = apiClient.getScaledImageUrl(item.Id, {
type: 'Backdrop',
maxWidth: Math.round(dom.getScreenWidth() * 0.5),
tag: item.BackdropImageTags[0]
});
shape = 'thumb';
} else if (imageTags.Thumb) {
url = apiClient.getScaledImageUrl(item.Id, {
type: 'Thumb',
maxWidth: Math.round(dom.getScreenWidth() * 0.5),
tag: item.ImageTags.Thumb
});
shape = 'thumb';
} else if (imageTags.Disc) {
url = apiClient.getScaledImageUrl(item.Id, {
type: 'Disc',
maxWidth: Math.round(dom.getScreenWidth() * 0.5),
tag: item.ImageTags.Disc
});
shape = 'square';
} else if (item.AlbumId && item.AlbumPrimaryImageTag) {
url = apiClient.getScaledImageUrl(item.AlbumId, {
type: 'Primary',
maxWidth: Math.round(dom.getScreenWidth() * 0.5),
tag: item.AlbumPrimaryImageTag
});
shape = 'square';
} else if (item.SeriesId && item.SeriesPrimaryImageTag) {
url = apiClient.getScaledImageUrl(item.SeriesId, {
type: 'Primary',
maxWidth: Math.round(dom.getScreenWidth() * 0.5),
tag: item.SeriesPrimaryImageTag
});
} else if (item.ParentPrimaryImageItemId && item.ParentPrimaryImageTag) {
url = apiClient.getScaledImageUrl(item.ParentPrimaryImageItemId, {
type: 'Primary',
maxWidth: Math.round(dom.getScreenWidth() * 0.5),
tag: item.ParentPrimaryImageTag
function renderDetailImage(elem, item, imageLoader) {
const itemArray = [];
itemArray.push(item);
const cardHtml = cardBuilder.getCardsHtml(itemArray, {
shape: 'auto',
showTitle: false,
centerText: true,
overlayText: false,
transition: false,
disableIndicators: true,
disableHoverMenu: true,
overlayPlayButton: true,
width: dom.getWindowSize().innerWidth * 0.25
});
elem.innerHTML = cardHtml;
imageLoader.lazyChildren(elem);
}
if (editable && url === undefined) {
html += "<a class='itemDetailGalleryLink itemDetailImage defaultCardBackground defaultCardBackground" + cardBuilder.getDefaultBackgroundClass(item.Name) + "' is='emby-linkbutton' style='display:block;margin:0;padding:0;' href='#'>";
} else if (!editable && url === undefined) {
html += "<div class='itemDetailGalleryLink itemDetailImage defaultCardBackground defaultCardBackground" + cardBuilder.getDefaultBackgroundClass(item.Name) + "' is='emby-linkbutton' style='display:block;margin:0;padding:0;' href='#'>";
} else if (editable) {
html += "<a class='itemDetailGalleryLink' is='emby-linkbutton' style='display:block;margin:0;padding:0;' href='#'>";
}
if (url) {
html += "<img class='itemDetailImage lazy' src='data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=' />";
}
if (url === undefined) {
html += cardBuilder.getDefaultText(item);
}
if (editable) {
html += '</a>';
} else if (!editable && url === undefined) {
html += '</div>';
}
var progressHtml = item.IsFolder || !item.UserData ? '' : indicators.getProgressBarHtml(item);
html += '<div class="detailImageProgressContainer">';
if (progressHtml) {
html += progressHtml;
}
html += '</div>';
elem.innerHTML = html;
if (detectRatio && item.PrimaryImageAspectRatio) {
if (item.PrimaryImageAspectRatio >= 1.48) {
shape = 'thumb';
} else if (item.PrimaryImageAspectRatio >= 0.85 && item.PrimaryImageAspectRatio <= 1.34) {
shape = 'square';
}
}
if ('thumb' == shape) {
elem.classList.add('thumbDetailImageContainer');
elem.classList.remove('portraitDetailImageContainer');
elem.classList.remove('squareDetailImageContainer');
} else if ('square' == shape) {
elem.classList.remove('thumbDetailImageContainer');
elem.classList.remove('portraitDetailImageContainer');
elem.classList.add('squareDetailImageContainer');
} else {
elem.classList.remove('thumbDetailImageContainer');
elem.classList.add('portraitDetailImageContainer');
elem.classList.remove('squareDetailImageContainer');
}
if (url) {
imageLoader.lazyImage(elem.querySelector('img'), url);
}
}
function renderImage(page, item, apiClient, user) {
function renderImage(page, item) {
renderDetailImage(
page,
page.querySelector('.detailImageContainer'),
item,
apiClient,
user.Policy.IsAdministrator && 'Photo' != item.MediaType,
imageLoader,
indicators
imageLoader
);
}
@ -985,54 +851,41 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
}
function renderOverview(elems, item) {
for (var i = 0, length = elems.length; i < length; i++) {
var elem = elems[i];
function renderOverview(page, item) {
for (const overviewElemnt of page.querySelectorAll('.overview')) {
var overview = item.Overview || '';
if (overview) {
elem.innerHTML = overview;
elem.classList.remove('hide');
elem.classList.add('detail-clamp-text');
overviewElemnt.innerHTML = overview;
overviewElemnt.classList.remove('hide');
overviewElemnt.classList.add('detail-clamp-text');
// Grab the sibling element to control the expand state
var expandButton = elem.parentElement.querySelector('.overview-expand');
var expandButton = overviewElemnt.parentElement.querySelector('.overview-expand');
// Detect if we have overflow of text. Based on this StackOverflow answer
// https://stackoverflow.com/a/35157976
if (Math.abs(elem.scrollHeight - elem.offsetHeight) > 2) {
if (Math.abs(overviewElemnt.scrollHeight - overviewElemnt.offsetHeight) > 2) {
expandButton.classList.remove('hide');
} else {
expandButton.classList.add('hide');
}
expandButton.addEventListener('click', toggleLineClamp.bind(null, elem));
expandButton.addEventListener('click', toggleLineClamp.bind(null, overviewElemnt));
var anchors = elem.querySelectorAll('a');
for (var j = 0, length2 = anchors.length; j < length2; j++) {
anchors[j].setAttribute('target', '_blank');
for (const anchor of overviewElemnt.querySelectorAll('a')) {
anchor.setAttribute('target', '_blank');
}
} else {
elem.innerHTML = '';
elem.classList.add('hide');
overviewElemnt.innerHTML = '';
overviewElemnt.classList.add('hide');
}
}
}
function renderGenres(page, item, context) {
context = context || inferContext(item);
var type;
function renderGenres(page, item, context = inferContext(item)) {
var genres = item.GenreItems || [];
switch (context) {
case 'music':
type = 'MusicGenre';
break;
default:
type = 'Genre';
}
var type = context === 'music' ? 'MusicGenre' : 'Genre';
var html = genres.map(function (p) {
return '<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + appRouter.getRouteUrl({
@ -1058,19 +911,49 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
}
function renderDirector(page, item, context) {
var directors = (item.People || []).filter(function (p) {
return 'Director' === p.Type;
function renderWriter(page, item, context) {
var writers = (item.People || []).filter(function (person) {
return person.Type === 'Writer';
});
var html = directors.map(function (p) {
var html = writers.map(function (person) {
return '<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + appRouter.getRouteUrl({
Name: p.Name,
Name: person.Name,
Type: 'Person',
ServerId: item.ServerId,
Id: p.Id
Id: person.Id
}, {
context: context
}) + '">' + p.Name + '</a>';
}) + '">' + person.Name + '</a>';
}).join(', ');
var writersLabel = page.querySelector('.writersLabel');
writersLabel.innerHTML = globalize.translate(writers.length > 1 ? 'Writers' : 'Writer');
var writersValue = page.querySelector('.writers');
writersValue.innerHTML = html;
var writersGroup = page.querySelector('.writersGroup');
if (writers.length) {
writersGroup.classList.remove('hide');
} else {
writersGroup.classList.add('hide');
}
}
function renderDirector(page, item, context) {
var directors = (item.People || []).filter(function (person) {
return person.Type === 'Director';
});
var html = directors.map(function (person) {
return '<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + appRouter.getRouteUrl({
Name: person.Name,
Type: 'Person',
ServerId: item.ServerId,
Id: person.Id
}, {
context: context
}) + '">' + person.Name + '</a>';
}).join(', ');
var directorsLabel = page.querySelector('.directorsLabel');
@ -1086,13 +969,39 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
}
function renderDetails(page, item, apiClient, context, isStatic) {
renderSimilarItems(page, item, context);
renderMoreFromSeason(page, item, apiClient);
renderMoreFromArtist(page, item, apiClient);
renderDirector(page, item, context);
renderGenres(page, item, context);
renderChannelGuide(page, apiClient, item);
function renderMiscInfo(page, item) {
const primaryItemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary');
for (const miscInfo of primaryItemMiscInfo) {
mediaInfo.fillPrimaryMediaInfo(miscInfo, item, {
interactive: true,
episodeTitle: false,
subtitles: false
});
if (miscInfo.innerHTML && 'SeriesTimer' !== item.Type) {
miscInfo.classList.remove('hide');
} else {
miscInfo.classList.add('hide');
}
}
const secondaryItemMiscInfo = page.querySelectorAll('.itemMiscInfo-secondary');
for (const miscInfo of secondaryItemMiscInfo) {
mediaInfo.fillSecondaryMediaInfo(miscInfo, item, {
interactive: true
});
if (miscInfo.innerHTML && 'SeriesTimer' !== item.Type) {
miscInfo.classList.remove('hide');
} else {
miscInfo.classList.add('hide');
}
}
}
function renderTagline(page, item) {
var taglineElement = page.querySelector('.tagline');
if (item.Taglines && item.Taglines.length) {
@ -1101,44 +1010,21 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
} else {
taglineElement.classList.add('hide');
}
var overview = page.querySelector('.overview');
var externalLinksElem = page.querySelector('.itemExternalLinks');
renderOverview([overview], item);
var i;
var itemMiscInfo;
itemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary');
for (i = 0; i < itemMiscInfo.length; i++) {
mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, {
interactive: true,
episodeTitle: false,
subtitles: false
});
if (itemMiscInfo[i].innerHTML && 'SeriesTimer' !== item.Type) {
itemMiscInfo[i].classList.remove('hide');
} else {
itemMiscInfo[i].classList.add('hide');
}
}
itemMiscInfo = page.querySelectorAll('.itemMiscInfo-secondary');
for (i = 0; i < itemMiscInfo.length; i++) {
mediaInfo.fillSecondaryMediaInfo(itemMiscInfo[i], item, {
interactive: true
});
if (itemMiscInfo[i].innerHTML && 'SeriesTimer' !== item.Type) {
itemMiscInfo[i].classList.remove('hide');
} else {
itemMiscInfo[i].classList.add('hide');
}
}
function renderDetails(page, item, apiClient, context, isStatic) {
renderSimilarItems(page, item, context);
renderMoreFromSeason(page, item, apiClient);
renderMoreFromArtist(page, item, apiClient);
renderDirector(page, item, context);
renderWriter(page, item, context);
renderGenres(page, item, context);
renderChannelGuide(page, apiClient, item);
renderTagline(page, item);
renderOverview(page, item);
renderMiscInfo(page, item);
reloadUserDataButtons(page, item);
renderLinks(externalLinksElem, item);
renderLinks(page, item);
renderTags(page, item);
renderSeriesAirTime(page, item, isStatic);
}
@ -1426,8 +1312,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
action: 'playallfromhere',
image: false,
artist: 'auto',
containerAlbumArtists: item.AlbumArtists,
addToListButton: true
containerAlbumArtists: item.AlbumArtists
});
isList = true;
} else if ('Series' == item.Type) {
@ -1469,11 +1354,12 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
items: result.Items,
showIndexNumber: false,
enableOverview: true,
enablePlayedButton: layoutManager.mobile ? false : true,
infoButton: layoutManager.mobile ? false : true,
imageSize: 'large',
enableSideMediaInfo: false,
highlight: false,
action: layoutManager.tv ? 'resume' : 'none',
infoButton: true,
imagePlayButton: true,
includeParentInfoInTitle: false
});
@ -1500,6 +1386,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
childrenItemsContainer.classList.remove('vertical-list');
}
}
if (layoutManager.mobile) {
childrenItemsContainer.classList.remove('padded-right');
}
childrenItemsContainer.innerHTML = html;
imageLoader.lazyChildren(childrenItemsContainer);
if ('BoxSet' == item.Type) {
@ -1701,12 +1590,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function renderCollectionItems(page, parentItem, types, items) {
page.querySelector('.collectionItems').classList.remove('hide');
page.querySelector('.collectionItems').innerHTML = '';
var i;
var length;
for (i = 0, length = types.length; i < length; i++) {
var type = types[i];
for (const type of types) {
var typeItems = filterItemsByCollectionItemType(items, type);
if (typeItems.length) {
@ -1739,8 +1626,8 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
renderChildren(page, parentItem);
};
for (i = 0, length = containers.length; i < length; i++) {
containers[i].notifyRefreshNeeded = notifyRefreshNeeded;
for (const container of containers) {
container.notifyRefreshNeeded = notifyRefreshNeeded;
}
// if nothing in the collection can be played hide play and shuffle buttons
@ -1876,7 +1763,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
function renderCast(page, item) {
var people = (item.People || []).filter(function (p) {
return 'Director' !== p.Type;
return p.Type === 'Actor';
});
if (!people.length) {
@ -1905,12 +1792,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
}
function bindAll(view, selector, eventName, fn) {
var i;
var length;
var elems = view.querySelectorAll(selector);
for (i = 0, length = elems.length; i < length; i++) {
elems[i].addEventListener(eventName, fn);
for (const elem of elems) {
elem.addEventListener(eventName, fn);
}
}
@ -1923,13 +1808,14 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
return function (view, params) {
function reload(instance, page, params) {
loading.show();
var apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient;
var promises = [getPromise(apiClient, params), apiClient.getCurrentUser()];
Promise.all(promises).then(function (responses) {
var item = responses[0];
var user = responses[1];
Promise.all([getPromise(apiClient, params), apiClient.getCurrentUser()]).then(([item, user]) => {
currentItem = item;
reloadFromItem(instance, page, params, item, user);
}).catch((error) => {
console.error('failed to get item or current user: ', error);
});
}
@ -1980,7 +1866,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
});
}
playItem(item, item.UserData && 'resume' === mode ? item.UserData.PlaybackPositionTicks : 0);
playItem(item, item.UserData && mode === 'resume' ? item.UserData.PlaybackPositionTicks : 0);
}
function onPlayClick() {
@ -1995,15 +1881,6 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
playbackManager.shuffle(currentItem);
}
function onDeleteClick() {
require(['deleteHelper'], function (deleteHelper) {
deleteHelper.deleteItem({
item: currentItem,
navigate: true
});
});
}
function onCancelSeriesTimerClick() {
require(['recordingHelper'], function (recordingHelper) {
recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () {
@ -2092,7 +1969,6 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
bindAll(view, '.btnPlayTrailer', 'click', onPlayTrailerClick);
bindAll(view, '.btnCancelSeriesTimer', 'click', onCancelSeriesTimerClick);
bindAll(view, '.btnCancelTimer', 'click', onCancelTimerClick);
bindAll(view, '.btnDeleteItem', 'click', onDeleteClick);
bindAll(view, '.btnDownload', 'click', onDownloadClick);
view.querySelector('.trackSelections').addEventListener('submit', onTrackSelectionsSubmit);
view.querySelector('.btnSplitVersions').addEventListener('click', function () {
@ -2125,9 +2001,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
view.addEventListener('viewshow', function (e) {
var page = this;
if (layoutManager.mobile) {
libraryMenu.setTransparentMenu(true);
}
if (e.detail.isRestored) {
if (currentItem) {

View file

@ -333,13 +333,21 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
osdPoster.innerHTML = '';
}
let osdLockCount = 0;
function showOsd() {
slideDownToShow(headerElement);
showMainOsdControls();
if (!osdLockCount) {
startOsdHideTimer();
}
}
function hideOsd() {
if (osdLockCount) {
return;
}
slideUpToHide(headerElement);
hideMainOsdControls();
}
@ -352,6 +360,19 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
}
}
function lockOsd() {
osdLockCount++;
stopOsdHideTimer();
}
function unlockOsd() {
osdLockCount--;
// Restart hide timer if OSD is currently visible
if (currentVisibleMenu && !osdLockCount) {
startOsdHideTimer();
}
}
function startOsdHideTimer() {
stopOsdHideTimer();
osdHideTimeout = setTimeout(hideOsd, 3e3);
@ -1080,7 +1101,7 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
*/
var clickedElement;
function onWindowKeyDown(e) {
function onKeyDown(e) {
clickedElement = e.srcElement;
var key = keyboardnavigation.getKeyName(e);
@ -1194,12 +1215,29 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
}
}
function onKeyDownCapture() {
// Restart hide timer if OSD is currently visible
if (currentVisibleMenu) {
showOsd();
}
}
function onWindowMouseDown(e) {
clickedElement = e.srcElement;
lockOsd();
}
function onWindowMouseUp() {
unlockOsd();
}
function onWindowTouchStart(e) {
clickedElement = e.srcElement;
lockOsd();
}
function onWindowTouchEnd() {
unlockOsd();
}
function getImgUrl(item, chapter, index, maxWidth, apiClient) {
@ -1312,9 +1350,11 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
var headerElement = document.querySelector('.skinHeader');
var osdBottomElement = document.querySelector('.videoOsdBottom-maincontrols');
nowPlayingPositionSlider.enableKeyboardDragging();
nowPlayingVolumeSlider.enableKeyboardDragging();
if (layoutManager.tv) {
nowPlayingPositionSlider.classList.add('focusable');
nowPlayingPositionSlider.enableKeyboardDragging();
}
view.addEventListener('viewbeforeshow', function (e) {
@ -1330,18 +1370,27 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
});
showOsd();
inputManager.on(window, onInputCommand);
dom.addEventListener(window, 'keydown', onWindowKeyDown, {
document.addEventListener('keydown', onKeyDown);
dom.addEventListener(document, 'keydown', onKeyDownCapture, {
capture: true
});
dom.addEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
passive: true
});
dom.addEventListener(window, window.PointerEvent ? 'pointerup' : 'mouseup', onWindowMouseUp, {
passive: true
});
dom.addEventListener(window, 'touchstart', onWindowTouchStart, {
passive: true
});
['touchend', 'touchcancel'].forEach((event) => {
dom.addEventListener(window, event, onWindowTouchEnd, {
passive: true
});
});
} catch (e) {
require(['appRouter'], function(appRouter) {
appRouter.showDirect('/');
appRouter.goHome();
});
}
});
@ -1350,15 +1399,24 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
statsOverlay.enabled(false);
}
dom.removeEventListener(window, 'keydown', onWindowKeyDown, {
document.removeEventListener('keydown', onKeyDown);
dom.removeEventListener(document, 'keydown', onKeyDownCapture, {
capture: true
});
dom.removeEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
passive: true
});
dom.removeEventListener(window, window.PointerEvent ? 'pointerup' : 'mouseup', onWindowMouseUp, {
passive: true
});
dom.removeEventListener(window, 'touchstart', onWindowTouchStart, {
passive: true
});
['touchend', 'touchcancel'].forEach((event) => {
dom.removeEventListener(window, event, onWindowTouchEnd, {
passive: true
});
});
stopOsdHideTimer();
headerElement.classList.remove('osdHeader');
headerElement.classList.remove('osdHeader-hidden');
@ -1447,16 +1505,13 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
}, options);
}
function setVolume() {
playbackManager.setVolume(this.value, currentPlayer);
}
view.querySelector('.buttonMute').addEventListener('click', function () {
playbackManager.toggleMute(currentPlayer);
});
nowPlayingVolumeSlider.addEventListener('change', setVolume);
nowPlayingVolumeSlider.addEventListener('mousemove', setVolume);
nowPlayingVolumeSlider.addEventListener('touchmove', setVolume);
nowPlayingVolumeSlider.addEventListener('input', (e) => {
playbackManager.setVolume(e.target.value, currentPlayer);
});
nowPlayingPositionSlider.addEventListener('change', function () {
var player = currentPlayer;

View file

@ -6,7 +6,7 @@
justify-content: center;
min-width: 104px;
min-height: 24px;
padding-top: 1.25em;
padding-top: 0.85em;
z-index: 1;
color: #fff;
display: flex;

View file

@ -649,7 +649,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
function setTrackEventsSubtitleOffset(trackEvents, offsetValue) {
if (Array.isArray(trackEvents)) {
offsetValue = updateCurrentTrackOffset(offsetValue);
offsetValue = updateCurrentTrackOffset(offsetValue) * 1e7; // ticks
trackEvents.forEach(function(trackEvent) {
trackEvent.StartPositionTicks -= offsetValue;
trackEvent.EndPositionTicks -= offsetValue;

View file

@ -211,7 +211,7 @@
'MozAnimation': 'animationend',
'WebkitAnimation': 'webkitAnimationEnd'
};
for (let t in animations) {
for (const t in animations) {
if (el.style[t] !== undefined) {
_animationEvent = animations[t];
return animations[t];
@ -251,7 +251,7 @@
'MozTransition': 'transitionend',
'WebkitTransition': 'webkitTransitionEnd'
};
for (let t in transitions) {
for (const t in transitions) {
if (el.style[t] !== undefined) {
_transitionEvent = transitions[t];
return transitions[t];

View file

@ -71,12 +71,12 @@ define(['connectionManager', 'listView', 'cardBuilder', 'imageLoader', 'libraryB
html += '<div class="' + sectionClass + '" data-type="' + section.type + '">';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">';
html += '<h2 class="sectionTitle sectionTitle-cards">';
html += section.name;
html += '</h2>';
html += '<a is="emby-linkbutton" href="#" class="clearLink hide" style="margin-left:1em;vertical-align:middle;"><button is="emby-button" type="button" class="raised more raised-mini noIcon">' + globalize.translate('ButtonMore') + '</button></a>';
html += '</div>';
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right">';
html += '<div is="emby-itemscontainer" class="itemsContainer padded-right">';
html += '</div>';
return html += '</div>';
}).join('');

View file

@ -78,7 +78,7 @@ export function isNavigationKey(key) {
}
export function enable() {
document.addEventListener('keydown', function (e) {
window.addEventListener('keydown', function (e) {
const key = getKeyName(e);
// Ignore navigation keys for non-TV

View file

@ -13,7 +13,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
html += '<div class="headerRight">';
html += '<span class="headerSelectedPlayer"></span>';
html += `<button is="paper-icon-button-light" class="headerSyncButton syncButton headerButton headerButtonRight hide" title="${globalize.translate('ButtonSyncPlay')}"><span class="material-icons sync_disabled"></span></button>`;
html += '<button is="paper-icon-button-light" class="headerAudioPlayerButton audioPlayerButton headerButton headerButtonRight hide"><span class="material-icons music_note"></span></button>';
html += `<button is="paper-icon-button-light" class="headerAudioPlayerButton audioPlayerButton headerButton headerButtonRight hide" title="${globalize.translate('ButtonPlayer')}"><span class="material-icons music_note"></span></button>`;
html += `<button is="paper-icon-button-light" class="headerCastButton castButton headerButton headerButtonRight hide" title="${globalize.translate('ButtonCast')}"><span class="material-icons cast"></span></button>`;
html += `<button type="button" is="paper-icon-button-light" class="headerButton headerButtonRight headerSearchButton hide" title="${globalize.translate('ButtonSearch')}"><span class="material-icons search"></span></button>`;
html += '<button is="paper-icon-button-light" class="headerButton headerButtonRight headerUserButton hide"><span class="material-icons person"></span></button>';

View file

@ -15,7 +15,7 @@ define([
'detailtablecss'], function () {
function defineRoute(newRoute) {
var path = newRoute.path;
var path = newRoute.alias ? newRoute.alias : newRoute.path;
console.debug('defining route: ' + path);
newRoute.dictionary = 'core';
Emby.Page.addRoute(path, newRoute);
@ -240,8 +240,9 @@ define([
transition: 'fade'
});
defineRoute({
path: '/itemdetails.html',
controller: 'itemDetails',
alias: '/details',
path: '/controllers/itemDetails/index.html',
controller: 'itemDetails/index',
autoFocus: false,
transition: 'fade'
});

View file

@ -1038,7 +1038,7 @@ var AppInfo = {};
}
if ('SeriesTimer' == itemType) {
return 'itemdetails.html?seriesTimerId=' + id + '&serverId=' + serverId;
return 'details?seriesTimerId=' + id + '&serverId=' + serverId;
}
if ('livetv' == item.CollectionType) {
@ -1108,13 +1108,13 @@ var AppInfo = {};
var itemTypes = ['Playlist', 'TvChannel', 'Program', 'BoxSet', 'MusicAlbum', 'MusicGenre', 'Person', 'Recording', 'MusicArtist'];
if (itemTypes.indexOf(itemType) >= 0) {
return 'itemdetails.html?id=' + id + '&serverId=' + serverId;
return 'details?id=' + id + '&serverId=' + serverId;
}
var contextSuffix = context ? '&context=' + context : '';
if ('Series' == itemType || 'Season' == itemType || 'Episode' == itemType) {
return 'itemdetails.html?id=' + id + contextSuffix + '&serverId=' + serverId;
return 'details?id=' + id + contextSuffix + '&serverId=' + serverId;
}
if (item.IsFolder) {
@ -1125,7 +1125,7 @@ var AppInfo = {};
return '#';
}
return 'itemdetails.html?id=' + id + '&serverId=' + serverId;
return 'details?id=' + id + '&serverId=' + serverId;
};
appRouter.showItem = showItem;

View file

@ -1151,5 +1151,6 @@
"DisplayInOtherHomeScreenSections": "عرض في أقسام الشاشة الرئيسية مثل أحدث الوسائط واستمر في المشاهدة",
"DisplayInMyMedia": "عرض على الشاشة الرئيسية",
"Display": "عرض",
"Dislike": "لم يعجبنى"
"Dislike": "لم يعجبنى",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -19,5 +19,6 @@
"ThisWizardWillGuideYou": "Гэты памочнік правядзе вас праз усе фазы ўстаноўкі і налады. Спачатку абярыце упадабаную мову.",
"UserProfilesIntro": "У Jellyfin існуе ўбудаваная падтрымка для карыстальніцкіх профіляў, дазваляючы кожнаму карыстальніку валодаць сваімі ўласнымі параметрамі адлюстравання, станам прайгравання і кіраваннем ўтрымання.",
"WelcomeToProject": "Пачатак працы ў Jellyfin!",
"WizardCompleted": "Гэта ўсё, што нам трэба зараз. Jellyfin пачынае збіраць звесткі аб вашай медыятэцы. Азнаёмцеся пакуль з некаторымі нашымі праграмамі, а затым націсніце <b>Гатова</b>, каб праглядзець <b>Инфопанель сервера</b>."
"WizardCompleted": "Гэта ўсё, што нам трэба зараз. Jellyfin пачынае збіраць звесткі аб вашай медыятэцы. Азнаёмцеся пакуль з некаторымі нашымі праграмамі, а затым націсніце <b>Гатова</b>, каб праглядзець <b>Инфопанель сервера</b>.",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1382,7 +1382,7 @@
"MessagePleaseWait": "Моля,изчакайте. Това може да отнеме минута.",
"MessagePlayAccessRestricted": "Възпроизвеждането на това съдържание в момента е ограничено.Моля, свържете се с администратора на вашия сървър за повече информация.",
"MessagePasswordResetForUsers": "Следните потребители са занулили паролите си.Те вече могат да влязат с пин кодовете, използвани за извършване на нулирането.",
"MessageNoTrailersFound": "Не са намерени трейлъри.За да подобрите филмовото изживяване инсталирайте канал за трейлъри,може да подредите няколко канала в библиотека.",
"MessageNoTrailersFound": "За да подобрите филмовото изживяване инсталирайте канал за трейлъри,може да подредите няколко канала в библиотека.",
"MessageNoServersAvailable": "Не са намерени сървъри, използващи функцията за автоматично откриване на сървър.",
"MessageNoMovieSuggestionsAvailable": "Понастоящем няма предложени филми. Започнете да гледате и оценявате филмите си, а след това се върнете, за да видите препоръките си.",
"MessageNoCollectionsAvailable": "Колекциите ви позволяват да се наслаждавате на персонализирани групи от филми, сериали и албуми. Кликнете върху бутона +, за да започнете да създавате колекции.",
@ -1551,5 +1551,20 @@
"LabelSonyAggregationFlagsHelp": "Определя съдържанието на aggregationFlags елемента във urn:schemas-sonycom:av пространство от имена.",
"LabelXDlnaDocHelp": "Определя съдържанието на X_DLNADOC елемента в urn:schemas-dlna-org:device-1-0 пространство от имена.",
"LabelSkipForwardLength": "Време за придвижване напред:",
"LabelSkipBackLength": "Време за придвижване назад:"
"LabelSkipBackLength": "Време за придвижване назад:",
"LabelRepositoryUrlHelp": "Местоположението на манифеста на хранилището, което искате да включите.",
"MessageNoGenresAvailable": "Доставчиците на метаданни ще могат да изтеглят жанрове от интернет.",
"MessageAddRepository": "Ако искате да добавите хранилище, щракнете върху бутона до заглавната част и попълнете исканата информация.",
"LabelRepositoryNameHelp": "Персонализирано име за разграничаване на това хранилище от всички останали добавени към вашия сървър.",
"LabelRepositoryName": "Име на хранилището",
"LabelRepositoryUrl": "Адрес на хранилището",
"HeaderNewRepository": "Ново хранилище",
"MessageNoRepositories": "Няма хранилища.",
"EnableFasterAnimationsHelp": "Използвайте по-бързи анимации и преходи",
"EnableFasterAnimations": "Бързи анимации",
"EnableDecodingColorDepth10Vp9": "Включи 10 битово хардуерно декодиране за VP9",
"EnableDecodingColorDepth10Hevc": "Включи 10 битово хардуерно декодиране за HEVC",
"ButtonCast": "Стриймване",
"ButtonSyncPlay": "SyncPlay",
"TabRepositories": "Хранилища"
}

View file

@ -818,5 +818,6 @@
"AllowFfmpegThrottling": "Transcodes de lacceleració",
"AllowOnTheFlySubtitleExtractionHelp": "Els subtítols incrustats es poden extreure de vídeos i entregar-los a clients en text senzill per tal d'evitar la transcodificació de vídeo. En alguns sistemes, això pot trigar molt i fer que la reproducció de vídeo saturi durant el procés dextracció. Desactiveu-ho per tenir subtítols incrustats incrustats amb la transcodificació de vídeo quan no són compatibles amb el dispositiu client de forma nativa.",
"AlbumArtist": "Album artista",
"Album": "Album"
"Album": "Album",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1200,7 +1200,7 @@
"Wednesday": "Středa",
"WelcomeToProject": "Vítejte v Jellyfin!",
"WizardCompleted": "To je zatím vše, co potřebujeme. Server Jellyfin začal shromažďovat informace o vaší knihovně médií. Vyzkoušejte některé z našich aplikací a potom klikněte na tlačítko <b> Dokončit </b> pro zobrazení <b>nástěnky</b>.",
"Writer": "Napsal",
"Writer": "Scénárista",
"XmlDocumentAttributeListHelp": "Tyto atributy jsou použity na kořenový prvek každé XML odpovědi.",
"XmlTvKidsCategoriesHelp": "Programy s těmito kategoriemi budou zobrazeny jako programy pro děti. Více kategorií oddělte \"|\".",
"XmlTvMovieCategoriesHelp": "Programy s těmito kategoriemi budou zobrazeny jako filmy. Více kategorií oddělte \"|\".",
@ -1231,7 +1231,7 @@
"AutoBasedOnLanguageSetting": "Automaticky (na základě jazykového nastavení)",
"Banner": "Výřez plakátu",
"BestFit": "Nejvhodnější",
"Blacklist": "Černá listina",
"Blacklist": "Zakázat vše kromě výjimek",
"BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)",
"Browse": "Procházet",
"BurnSubtitlesHelp": "Určuje, zda má server při překódování videa vypálit titulky do obrazu. Tato funkce má velký negativní vliv na výkon. Chcete-li vypálit grafické formáty titulků (VOBSUB, PGS, SUB, IDX, atd.) a některé titulky ASS nebo SSA, vyberte možnost Automaticky.",
@ -1488,7 +1488,7 @@
"Vertical": "Svisle",
"VideoRange": "Rozsah videa",
"ViewPlaybackInfo": "Zobrazení informací o přehrávání",
"Whitelist": "Bílá listina",
"Whitelist": "Povolit vše kromě výjimek",
"HeaderHome": "Domů",
"DashboardOperatingSystem": "Operační systém: {0}",
"DashboardArchitecture": "Architektura: {0}",
@ -1635,7 +1635,7 @@
"EnableBlurhashHelp": "Nenačtené obrázky budou zobrazeny pomocí neurčitých zástupných obrázků",
"EnableBlurhash": "Povolit zástupné obrázky",
"ButtonCast": "Přehrát v zařízení",
"ButtonSyncPlay": "Synchronizace přehrávání",
"ButtonSyncPlay": "SyncPlay",
"MessageNoGenresAvailable": "Povolit některým poskytovatelům metadat stahovat informace o žánrech z Internetu.",
"EnableFasterAnimationsHelp": "Použít rychlejší animace a přechody",
"EnableFasterAnimations": "Rychlejší animace",
@ -1648,5 +1648,7 @@
"LabelRepositoryUrlHelp": "Umístění manifestu repozitáře, který chcete zahrnout.",
"LabelRepositoryUrl": "URL adresa repozitáře",
"HeaderNewRepository": "Nový repozitář",
"MessageNoRepositories": "Neexistují žádné repozitáře."
"MessageNoRepositories": "Neexistují žádné repozitáře.",
"ButtonPlayer": "Přehrávač",
"Writers": "Scénáristé"
}

View file

@ -1608,5 +1608,6 @@
"Filter": "Filtrer",
"New": "Nye",
"ButtonTogglePlaylist": "Spilleliste",
"ButtonToggleContextMenu": "Mere"
"ButtonToggleContextMenu": "Mere",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1234,5 +1234,6 @@
"AllowFfmpegThrottlingHelp": "Όταν ένας διακωδικοποιητής ή remux φτάσει αρκετά μπροστά από την τρέχουσα θέση αναπαραγωγής, διακόψτε τη διαδικασία ώστε να καταναλώσει λιγότερους πόρους. Αυτό είναι πιο χρήσιμο όταν παρακολουθείτε χωρίς να αναζητάτε συχνά. Απενεργοποιήστε το εάν αντιμετωπίζετε προβλήματα αναπαραγωγής.",
"ButtonTogglePlaylist": "Λίστα αναπαραγωγής",
"ButtonToggleContextMenu": "Περισσότερα",
"ButtonSplit": "Διαχωρισμός"
"ButtonSplit": "Διαχωρισμός",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -63,7 +63,7 @@
"Alerts": "Alerts",
"All": "All",
"AllChannels": "All channels",
"AllComplexFormats": "All complex formats (ASS, SSA, VOBSUB, PGS, SUB/IDX, etc.)",
"AllComplexFormats": "All Complex Formats (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)",
"AllEpisodes": "All episodes",
"AllLanguages": "All languages",
"AllLibraries": "All libraries",
@ -71,7 +71,7 @@
"AllowMediaConversion": "Allow media conversion",
"AllowMediaConversionHelp": "Grant or deny access to the convert media feature.",
"AllowOnTheFlySubtitleExtraction": "Allow subtitle extraction on the fly",
"AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.",
"AllowOnTheFlySubtitleExtractionHelp": "Embedded subtitles can be extracted from videos and delivered to clients in plain text, in order to help prevent video transcoding. On some systems this can take a long time and cause video playback to stall during the extraction process. Disable this to have embedded subtitles burned in with video transcoding when they are not natively supported by the client device.",
"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.",
@ -79,7 +79,7 @@
"AlwaysPlaySubtitlesHelp": "Subtitles matching the language preference will be loaded regardless of the audio language.",
"AnyLanguage": "Any Language",
"Anytime": "Anytime",
"AroundTime": "Around {0}",
"AroundTime": "Around",
"Art": "Art",
"AsManyAsPossible": "As many as possible",
"Ascending": "Ascending",
@ -100,7 +100,7 @@
"Box": "Box",
"BoxRear": "Box (rear)",
"Browse": "Browse",
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX) and certain ASS or SSA subtitles.",
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX, …) and certain ASS or SSA subtitles.",
"ButtonAdd": "Add",
"ButtonAddMediaLibrary": "Add Media Library",
"ButtonAddScheduledTaskTrigger": "Add Trigger",
@ -719,7 +719,7 @@
"MessagePlayAccessRestricted": "Playback of this content is currently restricted. Please contact your server administrator for more information.",
"MessagePasswordResetForUsers": "The following users have had their passwords reset. They can now sign in with the pin codes that were used to perform the reset.",
"MessageNothingHere": "Nothing here.",
"MessageNoTrailersFound": "No trailers found. Install the Trailer channel to enhance your movie experience by adding a library of internet trailers.",
"MessageNoTrailersFound": "Install the trailers channel to enhance your movie experience by adding a library of internet trailers.",
"MessageNoServersAvailable": "No servers have been found using the automatic server discovery.",
"MessageNoMovieSuggestionsAvailable": "No movie suggestions are currently available. Start watching and rating your movies, and then come back to view your recommendations.",
"MessageNoAvailablePlugins": "No available plugins.",
@ -1245,7 +1245,7 @@
"LabelPasswordResetProvider": "Password Reset Provider:",
"LabelPasswordConfirm": "Password (confirm):",
"LabelOriginalTitle": "Original title:",
"LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Jellyfin apps on other devices to access media files directly.",
"LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Jellyfin apps on other devices to access media files directly. For example, {0} or {1}.",
"LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.",
"LabelNumberOfGuideDays": "Number of days of guide data to download:",
"LabelNumber": "Number:",
@ -1513,5 +1513,66 @@
"ButtonTogglePlaylist": "Playlist",
"ButtonToggleContextMenu": "More",
"HeaderDVR": "DVR",
"ApiKeysCaption": "List of the currently enabled API keys"
"ApiKeysCaption": "List of the currently enabled API keys",
"ButtonCast": "Cast",
"ButtonSyncPlay": "SyncPlay",
"EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder",
"EnableBlurhash": "Enable blurred placeholders for images",
"TabDVR": "DVR",
"TabRepositories": "Repositories",
"SyncPlayAccessHelp": "Select the level of access this user has to the SyncPlay feature. SyncPlay enables to sync playback with other devices.",
"ShowMore": "Show more",
"ShowLess": "Show less",
"SaveChanges": "Save changes",
"MessageSyncPlayErrorMedia": "Failed to enable SyncPlay! Media error.",
"MessageSyncPlayErrorMissingSession": "Failed to enable SyncPlay! Missing session.",
"MessageSyncPlayErrorNoActivePlayer": "No active player found. SyncPlay has been disabled.",
"MessageSyncPlayErrorAccessingGroups": "An error occurred while accessing groups list.",
"MessageSyncPlayLibraryAccessDenied": "Access to this content is restricted.",
"MessageSyncPlayJoinGroupDenied": "Permission required to use SyncPlay.",
"MessageSyncPlayCreateGroupDenied": "Permission required to create a group.",
"MessageSyncPlayGroupDoesNotExist": "Failed to join group because it does not exist.",
"MessageSyncPlayPlaybackPermissionRequired": "Playback permission required.",
"MessageSyncPlayNoGroupsAvailable": "No groups available. Start playing something first.",
"MessageSyncPlayGroupWait": "<b>{0}</b> is buffering...",
"MessageSyncPlayUserLeft": "<b>{0}</b> has left the group.",
"MessageSyncPlayUserJoined": "<b>{0}</b> has joined the group.",
"MessageSyncPlayDisabled": "SyncPlay disabled.",
"MessageSyncPlayEnabled": "SyncPlay enabled.",
"MessageNoGenresAvailable": "Enable some metadata providers to pull genres from the internet.",
"MessageAddRepository": "If you wish to add a repository, click the button next to the header and fill out the requested information.",
"LabelRepositoryNameHelp": "A custom name to distinguish this repository from any others added to your server.",
"LabelRepositoryName": "Repository Name",
"LabelRepositoryUrlHelp": "The location of the repository manifest you want to include.",
"LabelRepositoryUrl": "Repository URL",
"HeaderNewRepository": "New Repository",
"MessageNoRepositories": "No repositories.",
"LabelSyncPlayAccess": "SyncPlay access",
"LabelSyncPlayAccessNone": "Disabled for this user",
"LabelSyncPlayAccessJoinGroups": "Allow user to join groups",
"LabelSyncPlayAccessCreateAndJoinGroups": "Allow user to create and join groups",
"LabelSyncPlayLeaveGroupDescription": "Disable SyncPlay",
"LabelSyncPlayLeaveGroup": "Leave group",
"LabelSyncPlayNewGroupDescription": "Create a new group",
"LabelSyncPlayNewGroup": "New group",
"LabelSyncPlaySyncMethod": "Sync method:",
"LabelSyncPlayPlaybackDiff": "Playback time difference:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Time offset with the server:",
"LabelRequireHttpsHelp": "If checked, the server will automatically redirect all requests over HTTP to HTTPS. This has no effect if the server is not listening on HTTPS.",
"LabelRequireHttps": "Require HTTPS",
"LabelNightly": "Nightly",
"LabelStable": "Stable",
"LabelChromecastVersion": "Chromecast Version",
"LabelEnableHttpsHelp": "Enables the server to listen on the configured HTTPS port. A valid certificate must also be configured in order for this to take effect.",
"LabelEnableHttps": "Enable HTTPS",
"HeaderSyncPlayEnabled": "SyncPlay enabled",
"HeaderSyncPlaySelectGroup": "Join a group",
"HeaderServerAddressSettings": "Server Address Settings",
"HeaderRemoteAccessSettings": "Remote Access Settings",
"HeaderHttpsSettings": "HTTPS Settings",
"EnableDetailsBannerHelp": "Display a banner image at the top of the item details page.",
"EnableDetailsBanner": "Details Banner",
"EnableDecodingColorDepth10Vp9": "Enable 10-Bit hardware decoding for VP9",
"EnableDecodingColorDepth10Hevc": "Enable 10-Bit hardware decoding for HEVC"
}

View file

@ -1535,6 +1535,7 @@
"Whitelist": "Whitelist",
"WizardCompleted": "That's all we need for now. Jellyfin has begun collecting information about your media library. Check out some of our apps, and then click <b>Finish</b> to view the <b>Dashboard</b>.",
"Writer": "Writer",
"Writers": "Writers",
"XmlDocumentAttributeListHelp": "These attributes are applied to the root element of every XML response.",
"XmlTvKidsCategoriesHelp": "Programs with these categories will be displayed as programs for children. Separate multiple with '|'.",
"XmlTvMovieCategoriesHelp": "Programs with these categories will be displayed as movies. Separate multiple with '|'.",
@ -1561,5 +1562,6 @@
"EnableBlurhash": "Enable blurred placeholders for images",
"EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder",
"ButtonSyncPlay": "SyncPlay",
"ButtonCast": "Cast"
"ButtonCast": "Cast",
"ButtonPlayer": "Player"
}

View file

@ -1,5 +1,6 @@
{
"AddToCollection": "Aldoni al kolekto",
"Actor": "Aktoro",
"Absolute": "Absoluta"
"Absolute": "Absoluta",
"ButtonSyncPlay": "SyncPlay"
}

File diff suppressed because it is too large Load diff

View file

@ -1066,7 +1066,7 @@
"OptionReportByteRangeSeekingWhenTranscodingHelp": "Esto es requerido para algunos dispositivos que no pueden hacer búsquedas de tiempo muy bien.",
"OptionRequirePerfectSubtitleMatch": "Solo descargar subtítulos que coincidan perfectamente con mis archivos de video",
"OptionRequirePerfectSubtitleMatchHelp": "Solicitar una coincidencia perfecta filtrará los subtítulos para incluir solo aquellos que han sido probados y verificados exactamente con tu archivo de video. Desmarcar esta opción incrementará las probabilidades de que se descarguen subtítulos, pero incrementará las posibilidades de obtener subtítulos mal sincronizados o con texto incorrecto.",
"OptionResElement": "elemento res",
"OptionResElement": "Elemento res",
"OptionResumable": "Reanudable",
"OptionRuntime": "Duración",
"OptionSaturday": "Sábado",
@ -1424,7 +1424,7 @@
"ValueSeriesCount": "{0} series",
"Vertical": "Vertical",
"OptionThumb": "Miniatura",
"OptionThumbCard": "Tarjeta miniatura",
"OptionThumbCard": "Miniatura",
"HeaderFavoriteBooks": "Libros favoritos",
"LabelPleaseRestart": "Los cambios tendrán efecto después de recargar manualmente el cliente web.",
"LabelPlayMethod": "Método de reproducción:",
@ -1487,7 +1487,7 @@
"HeaderFavoritePeople": "Personas favoritas",
"Episode": "Episodio",
"ClientSettings": "Configuración del cliente",
"BoxSet": "Box Set",
"BoxSet": "Colección",
"AskAdminToCreateLibrary": "Pide a un administrador crear una biblioteca.",
"Artist": "Artista",
"AllowFfmpegThrottlingHelp": "Cuando una transcodificación o remuxeado se adelanta lo suficiente de la posición de reproducción actual, se pausa el proceso para que consuma menos recursos. Esto es más útil cuando se mira sin buscar con frecuencia. Apaga esto si experimentas problemas de reproducción.",
@ -1521,7 +1521,7 @@
"HeaderHttpsSettings": "Opciones HTTPS",
"HeaderDVR": "DVR",
"ApiKeysCaption": "Lista de claves API actualmente habilitadas",
"SyncPlayAccessHelp": "Selecciona el nivel de acceso que este usuario tiene a la función SyncPlay. SyncPlay permite sincronizar la reproducción con otros dispositivos.",
"SyncPlayAccessHelp": "Selecciona el nivel de acceso que este usuario tiene en la función SyncPlay. SyncPlay permite sincronizar la reproducción con otros dispositivos.",
"MessageSyncPlayErrorMedia": "¡Fallo al activar SyncPlay! Error en el archivo de medios.",
"MessageSyncPlayErrorMissingSession": "¡Fallo al activar SyncPlay! Falta la sesión.",
"MessageSyncPlayErrorNoActivePlayer": "No se ha encontrado ningún reproductor activo. SyncPlay ha sido desactivado.",
@ -1552,5 +1552,25 @@
"HeaderSyncPlayEnabled": "SyncPlay habilitado",
"HeaderSyncPlaySelectGroup": "Unirse a un grupo",
"EnableDetailsBannerHelp": "Mostrar una imagen banner en la parte superior de la página de detalles del elemento.",
"EnableDetailsBanner": "Banner de detalles"
"EnableDetailsBanner": "Banner de detalles",
"ButtonSyncPlay": "SyncPlay",
"ButtonPlayer": "Reproductor",
"ButtonCast": "Elenco",
"EnableBlurhashHelp": "Imágenes que aún están siendo cargadas serán mostradas difuminadas",
"EnableBlurhash": "Habilitar imágenes de fondo difuminadas",
"TabRepositories": "Repositorios",
"ShowMore": "Mostrar más",
"ShowLess": "Mostrar menos",
"MessageNoGenresAvailable": "Habilitar algunos proveedores de metadatos para traer los generos desde internet.",
"MessageAddRepository": "Si desea agregar un repositorio, haz click en el botón junto al encabezado y completa la información requerida.",
"LabelRepositoryNameHelp": "Un nombre personalizado para distinguir este repositorio de otros añadidos a tu servidor.",
"LabelRepositoryName": "Nombre del repositorio",
"LabelRepositoryUrlHelp": "La ubicación del repositorio que desea agregar.",
"LabelRepositoryUrl": "URL del repositorio",
"HeaderNewRepository": "Nuevo repositorio",
"MessageNoRepositories": "Sin repositorios.",
"EnableFasterAnimationsHelp": "Usar animaciones y transiciones más rapidas",
"EnableFasterAnimations": "Animaciones más rápidas",
"EnableDecodingColorDepth10Vp9": "Habilitar la decodificación por hardware de 10 bit para VP9",
"EnableDecodingColorDepth10Hevc": "Habilitar la decodificación por hardware de 10 bit para HEVC"
}

View file

@ -1,9 +1,9 @@
{
"AccessRestrictedTryAgainLater": "Actualmente el acceso está restringido. Por favor, inténtalo de nuevo más tarde.",
"Add": "Añadir",
"AddItemToCollectionHelp": "Agregue elementos a las colecciones buscándolos y haciendo clic con el botón derecho o tocando los menús para agregarlos a una colección.",
"AddToCollection": "Añadir a la colección",
"AddToPlaylist": "Añadir a la lista de reproducción",
"AddItemToCollectionHelp": "Puedes añadir elementos a las colecciones buscándolos en tu biblioteca. Una vez hecho esto, abre el menú y selecciona 'Añadir a una colección'.",
"AddToCollection": "Añadir a una colección",
"AddToPlaylist": "Añadir a una lista de reproducción",
"AddedOnValue": "Añadido {0}",
"AdditionalNotificationServices": "Visite el catálogo de extensiones para instalar servicios de notificación adicionales.",
"Albums": "Álbumes",
@ -14,11 +14,11 @@
"AllEpisodes": "Todos los episodios",
"AllLanguages": "Todos los idiomas",
"AllLibraries": "Todas las bibliotecas",
"AllowHWTranscodingHelp": "Permite al sintonizador transcodificar secuencias en vivo. Esto puede ayudar a reducir la transcodificación requerida por el servidor.",
"AllowHWTranscodingHelp": "Permite al sintonizador convertir el contenido directamente. Esto puede ayudar a reducir la potencia requerida por el servidor.",
"AllowMediaConversion": "Permitir convertir los medios",
"AllowMediaConversionHelp": "Concede o deniega el acceso a la función de conversión de medios.",
"AllowOnTheFlySubtitleExtraction": "Permitir la extracción de subtítulos sobre la marcha",
"AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden extraerse de los vídeos y enviarse en texto sin formato para ayudar a evitar la transcodificación del vídeo. En algunos sistemas, esto puede llevar mucho tiempo y hacer que la reproducción de vídeo se bloquee durante el proceso de extracción. Deshabilite esta opción para tener subtítulos incrustados grabados con transcodificación de video cuando no sean compatibles de forma nativa con el cliente.",
"AllowOnTheFlySubtitleExtractionHelp": "Cuando el cliente sea compatible, los subtítulos pueden extraerse durante la reproducción para evitar convertir el vídeo. Sin embargo, y en algunos servidores, esto puede llevar mucho tiempo y hacer que la reproducción tenga cortes durante el proceso. Deshabilita esta opción para grabar los subtítulos directamente en el vídeo cuando no sean compatibles de forma nativa con el cliente.",
"AllowRemoteAccess": "Permitir conexiones remotas a este servidor Jellyfin.",
"AllowRemoteAccessHelp": "Si no está activado, todas las conexiones remotas serán bloqueadas.",
"AllowedRemoteAddressesHelp": "Lista separada por comas de direcciones IP o entradas de IP / máscara de red para redes a las que se les permitirá conectarse de forma remota. Si se deja en blanco, se permitirán todas las direcciones remotas.",
@ -376,7 +376,7 @@
"HeaderSelectServerCachePath": "Seleccione la ruta para el caché del servidor",
"HeaderSelectServerCachePathHelp": "Navega o introduce la ruta para alojar los archivos caché del servidor. Tienes que tener permisos de escritura en esa carpeta.",
"HeaderSelectTranscodingPath": "Seleccione la ruta temporal del transcodificador",
"HeaderSelectTranscodingPathHelp": "Busque o escriba la ruta de acceso que se utilizará para la transcodificación de archivos temporales. La carpeta debe tener permiso de escritura.",
"HeaderSelectTranscodingPathHelp": "Busca o escribe la ruta que se utilizará para guardar los archivos temporales que se generarán mientras se convierten los archivos. Jellyfin debe tener permisos de escritura en la carpeta.",
"HeaderSendMessage": "Enviar mensaje",
"HeaderSeries": "Series",
"HeaderSeriesOptions": "Opciones de series",
@ -399,8 +399,8 @@
"HeaderTags": "Etiquetas",
"HeaderTaskTriggers": "Tareas de activación",
"HeaderThisUserIsCurrentlyDisabled": "Este usuario está desactivado",
"HeaderTranscodingProfile": "Perfil de transcodificación",
"HeaderTranscodingProfileHelp": "Añadir perfiles de transcodificación para indicar qué formatos se deben utilizar cuando se requiera transcodificación.",
"HeaderTranscodingProfile": "Parámetros de conversión",
"HeaderTranscodingProfileHelp": "Añade los diferentes parámetros de conversión para este dispositivo, de manera que el servidor convierta automáticamente el contenido en un formato compatible para él.",
"HeaderTunerDevices": "Sintonizadores",
"HeaderTuners": "Sintonizadores",
"HeaderTypeImageFetchers": "{0} capturadores de imágenes",
@ -449,7 +449,7 @@
"LabelAlbumArtPN": "Carátula del album PN:",
"LabelAlbumArtists": "Artistas de los álbumes:",
"LabelAll": "Todo",
"LabelAllowHWTranscoding": "Permitir transcodificación por hardware",
"LabelAllowHWTranscoding": "Activar la conversión acelerada por hardware",
"LabelAllowServerAutoRestart": "Permitir al servidor reiniciarse automáticamente para aplicar las actualizaciones",
"LabelAllowServerAutoRestartHelp": "El servidor solo se reiniciará durante periodos de reposo, cuando no haya usuarios activos.",
"LabelAllowedRemoteAddresses": "Filtro de dirección IP remota:",
@ -620,7 +620,7 @@
"LabelMoviePrefix": "Prefijo de película:",
"LabelMoviePrefixHelp": "Si se aplica un prefijo a títulos de películas, escríbalo para que el servidor pueda manejarlo correctamente.",
"LabelMovieRecordingPath": "Ruta de grabaciones de películas (opcional):",
"LabelMusicStreamingTranscodingBitrate": "Tasa de bits de transcodificación de música:",
"LabelMusicStreamingTranscodingBitrate": "Tasa de bits para la reproducción de música:",
"LabelMusicStreamingTranscodingBitrateHelp": "Especifique una tasa de bits máxima cuando transmita música.",
"LabelName": "Nombre:",
"LabelNewName": "Nuevo nombre:",
@ -667,7 +667,7 @@
"LabelPublicHttpsPort": "Puerto público HTTPS:",
"LabelPublicHttpsPortHelp": "Puerto público que debe ser enlazado al puerto local HTTPS.",
"LabelReadHowYouCanContribute": "Aprenda cómo contribuir.",
"LabelReasonForTranscoding": "Motivo de la transcodificación:",
"LabelReasonForTranscoding": "Motivo por el que se realiza la conversión:",
"LabelRecord": "Grabar:",
"LabelRecordingPath": "Ruta de grabaciones por defecto:",
"LabelRecordingPathHelp": "Especifica la ubicación por defecto para guardar las grabaciones. Si lo dejas vacío se usará la carpeta de datos del servidor.",
@ -694,7 +694,7 @@
"LabelSkipIfAudioTrackPresent": "Omitir si la pista de audio por defecto coincide con el idioma de descarga",
"LabelSkipIfAudioTrackPresentHelp": "Desactive esta opción para asegurar que todos los vídeos tienen subtítulos, sin importar el idioma de audio.",
"LabelSkipIfGraphicalSubsPresent": "Saltar si el vídeo tiene subtítulos integrados",
"LabelSkipIfGraphicalSubsPresentHelp": "Mantener versiones de texto de subtítulos dará lugar a una entrega más eficiente y a disminuir la probabilidad de transcodificación de vídeo.",
"LabelSkipIfGraphicalSubsPresentHelp": "Mantener versiones de los subtítulos en texto plano puede hacer que la reproducción sea más eficiente en un número mayor de dispositivos, evitando la conversión del vídeo.",
"LabelSonyAggregationFlags": "Agregación de banderas Sony:",
"LabelSonyAggregationFlagsHelp": "Determina el contenido del elemento aggregationFlags en el espacio de nombre urn:schemas-sonycom:av.",
"LabelSortTitle": "Clasificar por título:",
@ -721,9 +721,9 @@
"LabelTrackNumber": "Número de pista:",
"LabelTranscodingAudioCodec": "Códec de audio:",
"LabelTranscodingContainer": "Contenedor:",
"LabelTranscodingTempPathHelp": "Establece la ruta personaliza para la transcodificación de archivos servidos a los clientes. Dejar en blanco para usar la ruta por defecto del servidor.",
"LabelTranscodingThreadCount": "Cantidad de instancias de transcodificación:",
"LabelTranscodingThreadCountHelp": "Selecciona el número máximo de instancias de transcodificación. Reducirlas disminuirá el uso del procesador pero puede no convertirá lo suficientemente rápido para una reproducción fluida.",
"LabelTranscodingTempPathHelp": "Establece la carpeta que se usará para almacenar los archivos temporales de las conversiones. Déjalo en blanco para usar la ruta por defecto.",
"LabelTranscodingThreadCount": "Núcleos a utilizar durante la conversión:",
"LabelTranscodingThreadCountHelp": "Selecciona el número de núcleos a utilizar para la conversión. A menos núcleos, menor será el uso del procesador, pero puede que la conversión no vaya lo suficientemente rápido para una reproducción fluida.",
"LabelTranscodingVideoCodec": "Códec de video:",
"LabelTriggerType": "Tipo de evento:",
"LabelTunerIpAddress": "IP del sintonizador:",
@ -874,21 +874,21 @@
"OptionAlbum": "Álbum",
"OptionAlbumArtist": "Artista de álbum",
"OptionAllUsers": "Todos los usuarios",
"OptionAllowAudioPlaybackTranscoding": "Permitir reproducción de audio que requiere transcodificación",
"OptionAllowAudioPlaybackTranscoding": "Activar la conversión del audio",
"OptionAllowBrowsingLiveTv": "Permitir acceso a la televisión en directo",
"OptionAllowContentDownloading": "Permitir la descarga de medios",
"OptionAllowLinkSharing": "Permitir compartir los medios en redes sociales",
"OptionAllowLinkSharingHelp": "Sólo se comparten las páginas web con información de medios. Los archivos nunca se comparten públicamente. Lo compartido expirará después de {0} días.",
"OptionAllowManageLiveTv": "Habilitar la administración de grabación de la televisión en directo",
"OptionAllowMediaPlayback": "Permitir la reproducción de medios",
"OptionAllowMediaPlaybackTranscodingHelp": "Restringir el acceso a la transcodificación puede causar fallos de reproducción en aplicaciones Jellyfin debido a formatos de medios no compatibles.",
"OptionAllowMediaPlaybackTranscodingHelp": "Con la conversión, el servidor se asegura que cualquier cliente es capaz de reproducir el contenido, sin importar su formato. Al desactivar la conversión de alguno de estos elementos, es posible que los vídeos no tengan audio o que, directamente, no se pueda reproducir el archivo por no ser compatible con el dispositivo. Para evitar problemas con la reproducción es mejor dejarlas todas por defecto.",
"OptionAllowRemoteControlOthers": "Habilitar el control remoto de otros usuarios",
"OptionAllowRemoteSharedDevices": "Habilitar el control remoto de otros equipos compartidos",
"OptionAllowRemoteSharedDevicesHelp": "Los equipos DLNA son considerados compartidos hasta que un usuario empiece a controlarlos.",
"OptionAllowSyncTranscoding": "Permitir la descarga que requiera transcodificación",
"OptionAllowSyncTranscoding": "Permitir la conversión del contenido cuando se descargue o se sincronice",
"OptionAllowUserToManageServer": "Permite a este usuario administrar el servidor",
"OptionAllowVideoPlaybackRemuxing": "Permitir la reproducción de vídeo que requiere conversión sin necesidad de volver a codificar",
"OptionAllowVideoPlaybackTranscoding": "Permitir reproducción de vídeo que requiere transcodificación",
"OptionAllowVideoPlaybackRemuxing": "Activar el cambio de contenedor para el contenido cuyo audio y vídeo es compatible, pero no lo es su contenedor",
"OptionAllowVideoPlaybackTranscoding": "Activar la conversión del vídeo",
"OptionArtist": "Artista",
"OptionAscending": "Ascendente",
"OptionAutomaticallyGroupSeries": "Combinar automáticamente series que se distribuyen en varias carpetas",
@ -949,7 +949,7 @@
"OptionHideUserFromLoginHelp": "Útil para privado o cuentas de administradores escondidos. El usuario tendrá que acceder entrando su nombre de usuario y contraseña manualmente.",
"OptionHlsSegmentedSubtitles": "Subtítulos segmentados HLS",
"OptionHomeVideos": "Fotos",
"OptionIgnoreTranscodeByteRangeRequests": "Ignorar las solicitudes de intervalo de bytes de transcodificación",
"OptionIgnoreTranscodeByteRangeRequests": "En las conversiones, ignorar las solicitudes de un intervalo específico de bytes",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Si está activado, estas solicitudes serán atendidas pero ignorarán el encabezado de intervalo de bytes.",
"OptionImdbRating": "Valoración IMDb",
"OptionLikes": "Me gusta",
@ -1160,7 +1160,7 @@
"TabSongs": "Canciones",
"TabStreaming": "Transmisión",
"TabSuggestions": "Sugerencias",
"TabTranscoding": "Transcodificación",
"TabTranscoding": "Conversión",
"TabUpcoming": "Próximos",
"TabUsers": "Usuarios",
"Tags": "Etiquetas",
@ -1173,7 +1173,7 @@
"TitleHostingSettings": "Configuración del alojamiento",
"TitlePlayback": "Reproducción",
"TrackCount": "{0} pistas",
"Transcoding": "Transcodificación",
"Transcoding": "Conversión",
"Tuesday": "Martes",
"TvLibraryHelp": "Revisar la {0}guía de nombres de los programas de TV{1}.",
"UninstallPluginConfirmation": "¿Esta seguro que desea desinstalar {0}?",
@ -1354,7 +1354,7 @@
"LabelAuthProvider": "Proveedor de autenticación:",
"LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:",
"LabelServerName": "Nombre del servidor:",
"LabelTranscodePath": "Ruta de transcodificación:",
"LabelTranscodePath": "Ruta para los archivos temporales de las conversiones:",
"LabelTranscodes": "Transcodificaciones:",
"LabelUserLoginAttemptsBeforeLockout": "Intentos fallidos de inicio de sesión antes de que el usuario sea bloqueado:",
"DashboardVersionNumber": "Versión: {0}",
@ -1430,8 +1430,8 @@
"MoreMediaInfo": "Información del archivo",
"LabelVideoCodec": "Codec de video:",
"LabelVideoBitrate": "Bitrade de video:",
"LabelTranscodingProgress": "Progreso de la transcodificación:",
"LabelTranscodingFramerate": "Velocidad de fotogramas de la transcodificación:",
"LabelTranscodingProgress": "Progreso de la conversión:",
"LabelTranscodingFramerate": "Velocidad de la conversión:",
"LabelSize": "Tamaño:",
"LabelPleaseRestart": "Los cambios surtirán efecto tras recargar manualmente el cliente web.",
"LabelPlayMethod": "Método de reproducción:",
@ -1459,9 +1459,9 @@
"EnableFasterAnimationsHelp": "Las animaciones y transiciones durarán menos tiempo",
"EnableFasterAnimations": "Animaciones más rápidas",
"CopyStreamURLError": "Ha habido un error copiando la dirección.",
"AllowFfmpegThrottlingHelp": "Cuando una transcodificación o un remux se adelanta lo suficiente desde la posición de reproducción actual, pause el proceso para que consuma menos recursos. Esto es más útil cuando se reproduce de forma linear, sin saltar de posición de reproducción a menudo. Desactívelo si experimenta problemas de reproducción.",
"AllowFfmpegThrottlingHelp": "Las conversiones se pausarán cuando se adelanten lo suficiente desde la posición en la que se encuentre el reproductor. Puede reducir la carga en el servidor y es útil cuando se reproduce de forma continua, sin saltar entre intervalos de tiempo, pero puede que tengas que desactivarlo si experimentas problemas en la reproducción o cambias de posición frecuentemente mientras reproduces contenido.",
"PlaybackErrorNoCompatibleStream": "Este contenido no es compatible con este dispositivo y no se puede reproducir: No se puede obtener del servidor en un formato compatible.",
"OptionForceRemoteSourceTranscoding": "Forzar la transcodificación para fuentes remotas de medios (como LiveTV)",
"OptionForceRemoteSourceTranscoding": "Forzar la conversión para fuentes externas (como la televisión en directo)",
"NoCreatedLibraries": "Parece que aún no se han creado librearías. {0}¿Quiere crear una ahora?{1}",
"LabelVideoResolution": "Resolución de video:",
"LabelStreamType": "Tipo de stream:",
@ -1469,7 +1469,7 @@
"LabelDroppedFrames": "Frames perdidos:",
"LabelCorruptedFrames": "Frames corruptos:",
"AskAdminToCreateLibrary": "Solo un administrador puede crear librerías.",
"AllowFfmpegThrottling": "Acelerar transcodificación",
"AllowFfmpegThrottling": "Pausar las conversiones",
"ClientSettings": "Ajustes de cliente",
"PreferEmbeddedEpisodeInfosOverFileNames": "Priorizar la información embebida sobre los nombres de archivos",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Usar la información de episodio de los metadatos embebidos si está disponible.",
@ -1525,7 +1525,7 @@
"EnableBlurhash": "Mostrar una representación de las imágenes mientras cargan",
"EnableBlurhashHelp": "Aparecerá una representación de los colores de las imágenes antes de que terminen de cargar",
"HeaderDVR": "DVR",
"SyncPlayAccessHelp": "Selecciona los permisos de este usuario para utilizar SyncPlay. SyncPlay te permite sincronizar la reproducción entre varios dispositivos.",
"SyncPlayAccessHelp": "Selecciona el nivel de acceso de este usuario para utilizar SyncPlay. SyncPlay te permite sincronizar la reproducción entre varios dispositivos.",
"MessageSyncPlayErrorMedia": "¡No se pudo activar SyncPlay! Error de medio.",
"MessageSyncPlayErrorMissingSession": "¡No se pudo activar SyncPlay! Sesión desconectada.",
"MessageSyncPlayErrorNoActivePlayer": "No hay reproductor activo. SyncPlay ha sido desactivado.",
@ -1562,6 +1562,16 @@
"ButtonSyncPlay": "SyncPlay",
"ButtonCast": "Enviar",
"MessageNoGenresAvailable": "Permitir a algunos proveedores de metadatos extraer géneros de Internet.",
"EnableDecodingColorDepth10Vp9": "Habilite la decodificación por hardware de 10 bits para Vp9",
"EnableDecodingColorDepth10Hevc": "Habilite la decodificación por hardware de 10 bits para HEVC"
"EnableDecodingColorDepth10Vp9": "Habilite la decodificación por hardware de 10 bits para VP9",
"EnableDecodingColorDepth10Hevc": "Habilite la decodificación por hardware de 10 bits para HEVC",
"ButtonPlayer": "Reproductor",
"TabRepositories": "Repositorios",
"MessageAddRepository": "Si desea agregar un repositorio, haga click en el botón cerca del encabezado y complete la información requerida.",
"LabelRepositoryNameHelp": "Un nombre personalizado para distinguir este repositorio de otros agregados a su servidor.",
"LabelRepositoryName": "Nombre del repositorio",
"LabelRepositoryUrlHelp": "La ubicación del repositorio que desea incluir.",
"LabelRepositoryUrl": "URL del repositorio",
"HeaderNewRepository": "Nuevo repositorio",
"MessageNoRepositories": "Sin repositorios.",
"Writers": "Escritores"
}

View file

@ -1548,5 +1548,6 @@
"EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes",
"ShowMore": "Mostrar más",
"ShowLess": "Mostrar menos",
"EnableBlurhashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso"
"EnableBlurhashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -12,5 +12,6 @@
"Books": "Libros",
"Albums": "Álbumes",
"Artists": "Artistas",
"Channels": "Canales"
"Channels": "Canales",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1553,5 +1553,6 @@
"EnableFastImageFadeIn": "Faster animations",
"EnableFastImageFadeInHelp": "Use faster animations and transitions",
"EnableBlurhash": "Enable blurred placeholders for images",
"EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder"
"EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1246,5 +1246,6 @@
"MediaInfoAnamorphic": "Anamorfinen",
"ErrorGettingTvLineups": "TV esiintyjälistan lataamisessa tapahtui virhe. Varmista, että tiedot on oikein ja yritä uudelleen.",
"EnableDetailsBannerHelp": "Näyttää julistekuvan yksityiskohdat -sivun ylälaidassa.",
"EnableDetailsBanner": "Yksityiskohtien banneri"
"EnableDetailsBanner": "Yksityiskohtien banneri",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -97,7 +97,7 @@
"AllowMediaConversion": "Autoriser la conversion des médias",
"AllowMediaConversionHelp": "Autoriser ou refuser l'accès à la fonctionnalité de conversion des médias.",
"AllowOnTheFlySubtitleExtraction": "Autoriser l'extraction des sous-titres à la volée",
"AllowOnTheFlySubtitleExtractionHelp": "Les sous-titres intégrés peuvent être extraits des vidéos et distribués aux applications Jellyfin au format texte pour éviter le transcodage. Sur certains systèmes, cela peut prendre du temps et arrêter la lecture de la vidéo pendant le processus d'extraction. Désactivez cette option pour graver les sous-titres avec un transcodage quand l'appareil ne les prend pas en charge nativement.",
"AllowOnTheFlySubtitleExtractionHelp": "Les sous-titres intégrés peuvent être extraits des vidéos et distribués aux clients en format texte pour éviter le transcodage. Sur certains systèmes, cela peut prendre du temps et arrêter la lecture de la vidéo pendant le processus d'extraction. Désactivez cette option pour graver les sous-titres avec un transcodage quand l'appareil ne les prend pas en charge nativement.",
"AllowRemoteAccess": "Autoriser les connexions distantes à ce serveur Jellyfin.",
"AllowRemoteAccessHelp": "Si l'option est désactivée, toutes les connexions distantes seront bloquées.",
"Artists": "Artistes",
@ -134,13 +134,13 @@
"BirthLocation": "Lieu de naissance",
"BirthPlaceValue": "Lieu de naissance : {0}",
"Blacklist": "Liste noire",
"BookLibraryHelp": "Les livres audios et formats textes sont supportés. Consultez le {0}Guide de nommage de livres de Jellyfin{1}.",
"BookLibraryHelp": "Les livres audios et formats textes sont supportés. Consultez le {0} Guide de nommage de livres {1}.",
"Box": "Boîtier",
"BoxRear": "Dos de boîtier",
"Browse": "Parcourir",
"BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.",
"AllowHWTranscodingHelp": "Permet au récepteur TV de transcoder les flux à la volée. Cela peut aider à réduire le transcodage requis par le serveur Jellyfin.",
"BurnSubtitlesHelp": "Détermine si le serveur doit graver les sous-titres lors de la conversion vidéo en fonction du format des sous-titres. Éviter la gravure des sous-titres améliorera les performances du serveur. Sélectionnez Auto pour graver les formats basés sur l'image (par exemple, VOBSUB, PGS, SUB/IDX etc) ainsi que certains sous-titres ASS/SSA",
"AllowHWTranscodingHelp": "Permet au récepteur TV de transcoder les flux à la volée. Cela peut aider à réduire le transcodage requis par le serveur.",
"BurnSubtitlesHelp": "Détermine si le serveur doit graver les sous-titres lors du transcodage vidéo. Éviter ceci améliorera les performances du serveur. Sélectionnez Auto pour graver les formats basés sur l'image (par exemple, VOBSUB, PGS, SUB/IDX etc) ainsi que certains sous-titres ASS/SSA.",
"ButtonAccept": "Accepter",
"ButtonAdd": "Ajouter",
"ButtonAddMediaLibrary": "Ajouter une médiathèque",
@ -187,7 +187,7 @@
"ButtonMore": "Plus",
"ButtonNetwork": "Réseau",
"AspectRatio": "Format de visionnement",
"AskAdminToCreateLibrary": "Demander à l'administrateur pour créer une bibliothèque de média.",
"AskAdminToCreateLibrary": "Demander un administrateur de créer une médiathèque.",
"Artist": "Artiste",
"AllowFfmpegThrottlingHelp": "Quand un transcodage ou rémux se déplace après la position de relecture, suspendre le processus pour consommer moins de ressources. Ceci est le plus utile pour chercher moins. Désactiver s'il y a des problèmes de relecture.",
"AllowFfmpegThrottling": "Restreindre la vitesse de transcodage",
@ -198,5 +198,68 @@
"HeaderFavoriteShows": "Séries favorites",
"HeaderFavoriteEpisodes": "Épisodes favoris",
"HeaderFavoriteArtists": "Artistes favoris",
"HeaderFavoriteAlbums": "Albums favoris"
"HeaderFavoriteAlbums": "Albums favoris",
"ButtonSyncPlay": "SyncPlay",
"Default": "Défaut",
"DeathDateValue": "Mort: {0}",
"DatePlayed": "Date écoutée",
"DateAdded": "Date d'ajout",
"CriticRating": "Évaluation critique",
"CopyStreamURLError": "Une erreur est survenue en essayant de copier l'URL.",
"CopyStreamURLSuccess": "L'URL a été copié avec succès.",
"CopyStreamURL": "Copier l'URL du stream",
"ContinueWatching": "Continuer à visionner",
"Connect": "Connexion",
"ConfirmEndPlayerSession": "Voulez-vous éteindre Jellyfin sur {0}?",
"ConfirmDeletion": "Confirmer la suppression",
"ConfirmDeleteItems": "Supprimer ceux-ci les effacera du système de fichiers et votre médiathèque. Êtes-vous sûr de vouloir continuer?",
"ConfirmDeleteImage": "Effacer l'image?",
"ClientSettings": "Paramètres du client",
"ChannelNumber": "Numéro de canal",
"ChannelNameOnly": "Canal {0} seulment",
"ChannelAccessHelp": "Sélectionner les canaux que vous désirer partager avec cet usager. Les administrateurs seront capable de modifier tout les canaux en utilisant le gestionnaire des métadonnées.",
"Categories": "Catégories",
"CancelSeries": "Annuler la série",
"CancelRecording": "Annuler l'enregistrement",
"ButtonWebsite": "Site web",
"ButtonViewWebsite": "Voir le site web",
"ButtonUp": "Vers le haut",
"ButtonUninstall": "Désinstaller",
"ButtonTogglePlaylist": "Liste de lecture",
"ButtonToggleContextMenu": "Plus",
"ButtonSubtitles": "Sous-titres",
"ButtonSubmit": "Soumettre",
"ButtonStop": "Arrêt",
"ButtonStart": "Démarrer",
"ButtonSort": "Trier",
"ButtonSignIn": "Se connecter",
"ButtonShutdown": "Éteindre",
"ButtonShuffle": "Lecture aléatoire",
"ButtonSettings": "Paramètres",
"ButtonSend": "Envoyer",
"ButtonSelectServer": "Sélectionner le serveur",
"ButtonSelectDirectory": "Sélectionner le répertoire",
"ButtonSearch": "Rechercher",
"ButtonScanAllLibraries": "Analyser toutes les médiathèques",
"ButtonSave": "Sauvegarder",
"ButtonRevoke": "Révoquer",
"ButtonResume": "Reprendre la lecture",
"ButtonResetPassword": "Réinitialiser le mot de passe",
"ButtonResetEasyPassword": "Remettre à nouveau le code NIP facile",
"ButtonRepeat": "Répéter",
"ButtonRename": "Renommer",
"ButtonRemove": "Enlever",
"ButtonRefreshGuideData": "Rafraîchir les données de guide",
"ButtonRefresh": "Rafraîchir",
"ButtonProfile": "Profil",
"ButtonPreviousTrack": "Piste précédente",
"ButtonPlay": "Lecture",
"ButtonPause": "Pause",
"ButtonParentalControl": "Contrôle parentale",
"ButtonOpen": "Ouvrir",
"ButtonOk": "OK",
"ButtonNextTrack": "Prochaine piste",
"ButtonNew": "Nouveau",
"ButtonAddImage": "Ajouter l'image",
"BoxSet": "Coffret"
}

View file

@ -1506,7 +1506,7 @@
"HeaderFavoritePlaylists": "Listes de lecture favorites",
"TabDVR": "DVR",
"LabelChromecastVersion": "Version de Chromecast",
"LabelEnableHttpsHelp": "Autorise le serveur à écouter les requêtes HTTPS sur le port configurée. Un certificat valide doit être configuré pour permettre ce mode de fonctionnement.",
"LabelEnableHttpsHelp": "Autorise le serveur à écouter les requêtes HTTPS sur le port configuré. Un certificat valide doit être configuré pour permettre ce mode de fonctionnement.",
"LabelEnableHttps": "Activer HTTPS",
"HeaderServerAddressSettings": "Paramètres adresses serveur",
"HeaderRemoteAccessSettings": "Paramètres d'accès distant",
@ -1521,7 +1521,7 @@
"EnableDetailsBanner": "Bannière des détails",
"EnableDetailsBannerHelp": "Affichez une image de bannière en haut de la page de détails de l'article.",
"HeaderSyncPlaySelectGroup": "Rejoindre un groupe",
"LabelSyncPlayAccessCreateAndJoinGroups": "Autoriser l'utilisateur à créer un ou rejoindre un groupe",
"LabelSyncPlayAccessCreateAndJoinGroups": "Autoriser l'utilisateur à créer ou rejoindre un groupe",
"LabelSyncPlayLeaveGroupDescription": "Désactiver SyncPlay",
"LabelSyncPlayLeaveGroup": "Quitter le groupe",
"LabelSyncPlayNewGroupDescription": "Créer un nouveau groupe",
@ -1529,14 +1529,14 @@
"LabelSyncPlaySyncMethod": "Méthode de synchronisation :",
"LabelSyncPlayPlaybackDiff": "Décalage de la lecture :",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Décalage de temps avec le serveur :",
"LabelSyncPlayTimeOffset": "Décalage de temps avec le serveur :",
"HeaderSyncPlayEnabled": "SyncPlay activé",
"MessageSyncPlayLibraryAccessDenied": "L'accès à ce contenu est restreint.",
"MessageSyncPlayJoinGroupDenied": "Permission requise pour utiliser SyncPlay.",
"MessageSyncPlayCreateGroupDenied": "Permission requise pour créer un groupe.",
"MessageSyncPlayGroupDoesNotExist": "Impossible de rejoindre le groupe car il n'existe pas.",
"MessageSyncPlayPlaybackPermissionRequired": "Autorisation de lecture requise.",
"MessageSyncPlayNoGroupsAvailable": "Aucun groupe disponible. Commencez par lancer quelque chose.",
"MessageSyncPlayNoGroupsAvailable": "Aucun groupe disponible. Commencez par lire quelque chose.",
"MessageSyncPlayGroupWait": "<b>{0}</b> est en train de charger...",
"MessageSyncPlayUserLeft": "<b>{0}</b> a quitté le groupe.",
"MessageSyncPlayUserJoined": "<b>{0}</b> a rejoint le groupe.",
@ -1548,14 +1548,14 @@
"SyncPlayAccessHelp": "Sélectionner le niveau d'accès de cet utilisateur pour la fonctionnalité SyncPlay. SyncPlay permet de synchroniser la lecture avec d'autres utilisateurs.",
"MessageSyncPlayErrorMedia": "Impossible d'activer SyncPlay ! Erreur média.",
"MessageSyncPlayErrorMissingSession": "Impossible d'activer SyncPlay ! Session manquante.",
"MessageSyncPlayErrorNoActivePlayer": "Aucun player actif trouvé. SyncPlay a été désactivé.",
"MessageSyncPlayErrorNoActivePlayer": "Aucun lecteur actif trouvé. SyncPlay a été désactivé.",
"MessageSyncPlayErrorAccessingGroups": "Une erreur s'est produite pendant l'accès à la liste de groupes.",
"ShowMore": "Voir plus",
"ShowLess": "Voir moins",
"EnableBlurhashHelp": "Les images qui sont encore en cours de chargement seront remplacées par une image générique floue",
"EnableBlurhash": "Utilise des images génériques floues à la place des images",
"ButtonCast": "Diffuser",
"ButtonSyncPlay": "Lecture synchronisée",
"ButtonSyncPlay": "SyncPlay",
"TabRepositories": "Dépôts",
"MessageNoGenresAvailable": "Utiliser des fournisseurs de métadonnées pour récupérer les genres depuis internet.",
"MessageAddRepository": "Si vous souhaitez ajouter un dépôt, cliquez sur le bouton près de l'entête et renseignez les informations demandées.",

View file

@ -11,5 +11,6 @@
"AirDate": "Data de emisión",
"Aired": "Emitido",
"AddToPlaylist": "Engadir á lista de reprodución",
"Add": "Engadir"
"Add": "Engadir",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -165,5 +165,6 @@
"VersionNumber": "Version {0}",
"Absolute": "Absolut",
"Actor": "Schauspiler",
"AccessRestrictedTryAgainLater": "Zuegriff isch momentan beschränkt. Probier bitte später nomau. "
"AccessRestrictedTryAgainLater": "Zuegriff isch momentan beschränkt. Probier bitte später nomau. ",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -771,5 +771,6 @@
"LabelSource": "מקור:",
"LabelSoundEffects": "אפקטי סאונד:",
"ButtonTogglePlaylist": "רשימת ניגון",
"ButtonToggleContextMenu": "עוד"
"ButtonToggleContextMenu": "עוד",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -112,5 +112,6 @@
"AlbumArtist": "चित्राधार कलाकार",
"AllowOnTheFlySubtitleExtraction": "मक्खी पर उपशीर्षक निष्कर्षण की अनुमति दें",
"Album": "एल्बम",
"AddItemToCollectionHelp": "उनके लिए खोज करके संग्रह में आइटम जोड़ें और उन्हें संग्रह में जोड़ने के लिए उनके राइट-क्लिक या टैप मेनू का उपयोग करें।"
"AddItemToCollectionHelp": "उनके लिए खोज करके संग्रह में आइटम जोड़ें और उन्हें संग्रह में जोड़ने के लिए उनके राइट-क्लिक या टैप मेनू का उपयोग करें।",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -7,14 +7,14 @@
"AdditionalNotificationServices": "Pretražite katalog dodataka kako bi instalirali dodatne servise za obavijesti.",
"AllChannels": "Svi kanali",
"AllEpisodes": "Sve epizode",
"AllowHWTranscodingHelp": "Ako je omogućeno, omogućite TV/radio uređaju da konvertira strujanja u letu. Ovo može pomoći smanjiti konvertiranje koje zahtijeva Jellyfin Server.",
"AllowHWTranscodingHelp": "Omogućite TV/radio uređaju da konvertira strujanja u letu. Ovo može pomoći smanjiti konvertiranje koje zahtijeva Jellyfin Server.",
"Anytime": "Bilo kada",
"AroundTime": "Oko {0}",
"AroundTime": "Oko",
"AsManyAsPossible": "Što više je moguće",
"AttributeNew": "Novo",
"Backdrops": "Pozadine",
"BirthDateValue": "Rođen: {0}",
"BirthLocation": "Lokacije rođenja",
"BirthLocation": "Lokacija rođenja",
"BirthPlaceValue": "Mjesto rođenja: {0}",
"BrowsePluginCatalogMessage": "Pregledajte dostupne dodatke u našem katalogu.",
"ButtonAdd": "Dodaj",
@ -120,35 +120,35 @@
"DoNotRecord": "Ne snimi",
"Download": "Preuzimanje",
"DrmChannelsNotImported": "Kanali s DRM se neće uvesti.",
"EasyPasswordHelp": "Vaš laki PIN kod se koristi za izvan-mrežni pristup s podržanim Jellyfin aplikacijama, a također se može koristiti za jednostavnu mrežnu prijavu.",
"EasyPasswordHelp": "Vaš laki PIN kod se koristi za izvan-mrežni pristup na podržanim klijentima i također se može koristiti za jednostavnu mrežnu prijavu.",
"Edit": "Izmjeni",
"EditImages": "Uređivanje slika",
"EditSubtitles": "Uredi titlove",
"EnableColorCodedBackgrounds": "Omogući kodirane boje pozadine",
"EnablePhotos": "Omogući slike",
"EnablePhotosHelp": "Slike će biti otkrite i prikazivane zajedno s drugim medijskim datotekama.",
"EnableColorCodedBackgrounds": "Kodirane boje pozadine",
"EnablePhotos": "Prikaži slike",
"EnablePhotosHelp": "Slike će biti otkrivene i prikazivane zajedno s drugim medijskim datotekama.",
"Ended": "Završeno",
"EndsAtValue": "Završava u {0}",
"ErrorAddingListingsToSchedulesDirect": "Došlo je do pogreške prilikom dodavanja postava vašim zakazanim direktnim računima. Raspored dopušta samo ograničen broj postava po računu. Možda ćete morati se prijavite u zakazanim \"Direct\" web stranicama i ukloniti unose drugih s računa prije nastavka.",
"ErrorAddingMediaPathToVirtualFolder": "Došlo je do pogreške prilikom dodavanja putanje medija. Provjerite dali je putanja valjana i da proces Jellyfin Server-a ima pristup tom mjestu.",
"ErrorAddingTunerDevice": "Došlo je do pogreške prilikom dodavanja uređaja TV/radio pretraživača. Provjerite da je dostupan i pokušajte ponovno.",
"ErrorGettingTvLineups": "Došlo je do pogreške prilikom preuzimanja tv postave. Provjerite dali su vaše informacije točne i pokušajte ponovno.",
"ErrorGettingTvLineups": "Došlo je do pogreške prilikom preuzimanja TV postave. Provjerite dali su vaše informacije točne i pokušajte ponovno.",
"ErrorMessageStartHourGreaterThanEnd": "Vrijeme završetka mora biti veće od početka.",
"ErrorPleaseSelectLineup": "Odaberite postavu i pokušajte ponovno. Ako niti jedna postava nije dostupna provjerite dali su korisničko ime, lozinka i poštanski broj točni.",
"ErrorSavingTvProvider": "Došlo je do pogreške prilikom snimanja TV pružatelja. Provjerite da je dostupan i pokušajte ponovno.",
"ExtractChapterImagesHelp": "Izdvajanje slika poglavlja omogućiti će Jellyfin aplikaciji za prikaz grafičkih izbornika za odabir scena. Proces može biti spor, CPU intenzivno korišten i može zahtijevati nekoliko gigabajta prostora. Ono se pokreće kad je otkriven video, a također i kao noćni zadatak. Raspored je podesiv u području rasporeda zadataka. Ne preporučuje se za pokretanje ovog zadatka tijekom sati čestog korištenja.",
"ExtractChapterImagesHelp": "Izdvajanje slika poglavlja omogućiti će klijentima prikaz grafičkih izbornika za odabir scena. Proces može biti spor, resursi intenzivno korišteni i može zahtijevati nekoliko gigabajta prostora. Ono se pokreće kad je otkriven video, a također i kao noćni zadatak. Raspored je podesiv u području rasporeda zadataka. Ne preporučuje se za pokretanje ovog zadatka tijekom sati čestog korištenja.",
"FFmpegSavePathNotFound": "Nismo mogli locirati FFmpeg korištenjem putanje koju ste unijeli. FFprobe je također potreban i mora postojati u istoj mapi. Te komponente su obično u paketu zajedno u istom preuzimanju. Provjerite putanju i pokušajte ponovno.",
"Favorite": "Omiljeni",
"File": "Datoteka",
"FileNotFound": "Datoteka nije pronađena.",
"FileReadCancelled": "Učitavanje datoteke je prekinuto.",
"FileReadError": "Prilikom učitavanja datoteke desila se greška",
"FileReadError": "Prilikom učitavanja datoteke dogodila se greška.",
"FolderTypeBooks": "Knjige",
"FolderTypeMovies": "Filmovi",
"FolderTypeMusic": "Glazba",
"FolderTypeMusicVideos": "Glazbeni videi",
"FolderTypeMusicVideos": "Glazbeni spotovi",
"FolderTypeTvShows": "TV",
"FolderTypeUnset": "Isključi (miješani sadržaj)",
"FolderTypeUnset": "Miješani sadržaj",
"Friday": "Petak",
"Genres": "Žanrovi",
"GroupVersions": "Verzija grupe",
@ -158,7 +158,7 @@
"H264CrfHelp": "Konstante brzine faktora (CRF) je postavka zadane kvalitete za x264 enkodera. Možete postaviti vrijednosti između 0 i 51, gdje će niže vrijednosti rezultirati boljom kvalitetom (na račun veće veličine datoteka). Razumne vrijednosti su između 18 i 28. Zadana za x264 je 23, tako da to možete koristiti kao početnu točku.",
"EncoderPresetHelp": "Odaberite bržu vrijednost za poboljšanje performansi ili sporiju za poboljšanje kvalitete.",
"HDPrograms": "HD programi",
"HardwareAccelerationWarning": "Omogućavanje hardverskog ubrzanja može uzrokovati nestabilnostima u nekim sredinama. Pobrinite se da Vaš operativni sustav i video drajveri su u potpunosti ažurni. Ako imate poteškoća s reprodukcijom videa nakon omogućavanja ovoga, morat ćete promijeniti postavku natrag na Automatski.",
"HardwareAccelerationWarning": "Omogućavanje hardverskog ubrzanja može uzrokovati nestabilnostima u nekim sredinama. Pobrinite se da Vaš operativni sustav i video drajveri su u potpunosti ažurni. Ako imate poteškoća s reprodukcijom videa nakon omogućavanja ovoga, morat ćete promijeniti postavku natrag na Ništa.",
"HeaderAccessSchedule": "Raspored pristupa",
"HeaderAccessScheduleHelp": "Napravite raspored pristupa da bi ograničili pristup određenim satima.",
"HeaderActiveDevices": "Aktivni uređaji",
@ -189,7 +189,7 @@
"HeaderCodecProfileHelp": "Profili kodeka definiraju ograničenja kada uređaji izvode sadržaj u specifičnom kodeku. Ako se ograničenja podudaraju tada će sadržaj biti transkodiran, iako je kodek konfiguriran za direktno izvođenje.",
"HeaderConfirmPluginInstallation": "Potvrdi instalaciju dodatka",
"HeaderConfirmProfileDeletion": "Potvrdite brisanje profila",
"HeaderConfirmRevokeApiKey": "Opozovi Api ključ",
"HeaderConfirmRevokeApiKey": "Opozovi API ključ",
"HeaderConnectToServer": "Spoji se na Server",
"HeaderConnectionFailure": "Neuspjelo spajanje",
"HeaderContainerProfile": "Profil spremnika",
@ -221,7 +221,7 @@
"HeaderForgotPassword": "Zaboravili ste lozinku",
"HeaderFrequentlyPlayed": "Često izvođeno",
"HeaderGuideProviders": "Pružatelji vodiča",
"HeaderHttpHeaders": "Http zaglavlja",
"HeaderHttpHeaders": "HTTP zaglavlja",
"HeaderIdentification": "Identifikacija",
"HeaderIdentificationCriteriaHelp": "Unesite barem jedan kriterij za identifikaciju.",
"HeaderIdentificationHeader": "Identifikacija zaglavlja",
@ -244,7 +244,7 @@
"HeaderLoginFailure": "Neuspjela prijava",
"HeaderMedia": "Medij",
"HeaderMediaFolders": "Medijska mapa",
"HeaderMediaInfo": "Info medija:",
"HeaderMediaInfo": "Info medija",
"HeaderMetadataSettings": "Postavke meta-podataka",
"HeaderMoreLikeThis": "Više ovakvih",
"HeaderMovies": "Filmovi",
@ -278,8 +278,8 @@
"HeaderScenes": "Scene",
"HeaderSchedule": "Raspored",
"HeaderSeasons": "Sezone",
"HeaderSelectCertificatePath": "Odaberi put certifikata:",
"HeaderSelectMetadataPath": "Odaberite putanju meta-podataka:",
"HeaderSelectCertificatePath": "Odaberi putanju certifikata",
"HeaderSelectMetadataPath": "Odaberite putanju meta-podataka",
"HeaderSelectMetadataPathHelp": "Pregledajte ili unesite putanju za pohranu meta-podataka. U mapu se mora moći pisati.",
"HeaderSelectPath": "Odaberi putanju",
"HeaderSelectServer": "Odaberi Server",
@ -288,7 +288,7 @@
"HeaderSelectTranscodingPath": "Odaberite privremenu putanju konvertiranja",
"HeaderSelectTranscodingPathHelp": "Pregledajte ili unesite putanju za korištenje konvertiranja privremenih datoteka. U mapu se mora moći pisati.",
"HeaderSendMessage": "Pošalji poruku",
"HeaderSeries": "Series:",
"HeaderSeries": "Serija",
"HeaderSeriesOptions": "Opcije serija",
"HeaderServerSettings": "Postavke Servera",
"HeaderSettings": "Postavke",
@ -325,7 +325,7 @@
"Identify": "Identificiraj",
"Images": "Slike",
"ImportFavoriteChannelsHelp": "Ako je omogućeno, samo kanali koji su označeni kao omiljeni na uređaju TV/radio pretraživača će se uvesti.",
"InstallingPackage": "Instaliranje {0}",
"InstallingPackage": "Instaliranje {0} (verzija {1})",
"InstantMix": "Trenutno miješanje",
"ItemCount": "{0} stavaka",
"Kids": "Djeca",
@ -344,13 +344,13 @@
"LabelAlbumArtMaxWidth": "Maksimalna širina Album art-a:",
"LabelAlbumArtMaxWidthHelp": "Maksimalna rezolucija albuma izloženih putem UPnP:albumArtURI.",
"LabelAlbumArtPN": "Grafika albuma PN:",
"LabelAlbumArtists": "Izvođači albuma",
"LabelAlbumArtists": "Izvođači albuma:",
"LabelAll": "Sve",
"LabelAllowHWTranscoding": "Dopusti hardversko konvertiranje",
"LabelAllowServerAutoRestart": "Dopusti serveru da se automatski resetira kako bi proveo nadogradnje",
"LabelAllowServerAutoRestartHelp": "Server će se resetirati dok je u statusu mirovanja, odnosno kada nema aktivnih korisnika.",
"LabelAllowServerAutoRestartHelp": "Server će se resetirati samo dok je u statusu mirovanja kada nema aktivnih korisnika.",
"LabelAppName": "Ime aplikacije",
"LabelAppNameExample": "Primjer: Sickbeard, NzbDrone",
"LabelAppNameExample": "Primjer: Sickbeard, Sonarr",
"LabelArtists": "Izvođači:",
"LabelArtistsHelp": "Odvoji višestruko koristeći ;",
"LabelAudioLanguagePreference": "Postavke audio jezika:",
@ -362,7 +362,7 @@
"LabelBlastMessageIntervalHelp": "Određuje trajanje u sekundama između svake poruke dostupnosti servera.",
"LabelCache": "Predmemorija:",
"LabelCachePath": "Putanja predmemorije:",
"LabelCachePathHelp": "Odredite prilagođenu lokaciju za predmemorijske datoteke servera, kao što su slike. Ostavite prazno za korištenje zadanog poslužitelja.",
"LabelCachePathHelp": "Odredite prilagođenu lokaciju za predmemorijske datoteke servera kao što su slike. Ostavite prazno za korištenje zadanog poslužitelja.",
"LabelCancelled": "Otkazan",
"LabelChannels": "Kanali:",
"LabelCollection": "Kolekcija:",
@ -371,12 +371,12 @@
"LabelCountry": "Zemlja:",
"LabelCriticRating": "Ocjene kritike:",
"LabelCurrentPassword": "Sadašnja lozinka:",
"LabelCustomCss": "Prilagođen css:",
"LabelCustomCssHelp": "Primijenite svoj vlastiti prilagođeni css na web sučelje.",
"LabelCustomCss": "Prilagođeni CSS:",
"LabelCustomCssHelp": "Primijenite svoj vlastiti prilagođeni stil na web sučelje.",
"LabelCustomDeviceDisplayName": "Prikaz naziva:",
"LabelCustomDeviceDisplayNameHelp": "Navedite naziv prilagođenog prikaza ili ostaviti prazno za korištenje naziva koji je izvijestio uređaj.",
"LabelCustomRating": "Prilagođena ocjena:",
"LabelDateAdded": "Datumu dodavanja",
"LabelDateAdded": "Datum dodavanja:",
"LabelDateAddedBehavior": "Ponašanje datuma dodanog za novi sadržaj:",
"LabelDateAddedBehaviorHelp": "Ako je prisutna vrijednost meta-podataka uvijek će se koristiti prije bilo kojih od ovih opcija.",
"LabelDay": "Dan:",
@ -384,29 +384,29 @@
"LabelDefaultUser": "Zadani korisnik:",
"LabelDefaultUserHelp": "Određuje koja će biblioteka biti prikazana na spojenim uređajima. Ovo se može zaobići za svaki uređaj koristeći profile.",
"LabelDeviceDescription": "Opis uređaja",
"LabelDidlMode": "Didl način:",
"LabelDidlMode": "DIDL način:",
"LabelDisplayMissingEpisodesWithinSeasons": "Prikaži epizode koje nedostaju unutar sezone",
"LabelDisplayName": "Prikaz naziva:",
"LabelDisplayOrder": "Poredak prikaza:",
"LabelDisplaySpecialsWithinSeasons": "Prikaz specijalnih dodataka unutar sezona u kojima su emitirani",
"LabelDownMixAudioScale": "Pojačaj zvuk kada radiš downmix:",
"LabelDownMixAudioScaleHelp": "Pojačaj zvuk kada radiš downmix. Postavi na 1 ako želiš zadržati orginalnu jačinu zvuka.",
"LabelDownMixAudioScaleHelp": "Pojačaj zvuk prilikom downmix-a. Vrijednost 1 će zadržati originalnu jačinu zvuka.",
"LabelDownloadLanguages": "Jezici za preuzimanje:",
"LabelEasyPinCode": "Lagan PIN kod:",
"LabelEmbedAlbumArtDidl": "Ugradi grafike albuma u Didl",
"LabelEmbedAlbumArtDidlHelp": "Neki uređaji podržavaju ovu metodu za prikaz grafike albuma. Drugi bi mogli imati problema sa ovom opcijom uključenom.",
"LabelEnableAutomaticPortMap": "Omogući automatsko mapiranje porta",
"LabelEnableAutomaticPortMapHelp": "Pokušaj automatski mapirati javni port za lokalni port preko UPnP. Možda neće raditi s nekim modelima router-a.",
"LabelEnableAutomaticPortMapHelp": "Automatski proslijedi javni port na svom ruteru na lokalni port preko UPnP. Možda neće raditi sa nekim modelima router-a ili mrežnim konfiguracijama. Promjene se neće primijeniti do restarta servera.",
"LabelEnableBlastAliveMessages": "Objavi poruke dostupnosti",
"LabelEnableBlastAliveMessagesHelp": "Omogući ovo ako server nije prikazan kao siguran za druge UPnP uređaje na mreži.",
"LabelEnableDlnaClientDiscoveryInterval": "Interval za otkrivanje kljenata (sekunde)",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Određuje trajanje u sekundama između SSDP pretraživanja obavljenih od Jellyfin-a.",
"LabelEnableDlnaDebugLogging": "Omogući DLNA logiranje grešaka.",
"LabelEnableDlnaDebugLoggingHelp": "Ovo će kreirati iznimno velike log datoteke i jedino se preporuča koristiti u slučaju problema.",
"LabelEnableDlnaDebugLogging": "Omogući DLNA logiranje grešaka",
"LabelEnableDlnaDebugLoggingHelp": "Kreiraj iznimno velike log datoteke i preporuča se koristiti jedino u slučaju problema.",
"LabelEnableDlnaPlayTo": "Omogući DLNA izvođenje na",
"LabelEnableDlnaPlayToHelp": "Jellyfin može otkriti uređaje unutar svoje mreže i ponuditi mogućnost da ih daljinski upravlja.",
"LabelEnableDlnaServer": "Omogući Dlna server",
"LabelEnableDlnaServerHelp": "Omogućuje UPnP uređajima na mreži da pregledavaju i pokreću Jellyfin sadržaj.",
"LabelEnableDlnaPlayToHelp": "Otkrij uređaje unutar svoje mreže i ponudi mogućnost da ih daljinski upravlja.",
"LabelEnableDlnaServer": "Omogući DLNA server",
"LabelEnableDlnaServerHelp": "Omogućuje UPnP uređajima na mreži da pregledavaju i pokreću sadržaj.",
"LabelEnableRealtimeMonitor": "Omogući nadgledanje u realnom vremenu",
"LabelEnableRealtimeMonitorHelp": "Promjene će biti procesuirane odmah, nad podržanim datotekama sistema.",
"LabelEnableSingleImageInDidlLimit": "Ograničenje na jednu ugrađenu sliku",
@ -416,12 +416,12 @@
"LabelEvent": "Događaj:",
"LabelEveryXMinutes": "Svaki:",
"LabelExtractChaptersDuringLibraryScan": "Izvadi slike poglavlja dok traje skeniranje biblioteke",
"LabelExtractChaptersDuringLibraryScanHelp": "Ako je omogućeno, slike poglavlje će se izdvojiti kad se videozapisi uvezu tijekom skeniranja biblioteke. Ako je onemogućeno izdvojiti će se u rasporedu zadatka slika poglavlja, čime se omogućuje da se skeniranje redovne biblioteke završiti brže.",
"LabelExtractChaptersDuringLibraryScanHelp": "Generiraj slike poglavlje kad se videozapisi uvezu tijekom skeniranja biblioteke. U suprotnom, izdvajanje će se odraditi u rasporedu zadatka slika poglavlja, čime se omogućuje da se skeniranje redovne biblioteke završi brže.",
"LabelFailed": "Neuspješno",
"LabelFileOrUrl": "Datoteka ili url:",
"LabelFinish": "Kraj",
"LabelForgotPasswordUsernameHelp": "Unesite korisničko ime, ako se sjećate.",
"LabelFriendlyName": "Prijateljsko ime",
"LabelFriendlyName": "Prijateljsko ime:",
"LabelServerNameHelp": "Ovo ime će se koristiti za identifikaciju servera. Ako ostavite prazno, ime računala će se koristi kao identifikator.",
"LabelGroupMoviesIntoCollections": "Grupiraj filmove u kolekciju",
"LabelGroupMoviesIntoCollectionsHelp": "Kada se prikazuje lista filmova, filmovi koji pripadaju kolekciji biti će prikazani kao jedna stavka.",
@ -475,7 +475,7 @@
"LabelMetadataDownloadersHelp": "Omogućite i poredajte željene preuzimatelje meta-podataka po redu prioriteta. Manjeg prioriteta preuzimatelji koristit će se samo za ispunjavanje nedostajućih informacija.",
"LabelMetadataPath": "Put meta-podataka:",
"LabelMetadataPathHelp": "Odredite prilagođenu lokaciju za preuzete ilustracije i meta-podatke.",
"LabelMetadataReaders": "Čitači meta-podataka",
"LabelMetadataReaders": "Čitači meta-podataka:",
"LabelMetadataReadersHelp": "Poredajte željene lokalne izvore meta-podataka po redu prioriteta. Prva nađena datoteka biti će čitana.",
"LabelMetadataSavers": "Snimači meta-podataka:",
"LabelMetadataSaversHelp": "Odaberite formate datoteka za spremanje meta-podataka.",
@ -567,7 +567,7 @@
"LabelStopWhenPossible": "Zaustavi kada je moguće:",
"LabelStopping": "Zaustavljanje",
"LabelSubtitleFormatHelp": "Npr.: srt",
"LabelSubtitlePlaybackMode": "Način titlova prijevoda",
"LabelSubtitlePlaybackMode": "Način prijevoda:",
"LabelSupportedMediaTypes": "Podržani tipovi medija:",
"LabelTag": "Oznaka:",
"LabelTagline": "Slogan:",
@ -652,15 +652,15 @@
"MessageDirectoryPickerBSDInstruction": "Za BSD možda ćete morati podesiti pohranu unutar vašega FreeNAS kako bi se omogućilo Jellyfin-u pristup.",
"MessageDirectoryPickerInstruction": "Mrežne putanje mogu se unijeti ručno u slučaju da gumb Mreže ne uspije locirati vaše uređaje. Na primjer, {0} ili {1}.",
"MessageDirectoryPickerLinuxInstruction": "Za Linux na Arch Linux, CentOS, Debian, Fedora, OpenSuse ili Ubuntu morate dati korisniku Jellyfin sistema barem pristup čitanja vašim lokacijama za skladištenje.",
"MessageDownloadQueued": "Preuzimanje na čekanju",
"MessageFileReadError": "Prilikom učitavanja datoteke desila se greška",
"MessageDownloadQueued": "Preuzimanje na čekanju.",
"MessageFileReadError": "Prilikom učitavanja datoteke desila se greška. Pokušajte ponovno.",
"MessageForgotPasswordFileCreated": "Sljedeća datoteka je stvorena na vašem poslužitelju i sadrži upute o tome kako postupiti:",
"MessageForgotPasswordInNetworkRequired": "Molim pokušajte ponovno unutar kućne mreže za pokretanje postupka za poništavanje zaporke.",
"MessageInstallPluginFromApp": "Ovaj dodatak mora biti instaliran unutar aplikacije u kojoj ga namjeravate koristiti.",
"MessageInvalidForgotPasswordPin": "Upisan je neispravan ili zastarjele pin. Molim, pokušajte ponovno.",
"MessageInvalidUser": "Pogrešno korisničko ime ili lozinka. Molim, pokušajte ponovo.",
"MessageItemSaved": "Stavka je snimljena.",
"MessageItemsAdded": "Stavke su dodane",
"MessageItemsAdded": "Stavke su dodane.",
"MessageLeaveEmptyToInherit": "Ostavite prazno da naslijedi postavke od roditelja stavke ili globalnu zadanu vrijednost.",
"MessageNoAvailablePlugins": "Nema odgovarajućih dodataka.",
"MessageNoMovieSuggestionsAvailable": "Filmski prijedlozi nisu trenutno dostupni. Počnite s gledanjem i ocjenjivanjem svoje filmove, a zatim se vratite da biste vidjeli svoje preporuke.",
@ -672,7 +672,7 @@
"MessagePluginConfigurationRequiresLocalAccess": "Za podešavanje ovog dodatka prijavite se izravno na lokalni server.",
"MessagePluginInstallDisclaimer": "Dodaci izgrađeni od strane članova Jellyfin zajednice su sjajan način kako bi unaprijedili Vaše iskustvo Jellyfin s dodatnim značajkama i prednostima. Prije instaliranja budite svjesni učinaka koje mogu imati na vaš Jellyfin Server, kao što je duže skeniranje biblioteke, dodatna pozadinska obrada, a smanjena stabilnost sustava.",
"MessageReenableUser": "Pogledajte dolje za ponovno omogućenje",
"MessageSettingsSaved": "Postavke snimljene",
"MessageSettingsSaved": "Postavke spremljene.",
"MessageTheFollowingLocationWillBeRemovedFromLibrary": "Sljedeće lokacije medija biti će uklonjene iz vaše Jellyfin biblioteke:",
"MessageUnableToConnectToServer": "Nismo u mogućnosti spojiti se na odabrani poslužitelj. Provjerite dali je pokrenut i pokušajte ponovno.",
"MessageUnsetContentHelp": "Sadržaj će biti prikazan kao obične mape. Za najbolje rezultate upotrijebite upravitelj meta-podataka za postavljanje vrste sadržaja pod-mapa.",
@ -785,14 +785,14 @@
"OptionMissingEpisode": "Epizode koje nedostaju",
"OptionMonday": "Ponedjeljak",
"OptionNameSort": "Nazivu",
"OptionNew": "Novo...",
"OptionNew": "Novo",
"OptionNone": "Ništa",
"OptionOnAppStartup": "Kada se aplikacija pokrene",
"OptionOnInterval": "U intervalu",
"OptionParentalRating": "Roditeljska ocjena",
"OptionPlainStorageFolders": "Prikaži sve mape kako jednostavne mape za skladištenje",
"OptionPlainStorageFoldersHelp": "Ako je omogućeno, sve mape se prezentiraju u DIDL-u kao \"objekt.spremnik.skladišnaMapa\" umjesto više specijaliziranog tipa kao \"objekt.spremnik.osoba.glazbaIzvođač\".",
"OptionPlainVideoItems": "Prikaži sav video kao jednostavne video stavke.",
"OptionPlainVideoItems": "Prikaži sve video zapise kao jednostavne video stavke",
"OptionPlainVideoItemsHelp": "Ako je omogućeno, sav video se prezentira u DIDL-u kao \"objekt.stavka.videoStavka\" umjesto više specijaliziranog tipa kao \"objekt.stavka.videoStavka.film\".",
"OptionPlayCount": "Broju izvođenja",
"OptionPlayed": "Izvođeni",
@ -862,7 +862,7 @@
"RecordingScheduled": "Snimka je zakazana.",
"Refresh": "Osviježi",
"RefreshDialogHelp": "Meta-podaci se osvježavaju na temelju postavki i internet usluga koje su omogućene u nadzornoj ploči Jellyfin Server-a.",
"RefreshQueued": "Osviježi stavke na čekanju",
"RefreshQueued": "Osviježi stavke na čekanju.",
"ReleaseDate": "Datum izdavanja",
"RememberMe": "Zapamti me",
"RemoveFromCollection": "Ukloni iz kolekcije",
@ -890,7 +890,7 @@
"ServerNameIsShuttingDown": "Jellyfin Server - {0} se gasi.",
"ServerUpdateNeeded": "Jellyfin Server treba ažurirati. Da biste preuzeli najnoviju verziju, posjetite {0}",
"Settings": "Postavke",
"SettingsSaved": "Postavke snimljene",
"SettingsSaved": "Postavke spremljene.",
"SettingsWarning": "Mijenjanje ove vrijednosti može uzrokovati nestabilnost ili kvarove na povezivanju. Ako naiđete na bilo kakve probleme, preporučamo da ih promijenite natrag na zadane.",
"Share": "Dijeli",
"ShowIndicatorsFor": "Prikaži pokazatelja za:",
@ -1006,9 +1006,237 @@
"AccessRestrictedTryAgainLater": "Dostup je trenutačno ograničen. Pokušajte poslije ponovno.",
"Albums": "Albumi",
"All": "Sve",
"AllComplexFormats": "Svi kompleksni formati (ASS, SSA, VOBSUB, PGS, SUB/IDX, itd.)",
"AllComplexFormats": "Svi kompleksni formati (ASS, SSA, VOBSUB, PGS, SUB, IDX, ...)",
"Books": "Knjige",
"Channels": "Kanali",
"Collections": "Kolekcije",
"Artists": "Izvođači"
"Artists": "Izvođači",
"DownloadsValue": "{0} preuzimanja",
"Down": "Dolje",
"Playlists": "Popis za reprodukciju",
"AllowMediaConversionHelp": "Dopusti ili odbij pristup mogućnosti konverzije datoteke.",
"AllLibraries": "Sve biblioteke",
"Aired": "Prikazano",
"AirDate": "Datum prikazivanja",
"AddedOnValue": "Dodano {0}",
"Songs": "Pjesme",
"Shows": "Serije",
"Photos": "Slike",
"HeaderFavoriteSongs": "Omiljene pjesme",
"HeaderFavoriteArtists": "Omiljeni izvođači",
"HeaderFavoriteAlbums": "Omiljeni albumi",
"HeaderFavoriteEpisodes": "Omiljene epizode",
"HeaderFavoriteShows": "Omiljene serije",
"HeaderContinueWatching": "Nastavi gledati",
"HeaderAlbumArtists": "Izvođači na albumu",
"Folders": "Mape",
"Favorites": "Favoriti",
"ButtonCast": "Uloge",
"EveryXHours": "Svakih {0} sati",
"EveryHour": "Svaki sat",
"OnApplicationStartup": "Prilikom pokretanja aplikacije",
"Backdrop": "Pozadina",
"Auto": "Automatski",
"Audio": "Audio",
"Artist": "Izvođač",
"AnyLanguage": "Bilo koji jezik",
"AlwaysPlaySubtitlesHelp": "Prijevodi koji odgovaraju odabranom jeziku će uvijek biti odabrani unatoč jeziku audio zapisa.",
"AlwaysPlaySubtitles": "Uvijek prikaži prijevod",
"AllowRemoteAccessHelp": "Ako je odznačeno, svi udaljeni pristupi će biti blokirani.",
"AllowRemoteAccess": "Dopusti udaljene pristupe na ovaj Jellyfin server.",
"AllowOnTheFlySubtitleExtraction": "Dopusti izvlačenje prijevoda u hodu",
"AllowMediaConversion": "Dopusti konverziju datoteke",
"AllLanguages": "Svi jezici",
"Alerts": "Upozorenja",
"AlbumArtist": "Izvođač na albumu",
"Album": "Album",
"AddToPlayQueue": "Dodaj u red izvođenja",
"Banner": "Zaglavlje",
"AutoBasedOnLanguageSetting": "Automatski (prema jezičnim postavkama)",
"AspectRatio": "Omjer",
"Ascending": "Uzlazno",
"Art": "Grafike",
"Absolute": "Apsolutno",
"CopyStreamURLSuccess": "URL uspješno kopiran.",
"CopyStreamURL": "Kopiraj URL streama",
"ContinueWatching": "Nastavi gledati",
"Connect": "Spoji",
"ClientSettings": "Postavke klijenta",
"ButtonTogglePlaylist": "Lista izvođenja",
"ButtonToggleContextMenu": "Više",
"ButtonSplit": "Odvoji",
"ButtonStop": "Stop",
"ButtonScanAllLibraries": "Skeniraj sve biblioteke",
"ButtonInfo": "Info",
"ButtonFilter": "Filtriraj",
"ButtonAddImage": "Dodaj sliku",
"Box": "Kutija",
"AskAdminToCreateLibrary": "Traži administratora da kreira biblioteku.",
"PictureInPicture": "Slika u slici",
"OtherArtist": "Ostali izvođači",
"OptionThumb": "Sličica",
"OptionProtocolHttp": "HTTP",
"OptionProfileVideo": "Video",
"OptionProfileAudio": "Audio",
"OptionPoster": "Poster",
"OptionList": "Lista",
"OptionIsSD": "SD",
"OptionIsHD": "HD",
"OptionDvd": "DVD",
"OptionDownloadLogoImage": "Logo",
"OptionBluray": "Blu-ray",
"OptionBanner": "Zaglavlje",
"Option3D": "3D",
"OneChannel": "Jedan kanal",
"Off": "Isključi",
"Normal": "Normalno",
"None": "Ništa",
"NoSubtitles": "Ništa",
"No": "Ne",
"NextUp": "Slijedi",
"Next": "Slijedeće",
"Never": "Nikada",
"MusicVideo": "Glazbeni spot",
"Movie": "Film",
"Metadata": "Meta podaci",
"MessageSyncPlayLibraryAccessDenied": "Pristup ovom sadržaju je ograničen.",
"MessageSyncPlayDisabled": "SyncPlay onemogućen.",
"MessageSyncPlayEnabled": "SyncPlay omogućen.",
"MessagePleaseWait": "Molimo pričekajte. Ovo može potrajati nekoliko minuta.",
"LabelRepositoryName": "Naziv repozitorija",
"LabelRepositoryUrl": "URL repozitorija",
"HeaderNewRepository": "Novi repozitorij",
"MessageNoRepositories": "Nema repozitorija.",
"MessageConfirmAppExit": "Da li želite izaći?",
"Menu": "Meni",
"MediaInfoStreamTypeVideo": "Video",
"MediaInfoStreamTypeSubtitle": "Prijevod",
"MediaInfoStreamTypeData": "Podaci",
"MediaInfoStreamTypeAudio": "Audio",
"MediaInfoSoftware": "Softver",
"Logo": "Logo",
"List": "Lista",
"LabelYear": "Godina:",
"LabelVideo": "Video",
"DashboardArchitecture": "Arhitektura: {0}",
"DashboardOperatingSystem": "Operativni sustav: {0}",
"DashboardServerName": "Server: {0}",
"DashboardVersionNumber": "Verzija: {0}",
"LabelVersion": "Verzija:",
"LabelTheme": "Tema:",
"LabelTextSize": "Veličina teksta:",
"LabelTextColor": "Boja teksta:",
"LabelSyncPlayAccess": "SyncPlay pristup",
"LabelSyncPlayAccessNone": "Onemogućeno za ovog korisnika",
"LabelSyncPlayAccessJoinGroups": "Dozvoli korisniku da se pridruži grupama",
"LabelSyncPlayAccessCreateAndJoinGroups": "Dozvoli korisniku da kreira i pridruži se grupama",
"LabelSyncPlayLeaveGroupDescription": "Onemogući SyncPlay",
"LabelSyncPlayLeaveGroup": "Napusti grupu",
"LabelSyncPlayNewGroupDescription": "Kreiraj novu grupu",
"LabelSyncPlayNewGroup": "Nova grupa",
"MillisecondsUnit": "ms",
"LabelSubtitles": "Prijevodi",
"LabelStatus": "Status:",
"LabelSoundEffects": "Zvučni efekti:",
"LabelSortOrder": "Redoslijed sortiranja:",
"LabelSortBy": "Sortiranje po:",
"LabelSize": "Veličina:",
"LabelServerName": "Naziv servera:",
"EnableFasterAnimations": "Brže animacije",
"LabelReasonForTranscoding": "Razlog transkodiranja:",
"LabelPreferredSubtitleLanguage": "Preferirani jezik prijevoda:",
"LabelStable": "Stabilna",
"LabelLanNetworks": "LAN mreže:",
"LabelInternetQuality": "Internet kvaliteta:",
"LabelHomeNetworkQuality": "Kvaliteta kućne mreže:",
"LabelFormat": "Format:",
"LabelFont": "Font:",
"LabelFolder": "Mapa:",
"LabelEnableHttps": "Omogući HTTPS",
"LabelEnableHardwareDecodingFor": "Omogući hardversko dekodiranje za:",
"LabelDisplayLanguageHelp": "Prevođenje Jellyfin-a je projekt u tijeku.",
"LabelDisplayLanguage": "Jezik prikaza:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Automatski osvježi meta podatke sa interneta:",
"LabelAudioChannels": "Audio kanali:",
"LabelAudio": "Audio",
"LabelAlbum": "Album:",
"Label3DFormat": "3D format:",
"Items": "Stavke",
"Horizontal": "Horizontalno",
"Home": "Početna",
"Hide": "Sakrij",
"HeaderSyncPlayEnabled": "SyncPlay omogućen",
"HeaderSyncPlaySelectGroup": "Pridruži se grupi",
"HeaderSubtitleDownloads": "Preuzimanje prijevoda",
"HeaderSubtitleAppearance": "Prikaz prijevoda",
"HeaderStopRecording": "Zaustavi snimanje",
"HeaderStatus": "Status",
"HeaderSeriesStatus": "Status serije",
"HeaderSecondsValue": "{0} sekundi",
"HeaderRemoteAccessSettings": "Postavke udaljenog pristupa",
"HeaderPlaybackError": "Pogreška reprodukcije",
"HeaderPlayAll": "Reproduciraj sve",
"HeaderOnNow": "Trenutno",
"HeaderNextVideoPlayingInValue": "Slijedeći video se reproducira za {0}",
"HeaderNextEpisodePlayingInValue": "Slijedeća epizoda se reproducira za {0}",
"HeaderNewDevices": "Novi uređaji",
"HeaderNavigation": "Navigacija",
"HeaderMyDevice": "Moj uređaj",
"HeaderLibrarySettings": "Postavke biblioteke",
"HeaderHome": "Početna",
"HeaderGenres": "Žanrovi",
"HeaderFavoritePeople": "Omiljeni ljudi",
"HeaderFavoriteMovies": "Omiljeni filmovi",
"HeaderFavoriteBooks": "Omiljene knjige",
"HeaderDVR": "DVR",
"HeaderDownloadSync": "Preuzmi i sinkroniziraj",
"HeaderContinueListening": "Nastavi slušati",
"HeaderConfigureRemoteAccess": "Konfiguriraj udaljeni pristup",
"HeaderAudioBooks": "Audio knjige",
"ApiKeysCaption": "Popis trenutno dostupnih API ključeva",
"HeaderAllowMediaDeletionFrom": "Dozvoli brisanje datoteka iz",
"HeaderAlbums": "Albumi",
"HeaderAdmin": "Administrator",
"Guide": "Vodič",
"GroupBySeries": "Grupiraj po serijama",
"Genre": "Žanr",
"General": "Općenito",
"Fullscreen": "Prikaz cijelog ekrana",
"Filters": "Filteri",
"FetchingData": "Dohvaćanje dodatnih podataka",
"Features": "Mogućnosti",
"Extras": "Dodaci",
"ExtraLarge": "Ekstra veliko",
"ExitFullscreen": "Izađi iz prikaza cijelog ekrana",
"EveryNDays": "Svakih {0} dana",
"Episodes": "Epizode",
"Episode": "Epizoda",
"EnableHardwareEncoding": "Omogući hardversko enkodiranje",
"EnableExternalVideoPlayers": "Vanjski video player",
"EnableDecodingColorDepth10Vp9": "Omogući 10-Bitno hardversko dekodiranje za VP9",
"EnableDecodingColorDepth10Hevc": "Omogući 10-Bitno hardversko dekodiranje za HEVC",
"EnableCinemaMode": "Kino mod",
"EnableBackdrops": "Pozadine",
"EditMetadata": "Izmijeni meta podatke",
"DisplayMissingEpisodesWithinSeasons": "Prikaži epizode koje nedostaju unutar sezona",
"DisplayInMyMedia": "Prikaz na početnom ekranu",
"Display": "Prikaz",
"Disconnect": "Odspoji",
"Disc": "Disk",
"Disabled": "Onemogućeno",
"Directors": "Režiseri",
"DirectPlaying": "Direktna reprodukcija",
"DetectingDevices": "Tražim uređaje",
"Descending": "Silazno",
"DefaultMetadataLangaugeDescription": "Ovo su vaše zadane postavke te se mogu prilagoditi na razini biblioteke.",
"Default": "Zadano",
"DatePlayed": "Datum reprodukcije",
"DateAdded": "Datum dodavanja",
"CriticRating": "Rejting kritičara",
"CopyStreamURLError": "Došlo je do greške prilikom kopiranja URLa.",
"ConfirmEndPlayerSession": "Da li želite ugasiti Jellyfin na {0}?",
"CommunityRating": "Rejting zajednice",
"Browse": "Pretraži",
"BoxRear": "Kutija (stražnja)",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1562,6 +1562,14 @@
"MessageNoGenresAvailable": "Engedélyezz néhány metaadat szolgáltatót, hogy műfaj adatokat tölthess le az internetről.",
"EnableFasterAnimationsHelp": "Gyorsabb animációk és áttűnések használata",
"EnableFasterAnimations": "Gyorsabb animációk",
"EnableDecodingColorDepth10Vp9": "10 bites hardveres dekódolás engedélyezése Vp9-hez",
"EnableDecodingColorDepth10Hevc": "10 bites hardveres dekódolás engedélyezése HEVC-hez"
"EnableDecodingColorDepth10Vp9": "10 bites hardveres dekódolás engedélyezése VP9-hez",
"EnableDecodingColorDepth10Hevc": "10 bites hardveres dekódolás engedélyezése HEVC-hez",
"TabRepositories": "Tárolók",
"MessageAddRepository": "Ha új tárolót szeretnél hozzáadni, kattints a gombra a fejlécben, és add meg a szükséges adatokat.",
"LabelRepositoryNameHelp": "Egy egyedi név, amivel megkülönböztetheted a tárolót a többi, a szervezhez hozzáadott tárolótól.",
"LabelRepositoryName": "Tároló neve",
"LabelRepositoryUrlHelp": "A hivatkozni kívánt tároló manifeszt helye.",
"LabelRepositoryUrl": "Tároló URL-je",
"HeaderNewRepository": "Új tároló",
"MessageNoRepositories": "Nincs tároló."
}

View file

@ -204,5 +204,6 @@
"Alerts": "Peringatan",
"AddedOnValue": "Ditambahkan {0}",
"AllowFfmpegThrottling": "Transcode Tercekik",
"AllowOnTheFlySubtitleExtractionHelp": "Subtitle yang melekat di video dapat dikeluarkan dan dikirimkan kepada klien dalam bentuk text biasa dengan tujuan untuk menghalau terjadinya transcoding pada video. Pada beberapa system ini membutuhkan waktu yang lama dan dapat menyebabkan video playback menjadi terhenti dikarenakan proses ekstraksi. Non-aktifkan fitur ini untuk membiarkan subtitle langsung dilekatkan kepada video dengan cara transcoding ketika klien tidak mendukung fitur ini."
"AllowOnTheFlySubtitleExtractionHelp": "Subtitle yang melekat di video dapat dikeluarkan dan dikirimkan kepada klien dalam bentuk text biasa dengan tujuan untuk menghalau terjadinya transcoding pada video. Pada beberapa system ini membutuhkan waktu yang lama dan dapat menyebabkan video playback menjadi terhenti dikarenakan proses ekstraksi. Non-aktifkan fitur ini untuk membiarkan subtitle langsung dilekatkan kepada video dengan cara transcoding ketika klien tidak mendukung fitur ini.",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -547,5 +547,6 @@
"ConfirmDeleteItems": "Ef þessum skrám er eytt verða þær fjarlægðar úr bæði stýrikerfinu og miðlasafninu. Ertu viss um að þú viljir halda áfram?",
"CommunityRating": "Mat samfélagsins",
"ButtonStart": "Byrja",
"BoxSet": "Kassasett"
"BoxSet": "Kassasett",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1508,7 +1508,7 @@
"LabelChromecastVersion": "Versione Chromecast",
"LabelRequireHttpsHelp": "Se selezionata, il server reindirizzerà tutte le richieste HTTP a HTTPS. Vale solo se il sever è configurato per l'ascolto in HTTPS.",
"LabelRequireHttps": "Richiede HTTPS",
"LabelEnableHttpsHelp": "Abilita il server all'ascolto sulla porta HTTPS. Il certificato deve essere configurato e valido per l'abilitazione.",
"LabelEnableHttpsHelp": "Abilita il server all'ascolto sulla porta HTTPS configurata. Il certificato deve essere configurato e valido per l'abilitazione.",
"LabelEnableHttps": "Abilita HTTPS",
"HeaderServerAddressSettings": "Configurazione Indirizzo Server",
"HeaderRemoteAccessSettings": "Configurazione Access Remoto",
@ -1517,7 +1517,7 @@
"SaveChanges": "Salva modifiche",
"HeaderDVR": "DVR",
"LabelNightly": "Nightly",
"SyncPlayAccessHelp": "Scegli il livello d'accesso di questo utente a SyncPlay. SyncPlay ti permette di riprodurre contemporaneamente su diversi dispositivi.",
"SyncPlayAccessHelp": "Selezionare il livello d'accesso di questo utente a SyncPlay che permetterà di riprodurre contemporaneamente su diversi dispositivi.",
"MessageSyncPlayErrorMedia": "Impossibile abilitare SyncPlay! Errore media.",
"MessageSyncPlayErrorMissingSession": "Impossibile abilitare SyncPlay! Sessione mancante.",
"MessageSyncPlayErrorNoActivePlayer": "Nessun player attivo. SyncPlay è stato disabilitato.",
@ -1567,5 +1567,6 @@
"LabelRepositoryUrlHelp": "URL del repository manifest che si vuole includere.",
"LabelRepositoryUrl": "URL Repository",
"HeaderNewRepository": "Nuovo Repository",
"MessageNoRepositories": "Nessun repository."
"MessageNoRepositories": "Nessun repository.",
"ButtonPlayer": "Player"
}

View file

@ -1143,5 +1143,6 @@
"ClientSettings": "クライアント設定",
"Artist": "アーティスト",
"AlbumArtist": "アルバム アーティスト",
"Album": "アルバム"
"Album": "アルバム",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1543,5 +1543,6 @@
"HeaderRemoteAccessSettings": "Qashyqtan qatynaý parametrleri",
"HeaderHttpsSettings": "HTTPS parametrleri",
"HeaderFavoritePlaylists": "Tańdaýly oınatý tizimder",
"HeaderDVR": "DVR"
"HeaderDVR": "DVR",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1429,5 +1429,6 @@
"ButtonToggleContextMenu": "더보기",
"Rate": "평",
"PerfectMatch": "정확히 일치",
"OtherArtist": "다른 아티스트"
"OtherArtist": "다른 아티스트",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1014,5 +1014,6 @@
"ButtonToggleContextMenu": "Daugiau",
"ButtonSplit": "Skirstyti",
"AskAdminToCreateLibrary": "Prašyti administratoriaus, kad sukurtų mediateka.",
"Album": "Albumas"
"Album": "Albumas",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -602,14 +602,14 @@
"AsManyAsPossible": "Cik vien iespējams",
"Artists": "Izpildītāji",
"Art": "Māksla",
"AroundTime": "Ap {0}",
"AroundTime": "Ap",
"Anytime": "Jebkad",
"AnyLanguage": "Jebkura Valoda",
"AlwaysPlaySubtitles": "Vienmēr Rādīt",
"AllowedRemoteAddressesHelp": "Ar komatiem atdalīts IP adrešu vai IP/tīkla masku saraksts, kas norāda uz tīkliem, kas var pieslēgties attālināti. Ja atstāts tukšs, visas attālinātās adreses tiks atļautas.",
"AllowRemoteAccessHelp": "Ja atķeksēts, visi attālinātie savienojumi tiks bloķēti.",
"AllowRemoteAccess": "Atļaut attālinātus savienojumus šim Jellyfin Serverim.",
"AllowOnTheFlySubtitleExtraction": " ",
"AllowOnTheFlySubtitleExtraction": "Atļaut subtitru izvilkšanu atskaņošanas laikā",
"AllowMediaConversion": "Atļaut multimēdiju pārveidošanu",
"AllLibraries": "Visas bibliotēkas",
"AllLanguages": "Visas valodas",
@ -1231,5 +1231,7 @@
"MessageUnauthorizedUser": "Jūs neesat autorizēti lai piekļūtu serverim šajā brīdī. Lūdzu sazinieties ar savu servera administratoru priekš papildus informācijas.",
"MessageInstallPluginFromApp": "Šis paplašinājums ir jāuzstāda no lietotnes, kurā jūs to vēlaties izmantot.",
"LabelEmbedAlbumArtDidl": "Ievietot albumu vākus iekš Didl",
"LabelSelectFolderGroups": "Automātiski grupēt saturu no sekojošām datnēm skatos kā Filmas, Mūzika un TV:"
"LabelSelectFolderGroups": "Automātiski grupēt saturu no sekojošām datnēm skatos kā Filmas, Mūzika un TV:",
"AllowFfmpegThrottlingHelp": "Kad trans-kodējums vai remux tiek pietiekami tālu priekšā pašreizējai atskaņošanas vietai, process tiks pauzēts lai patērētu mazāk resursu. Tas ir noderīgākais skatoties bez biežas pārlēkšanas. Atspējo šo ja saskaries ar atskaņošanas problēmām.",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -97,5 +97,6 @@
"ButtonRemove": "काढून टाका",
"ButtonPreviousTrack": "मागचा ट्रॅक",
"ButtonPlay": "प्ले",
"ButtonPause": "पॉझ"
"ButtonPause": "पॉझ",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -102,5 +102,6 @@
"HeaderContinueWatching": "Terus Menonton",
"Genres": "Genre-genre",
"Collections": "Koleksi",
"Channels": "Saluran"
"Channels": "Saluran",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1552,5 +1552,6 @@
"HeaderDVR": "Opptak",
"ApiKeysCaption": "Liste over aktive API-nøkler",
"EnableDetailsBannerHelp": "Viser et bildebanner øverst på detaljsiden.",
"EnableDetailsBanner": "Detaljebanner"
"EnableDetailsBanner": "Detaljebanner",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1558,5 +1558,6 @@
"HeaderRemoteAccessSettings": "Externe toegang instellingen",
"HeaderHttpsSettings": "HTTPS instellingen",
"HeaderDVR": "DVR",
"ApiKeysCaption": "Lijst met de momenteel ingeschakelde API-sleutels"
"ApiKeysCaption": "Lijst met de momenteel ingeschakelde API-sleutels",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1479,5 +1479,6 @@
"DeinterlaceMethodHelp": "Wybierz metodę usuwania przeplotu używaną podczas transkodowania.",
"ClientSettings": "Ustawienia klienta",
"ButtonTogglePlaylist": "Playlista",
"ButtonToggleContextMenu": "Więcej"
"ButtonToggleContextMenu": "Więcej",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -22,5 +22,6 @@
"HeaderCastCrew": "Mateys",
"Add": "Upend",
"Actor": "Privateer",
"AccessRestrictedTryAgainLater": "Ye arn't appearin' on the list o' the livin'!"
"AccessRestrictedTryAgainLater": "Ye arn't appearin' on the list o' the livin'!",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1511,7 +1511,7 @@
"LabelNightly": "Nightly",
"LabelStable": "Estável",
"LabelChromecastVersion": "Versão do Chromecast",
"LabelEnableHttpsHelp": "Habilita que o servidor escute na porta HTTPS configurada. Um certificado válido também deve ser configurado para que isso entre em vigor.",
"LabelEnableHttpsHelp": "Permite que o servidor escute na porta HTTPS configurada. Um certificado válido também deve ser configurado para que isso entre em vigor.",
"LabelEnableHttps": "Habilitar HTTPS",
"HeaderServerAddressSettings": "Configurações da localização do servidor",
"HeaderRemoteAccessSettings": "Configurações de acesso remoto",
@ -1567,5 +1567,7 @@
"LabelRepositoryUrlHelp": "A localização do manifesto do repositório que você deseja incluir.",
"LabelRepositoryUrl": "URL do repositório",
"HeaderNewRepository": "Novo repositório",
"MessageNoRepositories": "Não há repositórios."
"MessageNoRepositories": "Não há repositórios.",
"ButtonPlayer": "Reprodutor",
"Writers": "Escritores"
}

View file

@ -1452,5 +1452,6 @@
"AllowFfmpegThrottlingHelp": "Suspende o processo de transcodificação assim que este avance o suficiente após o ponto de reprodução atual, para poupança de recursos. Esta funcionalidade é mais útil quando a reprodução é maioritariamente contínua, sem avançar ou recuar manualmente. Desative esta opção caso haja problemas de reprodução.",
"AllowFfmpegThrottling": "Reduzir Taxa de Transcodificação",
"PreferEmbeddedTitlesOverFileNamesHelp": "Determina o título a apresentar por defeito quando não é possível carregar metadados locais nem da Internet.",
"OptionSaveMetadataAsHiddenHelp": "Alterar esta definição apenas afetará metadados guardados futuramente. Ficheiros existentes serão atualizados assim que forem alterados pelo Servidor Jellyfin."
"OptionSaveMetadataAsHiddenHelp": "Alterar esta definição apenas afetará metadados guardados futuramente. Ficheiros existentes serão atualizados assim que forem alterados pelo Servidor Jellyfin.",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1416,5 +1416,6 @@
"HeaderDVR": "DVR",
"ApiKeysCaption": "Lista das chaves de API ativadas no momento",
"ButtonTogglePlaylist": "Lista de leitura",
"ButtonToggleContextMenu": "Mais"
"ButtonToggleContextMenu": "Mais",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1558,5 +1558,15 @@
"EnableFasterAnimationsHelp": "Utilizați animații și tranziții mai rapide",
"EnableFasterAnimations": "Animații mai rapide",
"EnableDecodingColorDepth10Vp9": "Activați decodarea hardware pe 10 biți pentru VP9",
"EnableDecodingColorDepth10Hevc": "Activați decodarea hardware pe 10 biți pentru HEVC"
"EnableDecodingColorDepth10Hevc": "Activați decodarea hardware pe 10 biți pentru HEVC",
"LabelRepositoryName": "Nume Repertoriu",
"LabelRepositoryUrlHelp": "Locația manifestului repertoriului pe care doriți să o includeți.",
"LabelRepositoryUrl": "URL Repertoriu",
"HeaderNewRepository": "Repertoriu Nou",
"MessageNoRepositories": "Fără repertoriu.",
"ButtonPlayer": "Redare",
"Writers": "Scriitori",
"TabRepositories": "Repertorii",
"MessageAddRepository": "Dacă doriți să adăugați un repertoriu, faceți clic pe butonul de lângă antet și completați informațiile solicitate.",
"LabelRepositoryNameHelp": "Un nume personalizat pentru a distinge acest repertoriu de altele adăugate la serverul dvs."
}

View file

@ -919,7 +919,7 @@
"MessageNoAvailablePlugins": "Плагинов не имеется.",
"MessageNoMovieSuggestionsAvailable": "В настоящее время предложений фильмов не имеются. Начните смотреть и оценивать свои фильмы, а затем вернитесь, чтобы просмотреть рекомендации.",
"MessageNoPluginsInstalled": "Нет установленных плагинов.",
"MessageNoTrailersFound": "Трейлеры не найдены. Установите канал трейлеров, чтобы повысить своё впечатление от фильма путём добавления собрания интернет-трейлеров.",
"MessageNoTrailersFound": "Установите канал трейлеров, чтобы повысить своё впечатление от фильма путём добавления собрания интернет-трейлеров.",
"MessageNothingHere": "Здесь ничего нет.",
"MessagePasswordResetForUsers": "Следующие пользователи сбросили свои пароли. Теперь они могут войти с помощью PIN-кодов, которые использовались для сброса.",
"MessagePlayAccessRestricted": "Воспроизведение данного содержания в настоящее время ограничено. За дополнительными сведениями обратитесь к администратору сервера.",
@ -1504,7 +1504,7 @@
"MessageUnauthorizedUser": "В настоящее время у вас нет доступа к серверу. Пожалуйста, свяжитесь с администратором сервера для получения дополнительной информации.",
"HeaderFavoritePlaylists": "Избранные плей-листы",
"LabelRequireHttpsHelp": "Если этот флажок установлен, сервер будет автоматически перенаправлять все запросы через HTTP на HTTPS. Это не имеет никакого эффекта, если сервер не слушает HTTPS.",
"LabelEnableHttpsHelp": "Позволяет серверу слушать сконфигурированный HTTPS-порт. Действительный сертификат также должен быть сконфигурирован для того, чтобы это вступило в силу.",
"LabelEnableHttpsHelp": "Позволяет серверу слушать HTTPS-порт. Для работы необходим действующий сертификат.",
"ApiKeysCaption": "Список действующих текущих API-ключей",
"TabDVR": "DVR",
"SaveChanges": "Сохранить изменения",
@ -1545,12 +1545,27 @@
"LabelSyncPlayPlaybackDiff": "Разница времени воспроизведения:",
"MillisecondsUnit": "мс",
"LabelSyncPlayTimeOffset": "Сдвиг времени относительно сервера:",
"SyncPlayAccessHelp": "Выберите уровень доступа данного пользователя к функциональности SyncPlay. SyncPlay позволяет синхронизировать воспроизведение с другими устройствами.",
"SyncPlayAccessHelp": "Выберите уровень доступа данного пользователя к функции SyncPlay. SyncPlay позволяет синхронизировать воспроизведение с другими устройствами.",
"MessageSyncPlayErrorMedia": "Не удалось включить SyncPlay! Ошибка медиаданных.",
"MessageSyncPlayErrorMissingSession": "Не удалось включить SyncPlay! Отсутствует сеанс.",
"MessageSyncPlayErrorNoActivePlayer": "Активный проигрыватель не найден. SyncPlay был отключен.",
"ShowMore": "Показать больше",
"ShowLess": "Показать меньше",
"EnableBlurhashHelp": "Рисунки, которые всё ещё загружаются, будут отображаться с размытым заполнением",
"EnableBlurhash": "Включить размытые заполнители для изображений"
"EnableBlurhash": "Включить размытые заполнители для изображений",
"ButtonSyncPlay": "SyncPlay",
"ButtonCast": "В ролях",
"TabRepositories": "Репозитории",
"MessageNoGenresAvailable": "Разрешить поставщикам метаданных получать жанры из интернета.",
"MessageAddRepository": "Если вы хотите добавить репозиторий, нажмите кнопку рядом с заголовком и заполните необходимую информацию.",
"LabelRepositoryNameHelp": "Имя репозитория для показа на этом сервере.",
"LabelRepositoryName": "Название репозитория",
"LabelRepositoryUrlHelp": "Расположение манифеста добавляемого репозитория.",
"LabelRepositoryUrl": "URL репозитория",
"HeaderNewRepository": "Новый репозиторий",
"MessageNoRepositories": "Репозитории отсутствуют.",
"EnableFasterAnimationsHelp": "Использовать ускоренную анимацию и переходы",
"EnableFasterAnimations": "Ускоренная анимация",
"EnableDecodingColorDepth10Vp9": "Включить аппаратный декодер VP9 10-Bit",
"EnableDecodingColorDepth10Hevc": "Включить аппаратный декодер HEVC 10-Bit"
}

View file

@ -1518,12 +1518,12 @@
"HeaderHttpsSettings": "Nastavenia HTTPS",
"HeaderDVR": "DVR",
"SaveChanges": "Uložiť zmeny",
"MessageSyncPlayErrorMedia": "Povolenie synchronizácie prehrávania zlyhalo! Chyba média.",
"MessageSyncPlayErrorMissingSession": "Zapnutie synchronizácie prehrávania zlyhalo! Aktívna relácia nebola nájdená.",
"MessageSyncPlayErrorNoActivePlayer": "Nebol nájdený žiadny aktívny prehrávač. Synchronizácia prehrávania bola vypnutá.",
"MessageSyncPlayErrorMedia": "Povolenie funkcie SyncPlay zlyhalo! Chyba média.",
"MessageSyncPlayErrorMissingSession": "Zapnutie funkcie SyncPlay zlyhalo! Aktívna relácia nebola nájdená.",
"MessageSyncPlayErrorNoActivePlayer": "Nebol nájdený žiadny aktívny prehrávač. Funkcia SyncPlay bola vypnutá.",
"MessageSyncPlayErrorAccessingGroups": "Pri načítaní zoznamu skupín sa vyskytla chyba.",
"MessageSyncPlayLibraryAccessDenied": "Prístup k tomuto obsahuje je obmedzený.",
"MessageSyncPlayJoinGroupDenied": "K použitiu synchronizácie prehrávania je vyžadované povolenie.",
"MessageSyncPlayJoinGroupDenied": "K použitiu funkcie SyncPlay je požadované povolenie.",
"MessageSyncPlayCreateGroupDenied": "K vytvoreniu skupiny je požadované povolenie.",
"MessageSyncPlayGroupDoesNotExist": "Pripojenie ku skupine zlyhalo, pretože skupina neexistuje.",
"MessageSyncPlayPlaybackPermissionRequired": "K prehrávaniu je potrebné povolenie.",
@ -1531,13 +1531,13 @@
"MessageSyncPlayGroupWait": "Prehrávanie používateľa <b>{0}</b> sa načítava...",
"MessageSyncPlayUserLeft": "Používateľ <b>{0}</b> opustil skupinu.",
"MessageSyncPlayUserJoined": "Používateľ <b>{0}</b> sa pripojil k skupine.",
"MessageSyncPlayDisabled": "Synchronizácia prehrávania zakázana.",
"MessageSyncPlayEnabled": "Synchronizácia prehrávania povolená.",
"LabelSyncPlayAccess": "Prístup k synchronizácií prehrávania",
"MessageSyncPlayDisabled": "SyncPlay zakázaný.",
"MessageSyncPlayEnabled": "SyncPlay povolený.",
"LabelSyncPlayAccess": "Prístup k funkcií SyncPlay",
"LabelSyncPlayAccessNone": "Zakázať pre tohoto používateľa",
"LabelSyncPlayAccessJoinGroups": "Povoliť použivateľovi pripájať sa do skupín",
"LabelSyncPlayAccessCreateAndJoinGroups": "Povoliť používateľovi vytvárať a pripájať sa do skupín",
"LabelSyncPlayLeaveGroupDescription": "Zakázať synchronizáciu prehrávania",
"LabelSyncPlayLeaveGroupDescription": "Zakázať SyncPlay",
"LabelSyncPlayLeaveGroup": "Opustiť skupinu",
"LabelSyncPlayNewGroupDescription": "Vytvoriť novú skupinu",
"LabelSyncPlayNewGroup": "Nová skupina",
@ -1545,9 +1545,9 @@
"LabelSyncPlayPlaybackDiff": "Rozdiel v dobe prehrávania:",
"MillisecondsUnit": "ms",
"LabelSyncPlayTimeOffset": "Časový rozdiel so serverom:",
"HeaderSyncPlayEnabled": "Synchronizácia prehrávania je povolená",
"HeaderSyncPlayEnabled": "SyncPlay je povolené",
"HeaderSyncPlaySelectGroup": "Pripojiť sa k skupine",
"SyncPlayAccessHelp": "Vyberte úroveň prístupu pre tohto používateľa k funkcií synchronizácie prehrávania. Synchronizácia prehrávania umožňuje zosynchronizovať prehrávanie s ostatnými zariadeniami.",
"SyncPlayAccessHelp": "Vyberte úroveň prístupu pre tohto používateľa k funkcií SyncPlay. SyncPlay umožňuje zosynchronizovať prehrávanie s ostatnými zariadeniami.",
"EnableDetailsBannerHelp": "Zobrazí banner na vrchnej časti detailu položky.",
"EnableDetailsBanner": "Detail banneru",
"EnableBlurhashHelp": "Obrázky, ktoré sa stále načítavajú budú zobrazené ako dočasný obrázok s rozmazaným pozadím",
@ -1559,6 +1559,16 @@
"MessageNoGenresAvailable": "Povoliť vybraným metadáta poskytovateľom stiahnuť žánre z internetu.",
"EnableFasterAnimationsHelp": "Použiť rýchlejšiu animáciu a prechody",
"EnableFasterAnimations": "Rýchlejšia animácia",
"EnableDecodingColorDepth10Vp9": "Povoliť 10-Bitové hardvérové dekódovanie pre Vp9",
"EnableDecodingColorDepth10Hevc": "Povoliť 10-Bitové hardvérové dekódovanie pre HEVC"
"EnableDecodingColorDepth10Vp9": "Povoliť 10-Bitové hardvérové dekódovanie pre VP9",
"EnableDecodingColorDepth10Hevc": "Povoliť 10-Bitové hardvérové dekódovanie pre HEVC",
"LabelRepositoryUrl": "URL adresa repozitára",
"HeaderNewRepository": "Nový repozitár",
"MessageNoRepositories": "Neexistujú žiadne repozitáre.",
"TabRepositories": "Repozitáre",
"MessageAddRepository": "Pokiaľ chcete pridať repozitár, kliknite na tlačidlo vedľa hlavičky a vyplňte požadované informácie.",
"LabelRepositoryNameHelp": "Vlastné pomenovanie, ktoré slúži na odlíšenie tohto repozitára od ostatných repozitárov pridaných na vašom serveri.",
"LabelRepositoryName": "Názov repozitára",
"LabelRepositoryUrlHelp": "Umiestnenie manifestu repozitára, ktorý chcete zahrnúť.",
"ButtonPlayer": "Prehrávač",
"Writers": "Scenáristi"
}

View file

@ -77,7 +77,7 @@
"Alerts": "Alarmi",
"All": "Vse",
"AllChannels": "Vsi kanali",
"AllComplexFormats": "Vsi kompleksni formati (ASS, SSA, VOBSUB, PGS, SUB/IDX, itd.)",
"AllComplexFormats": "Vsi kompleksni formati (ASS, SSA, VOBSUB, PGS, SUB, IDX, itd.)",
"AllEpisodes": "Vse epizode",
"AllLanguages": "Vsi jeziki",
"AllLibraries": "Vse knjižnice",
@ -1275,5 +1275,6 @@
"Episode": "Epizoda",
"EnableDetailsBannerHelp": "Prikaži sliko pasice na vrhu strani podrobnosti.",
"EnableDetailsBanner": "Pasica podrobnosti",
"DeinterlaceMethodHelp": "Izberite način razpletanja pri prekodiranju prepletenih vsebin."
"DeinterlaceMethodHelp": "Izberite način razpletanja pri prekodiranju prepletenih vsebin.",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -194,5 +194,6 @@
"AlbumArtist": "Извођач албума",
"Album": "Албум",
"AirDate": "Премијера",
"AdditionalNotificationServices": "Прегледајте каталог додатака да бисте инсталирали сервисе за обавештења."
"AdditionalNotificationServices": "Прегледајте каталог додатака да бисте инсталирали сервисе за обавештења.",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1513,5 +1513,6 @@
"HeaderServerAddressSettings": "Serveradressinställningar",
"HeaderRemoteAccessSettings": "Inställningar för fjärråtkomst",
"HeaderHttpsSettings": "HTTPS-inställningar",
"HeaderDVR": "PVR"
"HeaderDVR": "PVR",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -768,5 +768,6 @@
"LabelSkipIfAudioTrackPresent": "Varsayılan ses izi indirme diliyle uyuşuyorsa atla",
"LabelSize": "Boyut:",
"LabelSimultaneousConnectionLimit": "Eşzamanlı yayın limiti:",
"LabelServerName": "Sunucu adı:"
"LabelServerName": "Sunucu adı:",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -159,5 +159,6 @@
"AllowOnTheFlySubtitleExtractionHelp": "Вбудовані субтитри можуть бути експортовані з відео і надіслані, по черзі, клієнтам у вигляді тексту. Це допоможе уникнути перекодування відео. На деяких системах, перекодування може зайняти тривалий час і зупинити відтворення відео, для того щоб забезпечити експортування. Вимкнення цієї функції дозволить вбудованим субтитрам бути інтегрованим у відео, під час перекодування, якщо вбудовані субтитри не підтримуються на стороні клієнта.",
"AllowOnTheFlySubtitleExtraction": "Дозволити експортування субтитрів «на льоту»",
"AllowHWTranscodingHelp": "Дозволити клієнту перекодування на «на льоту». Це дозволить відмикати перекодування, якщо вона вимагається сервером.",
"AllComplexFormats": "Усі складні формати (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)"
"AllComplexFormats": "Усі складні формати (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1 +1,3 @@
{}
{
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -825,5 +825,6 @@
"LabelMaxStreamingBitrateHelp": "Thiết lập bitrate tối đa khi truyền tải.",
"LabelMaxStreamingBitrate": "Chất lượng phát tối đa:",
"LabelMaxScreenshotsPerItem": "Số lượng ảnh chụp tối đa mỗi mục:",
"LabelMaxResumePercentageHelp": "Nội dung sẽ được cho là đã kết thúc nếu ngừng phát sau thời gian này."
"LabelMaxResumePercentageHelp": "Nội dung sẽ được cho là đã kết thúc nếu ngừng phát sau thời gian này.",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -1546,7 +1546,7 @@
"LabelSyncPlayLeaveGroupDescription": "关闭同步播放",
"EnableDetailsBanner": "详细信息页面的横幅",
"ButtonCast": "投射",
"ButtonSyncPlay": "同步播放",
"ButtonSyncPlay": "SyncPlay",
"EnableBlurhashHelp": "仍在加载的图片将显示带有模糊的占位符",
"EnableBlurhash": "为图片启用模糊的占位符",
"SyncPlayAccessHelp": "为此用户选择对同步播放功能的访问级别。同步播放让你可以和其他设备同步播放进度。",

View file

@ -1,7 +1,7 @@
{
"Add": "添加",
"ButtonAdd": "增",
"ButtonAddScheduledTaskTrigger": "新增觸發",
"ButtonAdd": "",
"ButtonAddScheduledTaskTrigger": "新增觸發",
"ButtonAddUser": "添加用戶",
"ButtonCancel": "取消",
"ButtonDelete": "删除",
@ -10,12 +10,12 @@
"ButtonFilter": "過濾",
"ButtonHelp": "幫助",
"ButtonManualLogin": "手動登入",
"ButtonNew": "新",
"ButtonNew": "",
"ButtonOk": "確定",
"ButtonPlay": "播放",
"ButtonQuickStartGuide": "快速入門指南",
"ButtonRefresh": "重新整理",
"ButtonRefreshGuideData": "重新整理電視指南資料",
"ButtonRefreshGuideData": "重新整理指南資料",
"ButtonRemove": "清除",
"ButtonRename": "重新命名",
"ButtonResetPassword": "重設密碼",
@ -378,17 +378,17 @@
"Ascending": "上升",
"Artist": "藝人",
"Art": "藝術",
"AroundTime": "大約{0}",
"AroundTime": "大約",
"AlwaysPlaySubtitlesHelp": "無論語言是哪種音頻,都將加載與語言首選項匹配的字幕。",
"AllowedRemoteAddressesHelp": "IP地址或IP /網絡掩碼條目的逗號分隔列表,用於允許遠程連接的網絡。 如果保留為空白,將允許所有遠程地址。",
"AllowRemoteAccessHelp": "如果未選中,則將阻止所有遠程連接。",
"AllowRemoteAccess": "允許與此Jellyfin服務器的遠程連接。",
"AllowFfmpegThrottlingHelp": "當轉碼或remux距離當前播放位置足夠遠時請暫停該過程減少資源消耗。 在不經常觀看的情況下,此功能最為有用。 如果遇到播放問題,請關閉此功能。",
"AllowFfmpegThrottlingHelp": "當轉碼或無損複製進度遠超於當前播放位置,暫停進程可減少資源消耗。 在不經常觀看的情況下,此功能最為有用。 如果遇到播放問題,請關閉此功能。",
"AllowOnTheFlySubtitleExtractionHelp": "可以從視頻中提取嵌入式字幕,然後以純文本格式將其交付給客戶端,以幫助防止視頻轉碼。 在某些系統上,這可能需要很長時間,並且會導致提取過程中視頻播放停止。 如果客戶端設備本身不支持嵌入的字幕,則可以禁用此選項以通過視頻轉碼刻錄字幕。",
"AllowOnTheFlySubtitleExtraction": "允許即時提取字幕",
"AllowMediaConversionHelp": "授予或拒絕訪問轉換媒體功能的權限。",
"AllowMediaConversion": "允許媒體轉換",
"AllowHWTranscodingHelp": "允許調諧器即時轉碼流。 這可以幫助減少服務器所需的代碼轉換。",
"AllowHWTranscodingHelp": "允許調諧器即時轉碼。 這可減少使用伺服器轉碼。",
"AllLibraries": "所有媒體庫",
"AllEpisodes": "所有劇集",
"AllComplexFormats": "所有格式ASSSSAVOBSUBPGSSUBIDX等",
@ -399,8 +399,109 @@
"Aired": "已播出",
"AirDate": "播出日期",
"AdditionalNotificationServices": "瀏覽插件目錄以安裝其他通知服務。",
"AddToPlayQueue": "添加到播放列",
"AddToPlayQueue": "添加到播放列",
"AddToCollection": "添加到收藏",
"AddItemToCollectionHelp": "通過搜索項目並使用右鍵單擊或點擊菜單將其添加到集合中,從而將它們添加到集合中。",
"AccessRestrictedTryAgainLater": "目前限制訪問。 請稍後再試。"
"AddItemToCollectionHelp": "搜尋物件並使用右鍵點擊或點擊菜單將他們添加到收藏中。",
"AccessRestrictedTryAgainLater": "目前存取受限。 請稍後再試。",
"AllowFfmpegThrottling": "轉碼調節器",
"Dislike": "不喜歡",
"Disconnect": "中斷連接",
"Disc": "片",
"Disabled": "已停用",
"Directors": "導演",
"Director": "導演",
"DirectStreaming": "直接直播",
"DirectPlaying": "直接播放",
"DetectingDevices": "偵測裝置中",
"Desktop": "桌面",
"Descending": "倒序",
"DeleteUserConfirmation": "你確定要刪除此用戶嗎?",
"DeleteUser": "刪除用戶",
"DeleteMedia": "刪除媒體",
"DeleteImageConfirmation": "你確定要刪除此圖片嗎?",
"DeleteImage": "刪除圖片",
"DefaultErrorMessage": "處理此請求時發生錯誤,請稍後再嘗試。",
"Default": "預設",
"DateAdded": "日期已新增",
"CopyStreamURLError": "複製URL時發生錯誤。",
"CopyStreamURLSuccess": "成功複製URL。",
"CopyStreamURL": "複製直播URL",
"ContinueWatching": "繼續觀看",
"Connect": "連接",
"ConfirmEndPlayerSession": "你要關閉 {0} 的Jellyfin嗎?",
"ConfirmDeleteImage": "刪除圖片?",
"CommunityRating": "社群分數",
"ClientSettings": "客戶端設定",
"ChannelNumber": "頻道號碼",
"ChannelNameOnly": "只有頻道 {0}",
"Categories": "分類",
"CancelSeries": "取消片集",
"CancelRecording": "取消錄影",
"ButtonWebsite": "網頁",
"ButtonViewWebsite": "瀏覽網頁",
"ButtonUninstall": "解除安裝",
"ButtonTrailer": "預告",
"ButtonTogglePlaylist": "播放清單",
"ButtonToggleContextMenu": "更多",
"ButtonSplit": "分開",
"ButtonStop": "停止",
"ButtonStart": "開始",
"ButtonShutdown": "關閉",
"ButtonSettings": "設定",
"ButtonSend": "傳送",
"ButtonSelectServer": "選擇伺服器",
"ButtonSearch": "搜尋",
"ButtonScanAllLibraries": "掃瞄所有媒體櫃",
"ButtonRevoke": "撤銷",
"ButtonResume": "恢復",
"ButtonResetEasyPassword": "重設PIN碼",
"ButtonRepeat": "重複",
"ButtonProfile": "檔案",
"ButtonPause": "暫停",
"ButtonParentalControl": "家長控制",
"ButtonOpen": "開啟",
"ButtonNetwork": "網絡",
"ButtonMore": "更多",
"ButtonLearnMore": "了解更多",
"ButtonInfo": "資訊",
"ButtonHome": "主頁",
"ButtonGuide": "教學",
"ButtonGotIt": "了解",
"ButtonFullscreen": "全螢幕",
"ButtonForgotPassword": "忘記密碼",
"ButtonEditOtherUserPreferences": "更改用戶個人檔案,圖片及個人偏好。",
"ButtonEditImages": "更改圖片",
"ButtonDownload": "下載",
"ButtonConnect": "連接",
"ButtonChangeServer": "更換伺服器",
"ButtonBack": "返回",
"ButtonAudioTracks": "音軌",
"ButtonArrowUp": "箭咀上",
"ButtonArrowRight": "箭咀右",
"ButtonArrowLeft": "箭咀左",
"ButtonArrowDown": "箭咀下",
"ButtonAddServer": "新增伺服器",
"ButtonAddMediaLibrary": "新增媒體櫃",
"ButtonAddImage": "新增圖片",
"Browse": "瀏覽",
"Blacklist": "黑名單",
"BirthPlaceValue": "出生地點",
"BirthDateValue": "出生日期",
"Banner": "橫幅",
"Backdrops": "背景",
"Backdrop": "背景",
"AlwaysPlaySubtitles": "經常播放",
"Display": "顯示",
"EnableBackdrops": "背景",
"EditImages": "更改圖片",
"DownloadsValue": "下載數目 {0}",
"Download": "下載",
"DisplayInMyMedia": "在主頁顯示",
"ButtonSyncPlay": "SyncPlay",
"ButtonDown": "向下",
"BurnSubtitlesHelp": "確定若服務器對視頻進行轉碼時是否嵌入字幕。 關閉這功能將使用更少時間。 選擇'自動'可嵌入基於圖像的格式字幕VOBSUBPGSSUBIDX等和某些ASS或SSA字幕。",
"BrowsePluginCatalogMessage": "瀏覽我們的插件目錄以查看可用的插件。",
"BoxRear": "盒裝(背面)",
"BoxSet": "套裝",
"Box": "盒裝"
}

View file

@ -1015,7 +1015,7 @@
"LabelEnableDlnaServerHelp": "允許網絡上的 UPnP 設備瀏覽和播放內容。",
"LabelEnableHardwareDecodingFor": "為以下啟用硬體解碼:",
"LabelEpisodeNumber": "集:",
"LabelBaseUrlHelp": "您可以在此處新增自訂路徑來進入伺服器。",
"LabelBaseUrlHelp": "您可以在此處自訂伺服器URL路徑的子目錄。",
"LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片",
"LabelHttpsPort": "本地 HTTPS 端口:",
"LabelFailed": "失敗",
@ -1655,5 +1655,6 @@
"New": "新增",
"ApiKeysCaption": "目前已啟用的API金鑰列表",
"ButtonTogglePlaylist": "播放清單",
"ButtonToggleContextMenu": "更多"
"ButtonToggleContextMenu": "更多",
"ButtonSyncPlay": "SyncPlay"
}

View file

@ -227,7 +227,7 @@ html {
color: #fff !important;
}
.detailSticky {
.detailRibbon {
background: #303030;
background: -webkit-gradient(linear, left top, right top, from(#bcbcbc), color-stop(#a7b4b7), color-stop(#beb5a5), color-stop(#adbec2), to(#b9c7cb));
background: -webkit-linear-gradient(left, #bcbcbc, #a7b4b7, #beb5a5, #adbec2, #b9c7cb);
@ -257,11 +257,6 @@ html {
background: #fff;
}
.mediaInfoTimerIcon,
.starIcon {
color: #cb272a;
}
.emby-input,
.emby-textarea {
color: inherit;

View file

@ -223,7 +223,7 @@ html {
color: #fff !important;
}
.detailSticky {
.detailRibbon {
background: #303030;
background: -webkit-gradient(linear, left top, right top, from(#291a31), color-stop(#033664), color-stop(#011432), color-stop(#141a3a), to(#291a31));
background: -webkit-linear-gradient(left, #291a31, #033664, #011432, #141a3a, #291a31);
@ -261,11 +261,6 @@ html {
background: rgba(170, 170, 190, 0.2);
}
.mediaInfoTimerIcon,
.starIcon {
color: #cb272a;
}
.emby-input,
.emby-textarea {
color: inherit;

View file

@ -203,11 +203,11 @@ html {
background: rgba(30, 30, 30, 0.9);
}
.detailSticky {
.detailRibbon {
background: rgba(32, 32, 32, 0.8);
}
.noBackdrop .detailSticky {
.noBackdrop .detailRibbon {
background: #202020;
}
@ -236,11 +236,6 @@ html {
background: rgba(170, 170, 190, 0.2);
}
.mediaInfoTimerIcon,
.starIcon {
color: #cb272a;
}
.emby-input,
.emby-textarea {
color: inherit;
@ -457,3 +452,8 @@ html {
.metadataSidebarIcon {
color: #00a4dc;
}
.emby-button.detailFloatingButton {
background-color: #00a4dc;
color: #fff;
}

View file

@ -221,7 +221,7 @@ html {
color: #fff !important;
}
.detailSticky {
.detailRibbon {
background-color: #303030;
color: #ccc;
color: rgba(255, 255, 255, 0.87);
@ -250,11 +250,6 @@ html {
background: #fff;
}
.mediaInfoTimerIcon,
.starIcon {
color: #cb272a;
}
.emby-input,
.emby-textarea {
color: inherit;

View file

@ -307,7 +307,7 @@ a[data-role=button] {
color: #f8f8fe !important;
}
.detailSticky {
.detailRibbon {
background: #000420;
background: -moz-linear-gradient(left, #000420 0%, #06256f 18%, #2b052b 38%, #2b052b 68%, #06256f 81%, #000420 100%);
background: -webkit-linear-gradient(left, #000420 0%, #06256f 18%, #2b052b 38%, #2b052b 68%, #06256f 81%, #000420 100%);
@ -344,11 +344,6 @@ a[data-role=button] {
background: rgba(170, 170, 190, 0.2);
}
.mediaInfoTimerIcon,
.starIcon {
color: #f2b01e;
}
.emby-input,
.emby-textarea {
color: inherit;

View file

@ -209,7 +209,7 @@ html {
color: #fff !important;
}
.detailSticky {
.detailRibbon {
background-color: #081b3b;
}
@ -243,11 +243,6 @@ html {
background: rgba(170, 170, 190, 0.2);
}
.mediaInfoTimerIcon,
.starIcon {
color: #cb272a;
}
.emby-input,
.emby-textarea {
color: inherit;

View file

@ -6273,10 +6273,10 @@ isurl@^1.0.0-alpha5:
has-to-string-tag-x "^1.2.0"
is-object "^1.0.1"
jellyfin-apiclient@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/jellyfin-apiclient/-/jellyfin-apiclient-1.2.2.tgz#64f058320603df02d926f4c1b929b42c6acc4527"
integrity sha512-UwC56orm4darWlnNQJ1nbKo+W8ywlheJSJC6d9zm06CslYtOc/Dkv9kz2PadQEh+6EiBsB0hAZCc7FJ9ahOoGQ==
jellyfin-apiclient@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/jellyfin-apiclient/-/jellyfin-apiclient-1.3.0.tgz#428ec998ef17a755a7c07f6284f6eb4a56a63242"
integrity sha512-jq+erwtg175Vg/VnxPdMIc+R2e0+t22T42tJiirMU84xBgk+h3maJar7Umr5NHyfkbt6J8d0TmR2O7nXwVpR+w==
"jellyfin-noto@https://github.com/jellyfin/jellyfin-noto":
version "1.0.3"