mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge branch 'master' into tonemap-ui
This commit is contained in:
commit
2bc541c3ec
92 changed files with 1299 additions and 761 deletions
|
@ -184,7 +184,12 @@ function copy(query) {
|
||||||
function injectBundle() {
|
function injectBundle() {
|
||||||
return src(options.injectBundle.query, { base: './src/' })
|
return src(options.injectBundle.query, { base: './src/' })
|
||||||
.pipe(inject(
|
.pipe(inject(
|
||||||
src(['src/scripts/apploader.js'], { read: false }, { base: './src/' }), { relative: true }
|
src(['src/scripts/apploader.js'], { read: false }, { base: './src/' }), {
|
||||||
|
relative: true,
|
||||||
|
transform: function (filepath) {
|
||||||
|
return `<script src="${filepath}" defer></script>`;
|
||||||
|
}
|
||||||
|
}
|
||||||
))
|
))
|
||||||
.pipe(dest('dist/'))
|
.pipe(dest('dist/'))
|
||||||
.pipe(browserSync.stream());
|
.pipe(browserSync.stream());
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
"hls.js": "^0.13.1",
|
"hls.js": "^0.13.1",
|
||||||
"howler": "^2.2.0",
|
"howler": "^2.2.0",
|
||||||
"intersection-observer": "^0.10.0",
|
"intersection-observer": "^0.10.0",
|
||||||
"jellyfin-apiclient": "^1.2.2",
|
"jellyfin-apiclient": "^1.3.0",
|
||||||
"jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto",
|
"jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto",
|
||||||
"jquery": "^3.5.1",
|
"jquery": "^3.5.1",
|
||||||
"jstree": "^3.3.10",
|
"jstree": "^3.3.10",
|
||||||
|
|
|
@ -24,10 +24,6 @@
|
||||||
padding-top: 7em !important;
|
padding-top: 7em !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-mobile .libraryPage {
|
|
||||||
padding-top: 4em !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.itemDetailPage {
|
.itemDetailPage {
|
||||||
padding-top: 0 !important;
|
padding-top: 0 !important;
|
||||||
}
|
}
|
||||||
|
@ -164,6 +160,7 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
contain: layout style paint;
|
contain: layout style paint;
|
||||||
|
transition: background ease-in-out 0.5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hiddenViewMenuBar .skinHeader {
|
.hiddenViewMenuBar .skinHeader {
|
||||||
|
@ -438,12 +435,14 @@
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-attachment: fixed;
|
background-attachment: fixed;
|
||||||
height: 50vh;
|
height: 40vh;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
animation: backdrop-fadein 800ms ease-in normal both;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-mobile .itemBackdrop {
|
.layout-mobile .itemBackdrop {
|
||||||
background-attachment: scroll;
|
background-attachment: scroll;
|
||||||
|
height: 26.5vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-desktop .itemBackdrop::after,
|
.layout-desktop .itemBackdrop::after,
|
||||||
|
@ -463,10 +462,20 @@
|
||||||
.detailPageContent {
|
.detailPageContent {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
padding-left: 2%;
|
padding-left: 32.45vw;
|
||||||
padding-right: 2%;
|
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-desktop .noBackdrop .detailPageContent,
|
||||||
.layout-tv .noBackdrop .detailPageContent {
|
.layout-tv .noBackdrop .detailPageContent {
|
||||||
margin-top: 2.5em;
|
margin-top: 2.5em;
|
||||||
|
@ -477,6 +486,10 @@
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.detailSectionContent a {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
.personBackdrop {
|
.personBackdrop {
|
||||||
background-size: contain;
|
background-size: contain;
|
||||||
}
|
}
|
||||||
|
@ -495,7 +508,23 @@
|
||||||
|
|
||||||
.parentName {
|
.parentName {
|
||||||
display: block;
|
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 {
|
.mainDetailButtons {
|
||||||
|
@ -503,8 +532,6 @@
|
||||||
-webkit-box-align: center;
|
-webkit-box-align: center;
|
||||||
-webkit-align-items: center;
|
-webkit-align-items: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
-webkit-flex-wrap: wrap;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
margin: 1em 0;
|
margin: 1em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -520,6 +547,35 @@
|
||||||
font-weight: 600;
|
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 {
|
.nameContainer {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -546,6 +602,19 @@
|
||||||
text-align: center;
|
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 {
|
.detailPagePrimaryContainer {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
@ -556,7 +625,7 @@
|
||||||
.layout-mobile .detailPagePrimaryContainer {
|
.layout-mobile .detailPagePrimaryContainer {
|
||||||
display: block;
|
display: block;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 0;
|
padding: 0.5em 3.3% 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-tv #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer,
|
.layout-tv #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer,
|
||||||
|
@ -566,13 +635,14 @@
|
||||||
padding-left: 32.45vw;
|
padding-left: 32.45vw;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-desktop .detailSticky,
|
.layout-desktop .detailRibbon,
|
||||||
.layout-tv .detailSticky {
|
.layout-tv .detailRibbon {
|
||||||
margin-top: -7.2em;
|
margin-top: -7.2em;
|
||||||
|
height: 7.18em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-desktop .noBackdrop .detailSticky,
|
.layout-desktop .noBackdrop .detailRibbon,
|
||||||
.layout-tv .noBackdrop .detailSticky {
|
.layout-tv .noBackdrop .detailRibbon {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -584,6 +654,9 @@
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
min-width: 0;
|
||||||
|
max-width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-mobile .infoText {
|
.layout-mobile .infoText {
|
||||||
|
@ -594,13 +667,29 @@
|
||||||
margin: 1.25em 0;
|
margin: 1.25em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailImageContainer {
|
.layout-mobile .detailPageSecondaryContainer {
|
||||||
position: relative;
|
margin: 1em 0;
|
||||||
margin-top: -25vh;
|
}
|
||||||
margin-bottom: 10vh;
|
|
||||||
|
.layout-mobile .detailImageContainer {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailImageContainer .card {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
float: left;
|
float: left;
|
||||||
width: 25vw;
|
width: 25vw;
|
||||||
z-index: 3;
|
z-index: 3;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailImageContainer .card.backdropCard {
|
||||||
|
top: 35%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detailImageContainer .card.squareCard {
|
||||||
|
top: 40%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-desktop .noBackdrop .detailImageContainer,
|
.layout-desktop .noBackdrop .detailImageContainer,
|
||||||
|
@ -613,11 +702,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailLogo {
|
.detailLogo {
|
||||||
width: 30vw;
|
width: 25vw;
|
||||||
height: 25vh;
|
height: 16vh;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 10vh;
|
top: 10vh;
|
||||||
right: 20vw;
|
right: 25vw;
|
||||||
background-size: contain;
|
background-size: contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -657,14 +746,19 @@ div.itemDetailGalleryLink.defaultCardBackground {
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-desktop .detailPageWrapperContainer,
|
.layout-desktop .itemBackdrop,
|
||||||
.layout-tv .detailPageWrapperContainer {
|
.layout-tv .itemBackdrop {
|
||||||
margin-top: 7.2em;
|
height: 40vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layout-tv #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer,
|
.layout-desktop .detailPageWrapperContainer,
|
||||||
.layout-desktop #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer {
|
.layout-tv .detailPageWrapperContainer {
|
||||||
padding-left: 3.3%;
|
margin-top: 0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout-desktop .detailImageContainer .card,
|
||||||
|
.layout-tv .detailImageContainer .card {
|
||||||
|
top: 10%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btnPlaySimple {
|
.btnPlaySimple {
|
||||||
|
@ -680,12 +774,12 @@ div.itemDetailGalleryLink.defaultCardBackground {
|
||||||
|
|
||||||
.emby-button.detailFloatingButton {
|
.emby-button.detailFloatingButton {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: rgba(0, 0, 0, 0.5) !important;
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
z-index: 1;
|
z-index: 3;
|
||||||
top: 50%;
|
top: 100%;
|
||||||
left: 50%;
|
left: 90%;
|
||||||
margin: -2.2em 0 0 -2.2em;
|
margin: -2.2em 0 0 -2.2em;
|
||||||
padding: 0.4em !important;
|
padding: 0.4em;
|
||||||
color: rgba(255, 255, 255, 0.76);
|
color: rgba(255, 255, 255, 0.76);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,16 +789,12 @@ div.itemDetailGalleryLink.defaultCardBackground {
|
||||||
|
|
||||||
@media all and (max-width: 62.5em) {
|
@media all and (max-width: 62.5em) {
|
||||||
.parentName {
|
.parentName {
|
||||||
margin-bottom: 1em;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.itemDetailPage {
|
.itemDetailPage {
|
||||||
padding-top: 0 !important;
|
padding-top: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailimg-hidemobile {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@media all and (min-width: 31.25em) {
|
@media all and (min-width: 31.25em) {
|
||||||
|
@ -868,6 +958,10 @@ div.itemDetailGalleryLink.defaultCardBackground {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.detailVerticalSection .emby-scrollbuttons {
|
||||||
|
padding-top: 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
.layout-tv .detailVerticalSection {
|
.layout-tv .detailVerticalSection {
|
||||||
margin-bottom: 3.4em !important;
|
margin-bottom: 3.4em !important;
|
||||||
}
|
}
|
||||||
|
@ -956,6 +1050,10 @@ div.itemDetailGalleryLink.defaultCardBackground {
|
||||||
margin-bottom: 2.7em;
|
margin-bottom: 2.7em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.layout-mobile .verticalSection-extrabottompadding {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
.sectionTitleButton,
|
.sectionTitleButton,
|
||||||
.sectionTitleIconButton {
|
.sectionTitleIconButton {
|
||||||
margin-right: 0 !important;
|
margin-right: 0 !important;
|
||||||
|
@ -981,7 +1079,13 @@ div.itemDetailGalleryLink.defaultCardBackground {
|
||||||
|
|
||||||
div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
|
div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
|
||||||
margin: 0;
|
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 {
|
.sectionTitleButton {
|
||||||
|
@ -1134,6 +1238,12 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
|
||||||
|
|
||||||
.trackSelections .selectContainer .selectLabel {
|
.trackSelections .selectContainer .selectLabel {
|
||||||
margin: 0 0.2em 0 0;
|
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 {
|
.trackSelections .selectContainer .detailTrackSelect {
|
||||||
|
|
|
@ -16,7 +16,7 @@ function getOffsets(elems) {
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let elem of elems) {
|
for (const elem of elems) {
|
||||||
let box = elem.getBoundingClientRect();
|
let box = elem.getBoundingClientRect();
|
||||||
|
|
||||||
results.push({
|
results.push({
|
||||||
|
@ -135,7 +135,7 @@ export function show(options) {
|
||||||
let renderIcon = false;
|
let renderIcon = false;
|
||||||
let icons = [];
|
let icons = [];
|
||||||
let itemIcon;
|
let itemIcon;
|
||||||
for (let item of options.items) {
|
for (const item of options.items) {
|
||||||
|
|
||||||
itemIcon = item.icon || (item.selected ? 'check' : null);
|
itemIcon = item.icon || (item.selected ? 'check' : null);
|
||||||
|
|
||||||
|
|
|
@ -1310,7 +1310,7 @@ import 'programStyles';
|
||||||
}
|
}
|
||||||
|
|
||||||
const mediaSourceCount = item.MediaSourceCount || 1;
|
const mediaSourceCount = item.MediaSourceCount || 1;
|
||||||
if (mediaSourceCount > 1) {
|
if (mediaSourceCount > 1 && options.disableIndicators !== true) {
|
||||||
innerCardFooter += '<div class="mediaSourceIndicator">' + mediaSourceCount + '</div>';
|
innerCardFooter += '<div class="mediaSourceIndicator">' + mediaSourceCount + '</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1391,34 +1391,36 @@ import 'programStyles';
|
||||||
cardBoxClose = '</div>';
|
cardBoxClose = '</div>';
|
||||||
cardScalableClose = '</div>';
|
cardScalableClose = '</div>';
|
||||||
|
|
||||||
let indicatorsHtml = '';
|
if (options.disableIndicators !== true) {
|
||||||
|
let indicatorsHtml = '';
|
||||||
|
|
||||||
if (options.missingIndicator !== false) {
|
if (options.missingIndicator !== false) {
|
||||||
indicatorsHtml += indicators.getMissingIndicator(item);
|
indicatorsHtml += indicators.getMissingIndicator(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
indicatorsHtml += indicators.getSyncIndicator(item);
|
indicatorsHtml += indicators.getSyncIndicator(item);
|
||||||
indicatorsHtml += indicators.getTimerIndicator(item);
|
indicatorsHtml += indicators.getTimerIndicator(item);
|
||||||
|
|
||||||
indicatorsHtml += indicators.getTypeIndicator(item);
|
indicatorsHtml += indicators.getTypeIndicator(item);
|
||||||
|
|
||||||
if (options.showGroupCount) {
|
if (options.showGroupCount) {
|
||||||
|
|
||||||
indicatorsHtml += indicators.getChildCountIndicatorHtml(item, {
|
indicatorsHtml += indicators.getChildCountIndicatorHtml(item, {
|
||||||
minCount: 1
|
minCount: 1
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
indicatorsHtml += indicators.getPlayedIndicatorHtml(item);
|
indicatorsHtml += indicators.getPlayedIndicatorHtml(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.Type === 'CollectionFolder' || item.CollectionType) {
|
if (item.Type === 'CollectionFolder' || item.CollectionType) {
|
||||||
const refreshClass = item.RefreshProgress ? '' : ' class="hide"';
|
const refreshClass = item.RefreshProgress ? '' : ' class="hide"';
|
||||||
indicatorsHtml += '<div is="emby-itemrefreshindicator"' + refreshClass + ' data-progress="' + (item.RefreshProgress || 0) + '" data-status="' + item.RefreshStatus + '"></div>';
|
indicatorsHtml += '<div is="emby-itemrefreshindicator"' + refreshClass + ' data-progress="' + (item.RefreshProgress || 0) + '" data-status="' + item.RefreshStatus + '"></div>';
|
||||||
requireRefreshIndicator();
|
requireRefreshIndicator();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (indicatorsHtml) {
|
if (indicatorsHtml) {
|
||||||
cardImageContainerOpen += '<div class="cardIndicators">' + indicatorsHtml + '</div>';
|
cardImageContainerOpen += '<div class="cardIndicators">' + indicatorsHtml + '</div>';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!imgUrl) {
|
if (!imgUrl) {
|
||||||
|
@ -1467,7 +1469,7 @@ import 'programStyles';
|
||||||
let additionalCardContent = '';
|
let additionalCardContent = '';
|
||||||
|
|
||||||
if (layoutManager.desktop) {
|
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 + '>';
|
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.
|
* Generates HTML markup for the card overlay.
|
||||||
* @param {object} item - Item used to generate the card overlay.
|
* @param {object} item - Item used to generate the card overlay.
|
||||||
* @param {string} action - Action assigned to the overlay.
|
* @param {string} action - Action assigned to the overlay.
|
||||||
|
* @param {Array} options - Card builder options.
|
||||||
* @returns {string} HTML markup of the card overlay.
|
* @returns {string} HTML markup of the card overlay.
|
||||||
*/
|
*/
|
||||||
function getHoverMenuHtml(item, action) {
|
function getHoverMenuHtml(item, action, options) {
|
||||||
let html = '';
|
let html = '';
|
||||||
|
|
||||||
html += '<div class="cardOverlayContainer itemAction" data-action="' + action + '">';
|
html += '<div class="cardOverlayContainer itemAction" data-action="' + action + '">';
|
||||||
|
@ -1494,12 +1497,12 @@ import 'programStyles';
|
||||||
|
|
||||||
const userData = item.UserData || {};
|
const userData = item.UserData || {};
|
||||||
|
|
||||||
if (itemHelper.canMarkPlayed(item)) {
|
if (itemHelper.canMarkPlayed(item) && !options.disableHoverMenu) {
|
||||||
require(['emby-playstatebutton']);
|
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>';
|
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;
|
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>';
|
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>';
|
||||||
}
|
}
|
||||||
|
|
||||||
html += '<button is="paper-icon-button-light" class="' + btnCssClass + '" data-action="menu"><span class="material-icons cardOverlayButtonIcon cardOverlayButtonIcon-hover more_vert"></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>';
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
|
|
|
@ -22,7 +22,7 @@ define(['dom', 'appRouter', 'connectionManager'], function (dom, appRouter, conn
|
||||||
return void appRouter.showItem(items[0]);
|
return void appRouter.showItem(items[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var url = 'itemdetails.html?id=' + itemId + '&serverId=' + serverId;
|
var url = 'details?id=' + itemId + '&serverId=' + serverId;
|
||||||
Dashboard.navigate(url);
|
Dashboard.navigate(url);
|
||||||
});
|
});
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
|
|
@ -12,7 +12,7 @@ import 'css!./style';
|
||||||
fillImageElement(elem, source);
|
fillImageElement(elem, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function itemBlurhashing(target, blurhashstr) {
|
function itemBlurhashing(target, blurhashstr) {
|
||||||
if (blurhash.isBlurhashValid(blurhashstr)) {
|
if (blurhash.isBlurhashValid(blurhashstr)) {
|
||||||
// Although the default values recommended by Blurhash developers is 32x32, a size of 18x18 seems to be the sweet spot for us,
|
// Although the default values recommended by Blurhash developers is 32x32, a size of 18x18 seems to be the sweet spot for us,
|
||||||
// improving the performance and reducing the memory usage, while retaining almost full blur quality.
|
// improving the performance and reducing the memory usage, while retaining almost full blur quality.
|
||||||
|
@ -36,24 +36,18 @@ import 'css!./style';
|
||||||
imgData.data.set(pixels);
|
imgData.data.set(pixels);
|
||||||
ctx.putImageData(imgData, 0, 0);
|
ctx.putImageData(imgData, 0, 0);
|
||||||
|
|
||||||
let child = target.appendChild(canvas);
|
requestAnimationFrame(() => {
|
||||||
child.classList.add('blurhash-canvas');
|
canvas.classList.add('blurhash-canvas');
|
||||||
child.style.opacity = 1;
|
if (userSettings.enableFastFadein()) {
|
||||||
if (userSettings.enableFastFadein()) {
|
canvas.classList.add('lazy-blurhash-fadein-fast');
|
||||||
child.classList.add('lazy-blurhash-fadein-fast');
|
} else {
|
||||||
} else {
|
canvas.classList.add('lazy-blurhash-fadein');
|
||||||
child.classList.add('lazy-blurhash-fadein');
|
}
|
||||||
}
|
|
||||||
|
|
||||||
target.classList.add('blurhashed');
|
target.parentNode.insertBefore(canvas, target);
|
||||||
target.removeAttribute('data-blurhash');
|
target.classList.add('blurhashed');
|
||||||
}
|
target.removeAttribute('data-blurhash');
|
||||||
}
|
});
|
||||||
|
|
||||||
function switchCanvas(elem) {
|
|
||||||
let child = elem.getElementsByClassName('blurhash-canvas')[0];
|
|
||||||
if (child) {
|
|
||||||
child.style.opacity = elem.getAttribute('data-src') ? 1 : 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,23 +60,16 @@ import 'css!./style';
|
||||||
|
|
||||||
if (target) {
|
if (target) {
|
||||||
source = target.getAttribute('data-src');
|
source = target.getAttribute('data-src');
|
||||||
var blurhashstr = target.getAttribute('data-blurhash');
|
|
||||||
} else {
|
} else {
|
||||||
source = entry;
|
source = entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userSettings.enableBlurhash()) {
|
|
||||||
if (!target.classList.contains('blurhashed', 'non-blurhashable') && blurhashstr) {
|
|
||||||
itemBlurhashing(target, blurhashstr);
|
|
||||||
} else if (!blurhashstr && !target.classList.contains('blurhashed')) {
|
|
||||||
target.classList.add('non-blurhashable');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (entry.intersectionRatio > 0) {
|
if (entry.intersectionRatio > 0) {
|
||||||
if (source) fillImageElement(target, source);
|
if (source) fillImageElement(target, source);
|
||||||
} else if (!source) {
|
} else if (!source) {
|
||||||
emptyImageElement(target);
|
requestAnimationFrame(() => {
|
||||||
|
emptyImageElement(target);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,29 +81,24 @@ import 'css!./style';
|
||||||
let preloaderImg = new Image();
|
let preloaderImg = new Image();
|
||||||
preloaderImg.src = url;
|
preloaderImg.src = url;
|
||||||
|
|
||||||
// This is necessary here, so changing blurhash settings without reloading the page works
|
elem.classList.add('lazy-hidden');
|
||||||
if (!userSettings.enableBlurhash() || elem.classList.contains('non-blurhashable')) {
|
|
||||||
elem.classList.add('lazy-hidden');
|
|
||||||
}
|
|
||||||
|
|
||||||
preloaderImg.addEventListener('load', () => {
|
preloaderImg.addEventListener('load', () => {
|
||||||
if (elem.tagName !== 'IMG') {
|
requestAnimationFrame(() => {
|
||||||
elem.style.backgroundImage = "url('" + url + "')";
|
if (elem.tagName !== 'IMG') {
|
||||||
} else {
|
elem.style.backgroundImage = "url('" + url + "')";
|
||||||
elem.setAttribute('src', url);
|
} else {
|
||||||
}
|
elem.setAttribute('src', url);
|
||||||
elem.removeAttribute('data-src');
|
}
|
||||||
|
elem.removeAttribute('data-src');
|
||||||
|
|
||||||
if (elem.classList.contains('non-blurhashable') || !userSettings.enableBlurhash()) {
|
|
||||||
elem.classList.remove('lazy-hidden');
|
elem.classList.remove('lazy-hidden');
|
||||||
if (userSettings.enableFastFadein()) {
|
if (userSettings.enableFastFadein()) {
|
||||||
elem.classList.add('lazy-image-fadein-fast');
|
elem.classList.add('lazy-image-fadein-fast');
|
||||||
} else {
|
} else {
|
||||||
elem.classList.add('lazy-image-fadein');
|
elem.classList.add('lazy-image-fadein');
|
||||||
}
|
}
|
||||||
} else {
|
});
|
||||||
switchCanvas(elem);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,15 +114,21 @@ import 'css!./style';
|
||||||
}
|
}
|
||||||
elem.setAttribute('data-src', url);
|
elem.setAttribute('data-src', url);
|
||||||
|
|
||||||
if (elem.classList.contains('non-blurhashable') || !userSettings.enableBlurhash()) {
|
elem.classList.remove('lazy-image-fadein-fast', 'lazy-image-fadein');
|
||||||
elem.classList.remove('lazy-image-fadein-fast', 'lazy-image-fadein');
|
elem.classList.add('lazy-hidden');
|
||||||
elem.classList.add('lazy-hidden');
|
|
||||||
} else {
|
|
||||||
switchCanvas(elem);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function lazyChildren(elem) {
|
export function lazyChildren(elem) {
|
||||||
|
if (userSettings.enableBlurhash()) {
|
||||||
|
for (const lazyElem of elem.getElementsByClassName('lazy')) {
|
||||||
|
const blurhashstr = lazyElem.getAttribute('data-blurhash');
|
||||||
|
if (!lazyElem.classList.contains('blurhashed', 'non-blurhashable') && blurhashstr) {
|
||||||
|
itemBlurhashing(lazyElem, blurhashstr);
|
||||||
|
} else if (!blurhashstr && !lazyElem.classList.contains('blurhashed')) {
|
||||||
|
lazyElem.classList.add('non-blurhashable');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
lazyLoader.lazyChildren(elem, fillImage);
|
lazyLoader.lazyChildren(elem, fillImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,8 +200,15 @@ import 'css!./style';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function setLazyImage(element, url) {
|
||||||
|
element.classList.add('lazy');
|
||||||
|
element.setAttribute('data-src', url);
|
||||||
|
lazyImage(element);
|
||||||
|
}
|
||||||
|
|
||||||
/* eslint-enable indent */
|
/* eslint-enable indent */
|
||||||
export default {
|
export default {
|
||||||
|
serLazyImage: setLazyImage,
|
||||||
fillImages: fillImages,
|
fillImages: fillImages,
|
||||||
fillImage: fillImage,
|
fillImage: fillImage,
|
||||||
lazyImage: lazyImage,
|
lazyImage: lazyImage,
|
||||||
|
|
|
@ -12,12 +12,22 @@
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@keyframes fadein {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.lazy-blurhash-fadein-fast {
|
.lazy-blurhash-fadein-fast {
|
||||||
transition: opacity 0.2s;
|
animation: fadein 0.1s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lazy-blurhash-fadein {
|
.lazy-blurhash-fadein {
|
||||||
transition: opacity 0.7s;
|
animation: fadein 0.4s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.blurhash-canvas {
|
.blurhash-canvas {
|
||||||
|
@ -28,6 +38,5 @@
|
||||||
left: 0;
|
left: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
z-index: 100;
|
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,12 @@
|
||||||
define(['apphost', 'globalize'], function (appHost, globalize) {
|
define(['apphost', 'globalize'], function (appHost, globalize) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
function getDisplayName(item, options) {
|
function getDisplayName(item, options = {}) {
|
||||||
|
|
||||||
if (!item) {
|
if (!item) {
|
||||||
throw new Error('null item passed into getDisplayName');
|
throw new Error('null item passed into getDisplayName');
|
||||||
}
|
}
|
||||||
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
if (item.Type === 'Timer') {
|
if (item.Type === 'Timer') {
|
||||||
item = item.ProgramInfo || item;
|
item = item.ProgramInfo || item;
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,10 +125,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
||||||
|
|
||||||
var largeTitleTagName = layoutManager.tv ? 'h2' : 'div';
|
var largeTitleTagName = layoutManager.tv ? 'h2' : 'div';
|
||||||
|
|
||||||
for (var i = 0, length = textlines.length; i < length; i++) {
|
for (const [i, text] of textlines.entries()) {
|
||||||
|
|
||||||
var text = textlines[i];
|
|
||||||
|
|
||||||
if (!text) {
|
if (!text) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -434,8 +431,6 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
||||||
|
|
||||||
html += '<div class="' + cssClass + '">';
|
html += '<div class="' + cssClass + '">';
|
||||||
|
|
||||||
const moreIcon = 'more_vert';
|
|
||||||
|
|
||||||
html += getTextLinesHtml(textlines, isLargeStyle);
|
html += getTextLinesHtml(textlines, isLargeStyle);
|
||||||
|
|
||||||
if (options.mediaInfo !== false) {
|
if (options.mediaInfo !== false) {
|
||||||
|
@ -486,10 +481,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>';
|
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) {
|
if (options.infoButton) {
|
||||||
html += '<button is="paper-icon-button-light" class="listItemButton itemAction" data-action="link"><span class="material-icons info_outline"></span></button>';
|
html += '<button is="paper-icon-button-light" class="listItemButton itemAction" data-action="link"><span class="material-icons info_outline"></span></button>';
|
||||||
}
|
}
|
||||||
|
@ -503,14 +494,18 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
|
||||||
var userData = item.UserData || {};
|
var userData = item.UserData || {};
|
||||||
var likes = userData.Likes == null ? '' : userData.Likes;
|
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>';
|
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>';
|
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>';
|
html += '</div>';
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,8 @@
|
||||||
width: auto !important;
|
width: auto !important;
|
||||||
height: auto !important;
|
height: auto !important;
|
||||||
font-size: 1.4em;
|
font-size: 1.4em;
|
||||||
|
margin-right: 0.125em;
|
||||||
|
color: #f2b01e;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mediaInfoCriticRating {
|
.mediaInfoCriticRating {
|
||||||
|
|
|
@ -122,10 +122,10 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
|
||||||
var artistName;
|
var artistName;
|
||||||
if (item.ArtistItems != null) {
|
if (item.ArtistItems != null) {
|
||||||
artistName = item.ArtistItems[0].Name;
|
artistName = item.ArtistItems[0].Name;
|
||||||
context.querySelector('.nowPlayingAlbum').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.AlbumId + `&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('.nowPlayingArtist').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.ArtistItems[0].Id + `&serverId=${nowPlayingServerId}">${artistName}</a>`;
|
context.querySelector('.nowPlayingArtist').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.ArtistItems[0].Id + `&serverId=${nowPlayingServerId}">${artistName}</a>`;
|
||||||
context.querySelector('.contextMenuAlbum').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.AlbumId + `&serverId=${nowPlayingServerId}"><span class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons album"></span> ` + globalize.translate('ViewAlbum') + '</a>';
|
context.querySelector('.contextMenuAlbum').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.AlbumId + `&serverId=${nowPlayingServerId}"><span class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons album"></span> ` + globalize.translate('ViewAlbum') + '</a>';
|
||||||
context.querySelector('.contextMenuArtist').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.ArtistItems[0].Id + `&serverId=${nowPlayingServerId}"><span class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons person"></span> ` + globalize.translate('ViewArtist') + '</a>';
|
context.querySelector('.contextMenuArtist').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.ArtistItems[0].Id + `&serverId=${nowPlayingServerId}"><span class="actionsheetMenuItemIcon listItemIcon listItemIcon-transparent material-icons person"></span> ` + globalize.translate('ViewArtist') + '</a>';
|
||||||
} else {
|
} else {
|
||||||
artistName = item.Artists;
|
artistName = item.Artists;
|
||||||
context.querySelector('.nowPlayingAlbum').innerHTML = albumName;
|
context.querySelector('.nowPlayingAlbum').innerHTML = albumName;
|
||||||
|
@ -136,12 +136,12 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
|
||||||
} else if (item.Type == 'Episode') {
|
} else if (item.Type == 'Episode') {
|
||||||
if (item.SeasonName != null) {
|
if (item.SeasonName != null) {
|
||||||
var seasonName = item.SeasonName;
|
var seasonName = item.SeasonName;
|
||||||
context.querySelector('.nowPlayingSeason').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.SeasonId + `&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) {
|
if (item.SeriesName != null) {
|
||||||
var seriesName = item.SeriesName;
|
var seriesName = item.SeriesName;
|
||||||
if (item.SeriesId != null) {
|
if (item.SeriesId != null) {
|
||||||
context.querySelector('.nowPlayingSerie').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="itemdetails.html?id=' + item.SeriesId + `&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 {
|
} else {
|
||||||
context.querySelector('.nowPlayingSerie').innerHTML = seriesName;
|
context.querySelector('.nowPlayingSerie').innerHTML = seriesName;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,18 @@
|
||||||
|
.subtitleSync {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.subtitleSyncContainer {
|
.subtitleSyncContainer {
|
||||||
width: 40%;
|
width: 40%;
|
||||||
margin-left: 30%;
|
min-width: 18em;
|
||||||
margin-right: 30%;
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
height: 4.2em;
|
height: 4.2em;
|
||||||
background: rgba(28, 28, 28, 0.8);
|
background: rgba(28, 28, 28, 0.8);
|
||||||
border-radius: 0.3em;
|
border-radius: 0.3em;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
position: absolute;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.subtitleSync-closeButton {
|
.subtitleSync-closeButton {
|
||||||
|
|
|
@ -65,6 +65,9 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html',
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: TV layout will require special handling for navigation keys. But now field is not focusable
|
||||||
|
event.stopPropagation();
|
||||||
});
|
});
|
||||||
|
|
||||||
subtitleSyncTextField.blur = function() {
|
subtitleSyncTextField.blur = function() {
|
||||||
|
@ -87,14 +90,6 @@ define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html',
|
||||||
getOffsetFromPercentage(this.value));
|
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) {
|
subtitleSyncSlider.getBubbleHtml = function (value) {
|
||||||
var newOffset = getOffsetFromPercentage(value);
|
var newOffset = getOffsetFromPercentage(value);
|
||||||
return '<h1 class="sliderBubbleText">' +
|
return '<h1 class="sliderBubbleText">' +
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
<div class="subtitleSyncContainer">
|
<div class="subtitleSync">
|
||||||
<button type="button" is="paper-icon-button-light" class="subtitleSync-closeButton"><span class="material-icons close"></span></button>
|
<div class="subtitleSyncContainer">
|
||||||
<div class="subtitleSyncTextField" contenteditable="true" spellcheck="false">0s</div>
|
<button type="button" is="paper-icon-button-light" class="subtitleSync-closeButton"><span class="material-icons close"></span></button>
|
||||||
<div class="sliderContainer subtitleSyncSliderContainer">
|
<div class="subtitleSyncTextField" contenteditable="true" spellcheck="false">0s</div>
|
||||||
<input is="emby-slider" type="range" step="1" min="0" max="100" value="50" class="subtitleSyncSlider" />
|
<div class="sliderContainer subtitleSyncSliderContainer">
|
||||||
|
<input is="emby-slider" type="range" step="1" min="0" max="100" value="50" class="subtitleSyncSlider" data-slider-keep-progress="true" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -37,7 +37,7 @@ function showNewJoinGroupSelection (button, user, apiClient) {
|
||||||
console.debug('No item is currently playing.');
|
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) {
|
response.json().then(function (groups) {
|
||||||
var menuItems = groups.map(function (group) {
|
var menuItems = groups.map(function (group) {
|
||||||
return {
|
return {
|
||||||
|
@ -83,9 +83,9 @@ function showNewJoinGroupSelection (button, user, apiClient) {
|
||||||
|
|
||||||
actionsheet.show(menuOptions).then(function (id) {
|
actionsheet.show(menuOptions).then(function (id) {
|
||||||
if (id == 'new-group') {
|
if (id == 'new-group') {
|
||||||
apiClient.sendSyncPlayCommand(sessionId, 'NewGroup');
|
apiClient.sendSyncPlayCommand('NewGroup');
|
||||||
} else {
|
} else {
|
||||||
apiClient.sendSyncPlayCommand(sessionId, 'JoinGroup', {
|
apiClient.sendSyncPlayCommand('JoinGroup', {
|
||||||
GroupId: id,
|
GroupId: id,
|
||||||
PlayingItemId: playingItemId
|
PlayingItemId: playingItemId
|
||||||
});
|
});
|
||||||
|
@ -140,7 +140,7 @@ function showLeaveGroupSelection (button, user, apiClient) {
|
||||||
|
|
||||||
actionsheet.show(menuOptions).then(function (id) {
|
actionsheet.show(menuOptions).then(function (id) {
|
||||||
if (id == 'leave-group') {
|
if (id == 'leave-group') {
|
||||||
apiClient.sendSyncPlayCommand(sessionId, 'LeaveGroup');
|
apiClient.sendSyncPlayCommand('LeaveGroup');
|
||||||
}
|
}
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
console.error('SyncPlay: unexpected error showing group menu:', error);
|
console.error('SyncPlay: unexpected error showing group menu:', error);
|
||||||
|
|
|
@ -139,7 +139,7 @@ class SyncPlayManager {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
apiClient.sendSyncPlayCommand(sessionId, 'UpdatePing', {
|
apiClient.sendSyncPlayCommand('UpdatePing', {
|
||||||
Ping: ping
|
Ping: ping
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -447,7 +447,7 @@ class SyncPlayManager {
|
||||||
if (!success) {
|
if (!success) {
|
||||||
console.warning('Error reporting playback state to server. Joining group will fail.');
|
console.warning('Error reporting playback state to server. Joining group will fail.');
|
||||||
}
|
}
|
||||||
apiClient.sendSyncPlayCommand(sessionId, 'JoinGroup', {
|
apiClient.sendSyncPlayCommand('JoinGroup', {
|
||||||
GroupId: groupId,
|
GroupId: groupId,
|
||||||
PlayingItemId: playingItemId
|
PlayingItemId: playingItemId
|
||||||
});
|
});
|
||||||
|
@ -658,8 +658,7 @@ class SyncPlayManager {
|
||||||
*/
|
*/
|
||||||
playRequest (player) {
|
playRequest (player) {
|
||||||
var apiClient = connectionManager.currentApiClient();
|
var apiClient = connectionManager.currentApiClient();
|
||||||
var sessionId = getActivePlayerId();
|
apiClient.sendSyncPlayCommand('PlayRequest');
|
||||||
apiClient.sendSyncPlayCommand(sessionId, 'PlayRequest');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -667,8 +666,7 @@ class SyncPlayManager {
|
||||||
*/
|
*/
|
||||||
pauseRequest (player) {
|
pauseRequest (player) {
|
||||||
var apiClient = connectionManager.currentApiClient();
|
var apiClient = connectionManager.currentApiClient();
|
||||||
var sessionId = getActivePlayerId();
|
apiClient.sendSyncPlayCommand('PauseRequest');
|
||||||
apiClient.sendSyncPlayCommand(sessionId, 'PauseRequest');
|
|
||||||
// Pause locally as well, to give the user some little control
|
// Pause locally as well, to give the user some little control
|
||||||
playbackManager._localUnpause(player);
|
playbackManager._localUnpause(player);
|
||||||
}
|
}
|
||||||
|
@ -678,8 +676,7 @@ class SyncPlayManager {
|
||||||
*/
|
*/
|
||||||
seekRequest (PositionTicks, player) {
|
seekRequest (PositionTicks, player) {
|
||||||
var apiClient = connectionManager.currentApiClient();
|
var apiClient = connectionManager.currentApiClient();
|
||||||
var sessionId = getActivePlayerId();
|
apiClient.sendSyncPlayCommand('SeekRequest', {
|
||||||
apiClient.sendSyncPlayCommand(sessionId, 'SeekRequest', {
|
|
||||||
PositionTicks: PositionTicks
|
PositionTicks: PositionTicks
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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">
|
<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>
|
||||||
|
|
||||||
<div class="detailLogo"></div>
|
<div class="detailLogo"></div>
|
||||||
|
@ -15,94 +12,75 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mainDetailButtons">
|
<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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon play_arrow"></span>
|
<span class="material-icons detailButton-icon play_arrow"></span>
|
||||||
<div class="detailButton-text">${ButtonResume}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon play_arrow"></span>
|
<span class="material-icons detailButton-icon play_arrow"></span>
|
||||||
<div class="detailButton-text">${ButtonPlay}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon get_app"></span>
|
<span class="material-icons detailButton-icon get_app"></span>
|
||||||
<div class="detailButton-text">${ButtonDownload}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon theaters"></span>
|
<span class="material-icons detailButton-icon theaters"></span>
|
||||||
<div class="detailButton-text">${ButtonTrailer}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon explore"></span>
|
<span class="material-icons detailButton-icon explore"></span>
|
||||||
<div class="detailButton-text">${HeaderInstantMix}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon shuffle"></span>
|
<span class="material-icons detailButton-icon shuffle"></span>
|
||||||
<div class="detailButton-text">${ButtonShuffle}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon delete"></span>
|
<span class="material-icons detailButton-icon delete"></span>
|
||||||
<div class="detailButton-text">${CancelSeries}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon stop"></span>
|
<span class="material-icons detailButton-icon stop"></span>
|
||||||
<div class="detailButton-text">${StopRecording}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button is="emby-button" type="button" class="button-flat btnDeleteItem 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 delete"></span>
|
|
||||||
<div class="detailButton-text">${Delete}</div>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button is="emby-playstatebutton" type="button" class="button-flat btnPlaystate hide detailButton">
|
|
||||||
<div class="detailButton-content">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon check"></span>
|
<span class="material-icons detailButton-icon check"></span>
|
||||||
<div class="detailButton-text button-text"></div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon favorite"></span>
|
<span class="material-icons detailButton-icon favorite"></span>
|
||||||
<div class="detailButton-text button-text">${Rate}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon call_split"></span>
|
<span class="material-icons detailButton-icon call_split"></span>
|
||||||
<div class="detailButton-text">${ButtonSplit}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</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">
|
<div class="detailButton-content">
|
||||||
<span class="material-icons detailButton-icon more_vert"></span>
|
<span class="material-icons detailButton-icon more_vert"></span>
|
||||||
<div class="detailButton-text">${ButtonMore}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -110,7 +88,7 @@
|
||||||
<div class="detailPageSecondaryContainer">
|
<div class="detailPageSecondaryContainer">
|
||||||
<div class="detailImageContainer padded-left"></div>
|
<div class="detailImageContainer padded-left"></div>
|
||||||
<div class="detailPageContent">
|
<div class="detailPageContent">
|
||||||
<div class="detailPagePrimaryContent padded-left padded-right">
|
<div class="detailPagePrimaryContent padded-right">
|
||||||
<div class="detailSection">
|
<div class="detailSection">
|
||||||
<div class="itemMiscInfo nativeName hide"></div>
|
<div class="itemMiscInfo nativeName hide"></div>
|
||||||
|
|
||||||
|
@ -124,6 +102,11 @@
|
||||||
<div class="directorsLabel label"></div>
|
<div class="directorsLabel label"></div>
|
||||||
<div class="directors content"></div>
|
<div class="directors content"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="detailsGroupItem writersGroup hide">
|
||||||
|
<div class="writersLabel label"></div>
|
||||||
|
<div class="writers content"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form class="trackSelections hide focuscontainer-x">
|
<form class="trackSelections hide focuscontainer-x">
|
||||||
|
@ -164,15 +147,15 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="seriesTimerScheduleSection verticalSection detailVerticalSection hide" style="margin-top:-3em;">
|
<div class="seriesTimerScheduleSection verticalSection detailVerticalSection hide" style="margin-top:-3em;">
|
||||||
<h2 class="sectionTitle padded-left">${HeaderSchedule}</h2>
|
<h2 class="sectionTitle">${HeaderSchedule}</h2>
|
||||||
<div class="seriesTimerSchedule padded-left padded-right"></div>
|
<div class="seriesTimerSchedule padded-right"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="collectionItems"></div>
|
<div class="collectionItems hide"></div>
|
||||||
|
|
||||||
<div class="nextUpSection verticalSection detailVerticalSection hide">
|
<div class="nextUpSection verticalSection detailVerticalSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-left">${HeaderNextUp}</h2>
|
<h2 class="sectionTitle sectionTitle-cards">${HeaderNextUp}</h2>
|
||||||
<div is="emby-itemscontainer" class="nextUpItems vertical-wrap padded-left padded-right"></div>
|
<div is="emby-itemscontainer" class="nextUpItems vertical-wrap padded-right"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="programGuideSection hide verticalSection detailVerticalSection">
|
<div class="programGuideSection hide verticalSection detailVerticalSection">
|
||||||
|
@ -180,64 +163,64 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="childrenCollapsible" class="hide verticalSection detailVerticalSection">
|
<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>
|
<span id="childrenTitle"></span>
|
||||||
</h2>
|
</h2>
|
||||||
<div id="childrenContent">
|
<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>
|
</div>
|
||||||
|
|
||||||
<div id="additionalPartsCollapsible" class="verticalSection detailVerticalSection hide">
|
<div id="additionalPartsCollapsible" class="verticalSection detailVerticalSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderAdditionalParts}</h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderAdditionalParts}</h2>
|
||||||
<div id="additionalPartsContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right"></div>
|
<div id="additionalPartsContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-right"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="verticalSection itemVerticalSection moreFromSeasonSection hide">
|
<div class="verticalSection detailVerticalSection moreFromSeasonSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right"></h2>
|
<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-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
||||||
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="verticalSection itemVerticalSection moreFromArtistSection hide">
|
<div class="verticalSection detailVerticalSection moreFromArtistSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right"></h2>
|
<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-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
||||||
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="castCollapsible" class="verticalSection detailVerticalSection hide">
|
<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 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 id="castContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="seriesScheduleSection" class="verticalSection detailVerticalSection hide">
|
<div id="seriesScheduleSection" class="verticalSection detailVerticalSection hide">
|
||||||
<h2 class="sectionTitle padded-left padded-right">${HeaderUpcomingOnTV}</h2>
|
<h2 class="sectionTitle padded-right">${HeaderUpcomingOnTV}</h2>
|
||||||
<div id="seriesScheduleList" is="emby-itemscontainer" class="itemsContainer vertical-list padded-left padded-right"></div>
|
<div id="seriesScheduleList" is="emby-itemscontainer" class="itemsContainer vertical-list padded-right"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="specialsCollapsible" class="verticalSection detailVerticalSection hide">
|
<div id="specialsCollapsible" class="verticalSection detailVerticalSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderSpecialFeatures}</h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderSpecialFeatures}</h2>
|
||||||
<div id="specialsContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right"></div>
|
<div id="specialsContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-right"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="musicVideosCollapsible" class="verticalSection detailVerticalSection hide">
|
<div id="musicVideosCollapsible" class="verticalSection detailVerticalSection hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderMusicVideos}</h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderMusicVideos}</h2>
|
||||||
<div id="musicVideosContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right"></div>
|
<div id="musicVideosContent" is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-right"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="scenesCollapsible" class="verticalSection itemVerticalSection verticalSection-extrabottompadding hide">
|
<div id="scenesCollapsible" class="verticalSection detailVerticalSection verticalSection-extrabottompadding hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderScenes}</h2>
|
<h2 class="sectionTitle sectionTitle-cards padded-right">${HeaderScenes}</h2>
|
||||||
<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
<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 id="scenesContent" is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="similarCollapsible" class="verticalSection itemVerticalSection verticalSection-extrabottompadding hide">
|
<div id="similarCollapsible" class="verticalSection detailVerticalSection verticalSection-extrabottompadding hide">
|
||||||
<h2 class="sectionTitle sectionTitle-cards padded-left padded-right">${HeaderMoreLikeThis}</h2>
|
<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-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">
|
||||||
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer similarContent"></div>
|
<div is="emby-itemscontainer" class="scrollSlider focuscontainer-x itemsContainer similarContent"></div>
|
||||||
</div>
|
</div>
|
|
@ -28,15 +28,11 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
}
|
}
|
||||||
|
|
||||||
function hideAll(page, className, show) {
|
function hideAll(page, className, show) {
|
||||||
var i;
|
for (const elem of page.querySelectorAll('.' + className)) {
|
||||||
var length;
|
|
||||||
var elems = page.querySelectorAll('.' + className);
|
|
||||||
|
|
||||||
for (i = 0, length = elems.length; i < length; i++) {
|
|
||||||
if (show) {
|
if (show) {
|
||||||
elems[i].classList.remove('hide');
|
elem.classList.remove('hide');
|
||||||
} else {
|
} else {
|
||||||
elems[i].classList.add('hide');
|
elem.classList.add('hide');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,7 +47,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
positionTo: button,
|
positionTo: button,
|
||||||
cancelTimer: false,
|
cancelTimer: false,
|
||||||
record: false,
|
record: false,
|
||||||
deleteItem: true === item.IsFolder,
|
deleteItem: item.CanDelete === true,
|
||||||
shuffle: false,
|
shuffle: false,
|
||||||
instantMix: false,
|
instantMix: false,
|
||||||
user: user,
|
user: user,
|
||||||
|
@ -75,7 +71,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
moreButton: false,
|
moreButton: false,
|
||||||
recordButton: false
|
recordButton: false
|
||||||
});
|
});
|
||||||
return html += '</div>';
|
html += '</div>';
|
||||||
|
|
||||||
|
return html;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderSeriesTimerSchedule(page, apiClient, seriesTimerId) {
|
function renderSeriesTimerSchedule(page, apiClient, seriesTimerId) {
|
||||||
|
@ -143,9 +141,13 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
|
|
||||||
var mediaSources = item.MediaSources;
|
var mediaSources = item.MediaSources;
|
||||||
instance._currentPlaybackMediaSources = mediaSources;
|
instance._currentPlaybackMediaSources = mediaSources;
|
||||||
|
|
||||||
page.querySelector('.trackSelections').classList.remove('hide');
|
page.querySelector('.trackSelections').classList.remove('hide');
|
||||||
|
|
||||||
select.setLabel(globalize.translate('LabelVersion'));
|
select.setLabel(globalize.translate('LabelVersion'));
|
||||||
|
|
||||||
var currentValue = select.value;
|
var currentValue = select.value;
|
||||||
|
|
||||||
var selectedId = mediaSources[0].Id;
|
var selectedId = mediaSources[0].Id;
|
||||||
select.innerHTML = mediaSources.map(function (v) {
|
select.innerHTML = mediaSources.map(function (v) {
|
||||||
var selected = v.Id === selectedId ? ' selected' : '';
|
var selected = v.Id === selectedId ? ' selected' : '';
|
||||||
|
@ -172,7 +174,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
return m.Id === mediaSourceId;
|
return m.Id === mediaSourceId;
|
||||||
})[0];
|
})[0];
|
||||||
var tracks = mediaSource.MediaStreams.filter(function (m) {
|
var tracks = mediaSource.MediaStreams.filter(function (m) {
|
||||||
return 'Video' === m.Type;
|
return m.Type === 'Video';
|
||||||
});
|
});
|
||||||
var select = page.querySelector('.selectVideo');
|
var select = page.querySelector('.selectVideo');
|
||||||
select.setLabel(globalize.translate('LabelVideo'));
|
select.setLabel(globalize.translate('LabelVideo'));
|
||||||
|
@ -242,12 +244,24 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
select.setLabel(globalize.translate('LabelSubtitles'));
|
select.setLabel(globalize.translate('LabelSubtitles'));
|
||||||
var selectedId = null == mediaSource.DefaultSubtitleStreamIndex ? -1 : mediaSource.DefaultSubtitleStreamIndex;
|
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' : '';
|
var selected = -1 === selectedId ? ' selected' : '';
|
||||||
select.innerHTML = '<option value="-1">' + globalize.translate('Off') + '</option>' + tracks.map(function (v) {
|
select.innerHTML = '<option value="-1">' + globalize.translate('Off') + '</option>' + tracks.map(function (v) {
|
||||||
selected = v.Index === selectedId ? ' selected' : '';
|
selected = v.Index === selectedId ? ' selected' : '';
|
||||||
return '<option value="' + v.Index + '" ' + selected + '>' + v.DisplayTitle + '</option>';
|
return '<option value="' + v.Index + '" ' + selected + '>' + v.DisplayTitle + '</option>';
|
||||||
}).join('');
|
}).join('');
|
||||||
|
|
||||||
|
if (tracks.length > 1) {
|
||||||
|
select.removeAttribute('disabled');
|
||||||
|
} else {
|
||||||
|
select.setAttribute('disabled', 'disabled');
|
||||||
|
}
|
||||||
|
|
||||||
page.querySelector('.selectSubtitlesContainer').classList.remove('hide');
|
page.querySelector('.selectSubtitlesContainer').classList.remove('hide');
|
||||||
} else {
|
} else {
|
||||||
select.innerHTML = '';
|
select.innerHTML = '';
|
||||||
|
@ -278,7 +292,15 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
var enableShuffle = item.IsFolder || -1 !== ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type);
|
var enableShuffle = item.IsFolder || -1 !== ['MusicAlbum', 'MusicGenre', 'MusicArtist'].indexOf(item.Type);
|
||||||
hideAll(page, 'btnShuffle', enableShuffle);
|
hideAll(page, 'btnShuffle', enableShuffle);
|
||||||
canPlay = true;
|
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 {
|
} else {
|
||||||
hideAll(page, 'btnPlay');
|
hideAll(page, 'btnPlay');
|
||||||
hideAll(page, 'btnResume');
|
hideAll(page, 'btnResume');
|
||||||
|
@ -324,8 +346,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
function getArtistLinksHtml(artists, serverId, context) {
|
function getArtistLinksHtml(artists, serverId, context) {
|
||||||
var html = [];
|
var html = [];
|
||||||
|
|
||||||
for (var i = 0, length = artists.length; i < length; i++) {
|
for (const artist of artists) {
|
||||||
var artist = artists[i];
|
|
||||||
var href = appRouter.getRouteUrl(artist, {
|
var href = appRouter.getRouteUrl(artist, {
|
||||||
context: context,
|
context: context,
|
||||||
itemType: 'MusicArtist',
|
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.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 parentRoute;
|
||||||
var parentNameHtml = [];
|
var parentNameHtml = [];
|
||||||
var parentNameLast = false;
|
var parentNameLast = false;
|
||||||
|
@ -410,16 +439,12 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
if (parentNameLast) {
|
if (parentNameLast) {
|
||||||
// Music
|
// Music
|
||||||
if (layoutManager.mobile) {
|
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 {
|
} else {
|
||||||
html = '<h3 class="parentName" style="margin: .25em 0;">' + parentNameHtml.join(' - ') + '</h3>';
|
html = '<h3 class="parentName musicParentName">' + parentNameHtml.join(' - ') + '</h3>';
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (layoutManager.mobile) {
|
html = '<h1 class="parentName">' + tvShowHtml + '</h1>';
|
||||||
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>';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -428,17 +453,19 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
});
|
});
|
||||||
|
|
||||||
if (html && !parentNameLast) {
|
if (html && !parentNameLast) {
|
||||||
if (!layoutManager.mobile && tvSeasonHtml) {
|
if (tvSeasonHtml) {
|
||||||
html += '<h3 class="itemName infoText" style="margin: 0.2em 0 0">' + tvSeasonHtml + ' - ' + name + '</h3>';
|
html += '<h3 class="itemName infoText subtitle">' + tvSeasonHtml + ' - ' + name + '</h3>';
|
||||||
} else {
|
} 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 {
|
} 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) {
|
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;
|
container.innerHTML = html;
|
||||||
|
@ -470,43 +497,18 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
var imgUrl;
|
var imgUrl;
|
||||||
var hasbackdrop = false;
|
var hasbackdrop = false;
|
||||||
var itemBackdropElement = page.querySelector('#itemBackdrop');
|
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()) {
|
if (!layoutManager.mobile && !userSettings.detailsBanner()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('Program' === item.Type && item.ImageTags && item.ImageTags.Thumb) {
|
if (item.BackdropImageTags && item.BackdropImageTags.length) {
|
||||||
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) {
|
|
||||||
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
imgUrl = apiClient.getScaledImageUrl(item.Id, {
|
||||||
type: 'Backdrop',
|
type: 'Backdrop',
|
||||||
maxWidth: dom.getScreenWidth(),
|
maxWidth: dom.getScreenWidth(),
|
||||||
index: 0,
|
index: 0,
|
||||||
tag: item.BackdropImageTags[0]
|
tag: item.BackdropImageTags[0]
|
||||||
});
|
});
|
||||||
page.classList.remove('noBackdrop');
|
|
||||||
imageLoader.lazyImage(itemBackdropElement, imgUrl);
|
imageLoader.lazyImage(itemBackdropElement, imgUrl);
|
||||||
hasbackdrop = true;
|
hasbackdrop = true;
|
||||||
} else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
|
} else if (item.ParentBackdropItemId && item.ParentBackdropImageTags && item.ParentBackdropImageTags.length) {
|
||||||
|
@ -516,50 +518,35 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
index: 0,
|
index: 0,
|
||||||
tag: item.ParentBackdropImageTags[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);
|
imageLoader.lazyImage(itemBackdropElement, imgUrl);
|
||||||
hasbackdrop = true;
|
hasbackdrop = true;
|
||||||
} else {
|
} else {
|
||||||
itemBackdropElement.style.backgroundImage = '';
|
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;
|
return hasbackdrop;
|
||||||
}
|
}
|
||||||
|
|
||||||
function reloadFromItem(instance, page, params, item, user) {
|
function reloadFromItem(instance, page, params, item, user) {
|
||||||
var context = params.context;
|
const apiClient = connectionManager.getApiClient(item.ServerId);
|
||||||
page.querySelector('.detailPagePrimaryContainer').classList.add('detailSticky');
|
|
||||||
|
|
||||||
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('');
|
Emby.Page.setTitle('');
|
||||||
setInitialCollapsibleState(page, item, apiClient, context, user);
|
|
||||||
renderDetails(page, item, apiClient, context);
|
// Start rendering the artwork first
|
||||||
renderTrackSelections(page, instance, item);
|
renderImage(page, item);
|
||||||
|
renderLogo(page, item, apiClient);
|
||||||
renderBackdrop(item);
|
renderBackdrop(item);
|
||||||
renderDetailPageBackdrop(page, item, apiClient);
|
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);
|
var canPlay = reloadPlayButtons(page, item);
|
||||||
|
|
||||||
if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf('PlayTrailers')) {
|
if ((item.LocalTrailerCount || item.RemoteTrailers && item.RemoteTrailers.length) && -1 !== playbackManager.getSupportedCommands().indexOf('PlayTrailers')) {
|
||||||
|
@ -570,12 +557,6 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
|
|
||||||
setTrailerButtonVisibility(page, item);
|
setTrailerButtonVisibility(page, item);
|
||||||
|
|
||||||
if (item.CanDelete && !item.IsFolder) {
|
|
||||||
hideAll(page, 'btnDeleteItem', true);
|
|
||||||
} else {
|
|
||||||
hideAll(page, 'btnDeleteItem');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('Program' !== item.Type || canPlay) {
|
if ('Program' !== item.Type || canPlay) {
|
||||||
hideAll(page, 'mainDetailButtons', true);
|
hideAll(page, 'mainDetailButtons', true);
|
||||||
} else {
|
} else {
|
||||||
|
@ -667,18 +648,15 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderLogo(page, item, apiClient) {
|
function renderLogo(page, item, apiClient) {
|
||||||
var url = logoImageUrl(item, apiClient, {
|
|
||||||
maxWidth: 400
|
|
||||||
});
|
|
||||||
var detailLogo = page.querySelector('.detailLogo');
|
var detailLogo = page.querySelector('.detailLogo');
|
||||||
|
|
||||||
|
var url = logoImageUrl(item, apiClient, {});
|
||||||
|
|
||||||
if (!layoutManager.mobile && !userSettings.enableBackdrops()) {
|
if (!layoutManager.mobile && !userSettings.enableBackdrops()) {
|
||||||
detailLogo.classList.add('hide');
|
detailLogo.classList.add('hide');
|
||||||
} else if (url) {
|
} else if (url) {
|
||||||
detailLogo.classList.remove('hide');
|
detailLogo.classList.remove('hide');
|
||||||
detailLogo.classList.add('lazy');
|
imageLoader.setLazyImage(detailLogo, url);
|
||||||
detailLogo.setAttribute('data-src', url);
|
|
||||||
imageLoader.lazyImage(detailLogo);
|
|
||||||
} else {
|
} else {
|
||||||
detailLogo.classList.add('hide');
|
detailLogo.classList.add('hide');
|
||||||
}
|
}
|
||||||
|
@ -704,172 +682,60 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderLinks(linksElem, item) {
|
function renderLinks(page, item) {
|
||||||
var html = [];
|
var externalLinksElem = page.querySelector('.itemExternalLinks');
|
||||||
|
|
||||||
var links = [];
|
var links = [];
|
||||||
|
|
||||||
if (!layoutManager.tv && item.HomePageUrl) {
|
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) {
|
if (item.ExternalUrls) {
|
||||||
for (var i = 0, length = item.ExternalUrls.length; i < length; i++) {
|
for (const url of item.ExternalUrls) {
|
||||||
var url = item.ExternalUrls[i];
|
links.push(`<a is="emby-linkbutton" class="button-link" href="${url.Url}" target="_blank">${url.Name}</a>`);
|
||||||
links.push('<a style="color:inherit;" is="emby-linkbutton" class="button-link" href="' + url.Url + '" target="_blank">' + url.Name + '</a>');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var html = [];
|
||||||
if (links.length) {
|
if (links.length) {
|
||||||
html.push(links.join(', '));
|
html.push(links.join(', '));
|
||||||
}
|
}
|
||||||
|
|
||||||
linksElem.innerHTML = html.join(', ');
|
externalLinksElem.innerHTML = html.join(', ');
|
||||||
|
|
||||||
if (html.length) {
|
if (html.length) {
|
||||||
linksElem.classList.remove('hide');
|
externalLinksElem.classList.remove('hide');
|
||||||
} else {
|
} else {
|
||||||
linksElem.classList.add('hide');
|
externalLinksElem.classList.add('hide');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderDetailImage(page, elem, item, apiClient, editable, imageLoader, indicators) {
|
function renderDetailImage(elem, item, imageLoader) {
|
||||||
if ('SeriesTimer' === item.Type || 'Program' === item.Type) {
|
const itemArray = [];
|
||||||
editable = false;
|
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.classList.add('detailimg-hidemobile');
|
elem.innerHTML = cardHtml;
|
||||||
|
|
||||||
var imageTags = item.ImageTags || {};
|
imageLoader.lazyChildren(elem);
|
||||||
|
|
||||||
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
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
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(
|
renderDetailImage(
|
||||||
page,
|
|
||||||
page.querySelector('.detailImageContainer'),
|
page.querySelector('.detailImageContainer'),
|
||||||
item,
|
item,
|
||||||
apiClient,
|
imageLoader
|
||||||
user.Policy.IsAdministrator && 'Photo' != item.MediaType,
|
|
||||||
imageLoader,
|
|
||||||
indicators
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -985,54 +851,41 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderOverview(elems, item) {
|
function renderOverview(page, item) {
|
||||||
for (var i = 0, length = elems.length; i < length; i++) {
|
for (const overviewElemnt of page.querySelectorAll('.overview')) {
|
||||||
var elem = elems[i];
|
|
||||||
var overview = item.Overview || '';
|
var overview = item.Overview || '';
|
||||||
|
|
||||||
if (overview) {
|
if (overview) {
|
||||||
elem.innerHTML = overview;
|
overviewElemnt.innerHTML = overview;
|
||||||
elem.classList.remove('hide');
|
overviewElemnt.classList.remove('hide');
|
||||||
elem.classList.add('detail-clamp-text');
|
overviewElemnt.classList.add('detail-clamp-text');
|
||||||
|
|
||||||
// Grab the sibling element to control the expand state
|
// 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
|
// Detect if we have overflow of text. Based on this StackOverflow answer
|
||||||
// https://stackoverflow.com/a/35157976
|
// 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');
|
expandButton.classList.remove('hide');
|
||||||
} else {
|
} else {
|
||||||
expandButton.classList.add('hide');
|
expandButton.classList.add('hide');
|
||||||
}
|
}
|
||||||
|
|
||||||
expandButton.addEventListener('click', toggleLineClamp.bind(null, elem));
|
expandButton.addEventListener('click', toggleLineClamp.bind(null, overviewElemnt));
|
||||||
|
|
||||||
var anchors = elem.querySelectorAll('a');
|
for (const anchor of overviewElemnt.querySelectorAll('a')) {
|
||||||
|
anchor.setAttribute('target', '_blank');
|
||||||
for (var j = 0, length2 = anchors.length; j < length2; j++) {
|
|
||||||
anchors[j].setAttribute('target', '_blank');
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
elem.innerHTML = '';
|
overviewElemnt.innerHTML = '';
|
||||||
elem.classList.add('hide');
|
overviewElemnt.classList.add('hide');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderGenres(page, item, context) {
|
function renderGenres(page, item, context = inferContext(item)) {
|
||||||
context = context || inferContext(item);
|
|
||||||
var type;
|
|
||||||
var genres = item.GenreItems || [];
|
var genres = item.GenreItems || [];
|
||||||
|
var type = context === 'music' ? 'MusicGenre' : 'Genre';
|
||||||
switch (context) {
|
|
||||||
case 'music':
|
|
||||||
type = 'MusicGenre';
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
type = 'Genre';
|
|
||||||
}
|
|
||||||
|
|
||||||
var html = genres.map(function (p) {
|
var html = genres.map(function (p) {
|
||||||
return '<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + appRouter.getRouteUrl({
|
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) {
|
function renderWriter(page, item, context) {
|
||||||
var directors = (item.People || []).filter(function (p) {
|
var writers = (item.People || []).filter(function (person) {
|
||||||
return 'Director' === p.Type;
|
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({
|
return '<a style="color:inherit;" class="button-link" is="emby-linkbutton" href="' + appRouter.getRouteUrl({
|
||||||
Name: p.Name,
|
Name: person.Name,
|
||||||
Type: 'Person',
|
Type: 'Person',
|
||||||
ServerId: item.ServerId,
|
ServerId: item.ServerId,
|
||||||
Id: p.Id
|
Id: person.Id
|
||||||
}, {
|
}, {
|
||||||
context: context
|
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(', ');
|
}).join(', ');
|
||||||
|
|
||||||
var directorsLabel = page.querySelector('.directorsLabel');
|
var directorsLabel = page.querySelector('.directorsLabel');
|
||||||
|
@ -1086,13 +969,39 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderDetails(page, item, apiClient, context, isStatic) {
|
function renderMiscInfo(page, item) {
|
||||||
renderSimilarItems(page, item, context);
|
const primaryItemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary');
|
||||||
renderMoreFromSeason(page, item, apiClient);
|
|
||||||
renderMoreFromArtist(page, item, apiClient);
|
for (const miscInfo of primaryItemMiscInfo) {
|
||||||
renderDirector(page, item, context);
|
mediaInfo.fillPrimaryMediaInfo(miscInfo, item, {
|
||||||
renderGenres(page, item, context);
|
interactive: true,
|
||||||
renderChannelGuide(page, apiClient, item);
|
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');
|
var taglineElement = page.querySelector('.tagline');
|
||||||
|
|
||||||
if (item.Taglines && item.Taglines.length) {
|
if (item.Taglines && item.Taglines.length) {
|
||||||
|
@ -1101,44 +1010,21 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
} else {
|
} else {
|
||||||
taglineElement.classList.add('hide');
|
taglineElement.classList.add('hide');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var overview = page.querySelector('.overview');
|
function renderDetails(page, item, apiClient, context, isStatic) {
|
||||||
var externalLinksElem = page.querySelector('.itemExternalLinks');
|
renderSimilarItems(page, item, context);
|
||||||
|
renderMoreFromSeason(page, item, apiClient);
|
||||||
renderOverview([overview], item);
|
renderMoreFromArtist(page, item, apiClient);
|
||||||
|
renderDirector(page, item, context);
|
||||||
var i;
|
renderWriter(page, item, context);
|
||||||
var itemMiscInfo;
|
renderGenres(page, item, context);
|
||||||
itemMiscInfo = page.querySelectorAll('.itemMiscInfo-primary');
|
renderChannelGuide(page, apiClient, item);
|
||||||
for (i = 0; i < itemMiscInfo.length; i++) {
|
renderTagline(page, item);
|
||||||
mediaInfo.fillPrimaryMediaInfo(itemMiscInfo[i], item, {
|
renderOverview(page, item);
|
||||||
interactive: true,
|
renderMiscInfo(page, item);
|
||||||
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');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reloadUserDataButtons(page, item);
|
reloadUserDataButtons(page, item);
|
||||||
renderLinks(externalLinksElem, item);
|
renderLinks(page, item);
|
||||||
renderTags(page, item);
|
renderTags(page, item);
|
||||||
renderSeriesAirTime(page, item, isStatic);
|
renderSeriesAirTime(page, item, isStatic);
|
||||||
}
|
}
|
||||||
|
@ -1426,8 +1312,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
action: 'playallfromhere',
|
action: 'playallfromhere',
|
||||||
image: false,
|
image: false,
|
||||||
artist: 'auto',
|
artist: 'auto',
|
||||||
containerAlbumArtists: item.AlbumArtists,
|
containerAlbumArtists: item.AlbumArtists
|
||||||
addToListButton: true
|
|
||||||
});
|
});
|
||||||
isList = true;
|
isList = true;
|
||||||
} else if ('Series' == item.Type) {
|
} else if ('Series' == item.Type) {
|
||||||
|
@ -1469,11 +1354,12 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
items: result.Items,
|
items: result.Items,
|
||||||
showIndexNumber: false,
|
showIndexNumber: false,
|
||||||
enableOverview: true,
|
enableOverview: true,
|
||||||
|
enablePlayedButton: layoutManager.mobile ? false : true,
|
||||||
|
infoButton: layoutManager.mobile ? false : true,
|
||||||
imageSize: 'large',
|
imageSize: 'large',
|
||||||
enableSideMediaInfo: false,
|
enableSideMediaInfo: false,
|
||||||
highlight: false,
|
highlight: false,
|
||||||
action: layoutManager.tv ? 'resume' : 'none',
|
action: layoutManager.tv ? 'resume' : 'none',
|
||||||
infoButton: true,
|
|
||||||
imagePlayButton: true,
|
imagePlayButton: true,
|
||||||
includeParentInfoInTitle: false
|
includeParentInfoInTitle: false
|
||||||
});
|
});
|
||||||
|
@ -1500,6 +1386,9 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
childrenItemsContainer.classList.remove('vertical-list');
|
childrenItemsContainer.classList.remove('vertical-list');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (layoutManager.mobile) {
|
||||||
|
childrenItemsContainer.classList.remove('padded-right');
|
||||||
|
}
|
||||||
childrenItemsContainer.innerHTML = html;
|
childrenItemsContainer.innerHTML = html;
|
||||||
imageLoader.lazyChildren(childrenItemsContainer);
|
imageLoader.lazyChildren(childrenItemsContainer);
|
||||||
if ('BoxSet' == item.Type) {
|
if ('BoxSet' == item.Type) {
|
||||||
|
@ -1701,12 +1590,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderCollectionItems(page, parentItem, types, items) {
|
function renderCollectionItems(page, parentItem, types, items) {
|
||||||
|
page.querySelector('.collectionItems').classList.remove('hide');
|
||||||
page.querySelector('.collectionItems').innerHTML = '';
|
page.querySelector('.collectionItems').innerHTML = '';
|
||||||
var i;
|
|
||||||
var length;
|
|
||||||
|
|
||||||
for (i = 0, length = types.length; i < length; i++) {
|
for (const type of types) {
|
||||||
var type = types[i];
|
|
||||||
var typeItems = filterItemsByCollectionItemType(items, type);
|
var typeItems = filterItemsByCollectionItemType(items, type);
|
||||||
|
|
||||||
if (typeItems.length) {
|
if (typeItems.length) {
|
||||||
|
@ -1739,8 +1626,8 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
renderChildren(page, parentItem);
|
renderChildren(page, parentItem);
|
||||||
};
|
};
|
||||||
|
|
||||||
for (i = 0, length = containers.length; i < length; i++) {
|
for (const container of containers) {
|
||||||
containers[i].notifyRefreshNeeded = notifyRefreshNeeded;
|
container.notifyRefreshNeeded = notifyRefreshNeeded;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if nothing in the collection can be played hide play and shuffle buttons
|
// 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) {
|
function renderCast(page, item) {
|
||||||
var people = (item.People || []).filter(function (p) {
|
var people = (item.People || []).filter(function (p) {
|
||||||
return 'Director' !== p.Type;
|
return p.Type === 'Actor';
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!people.length) {
|
if (!people.length) {
|
||||||
|
@ -1905,12 +1792,10 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
}
|
}
|
||||||
|
|
||||||
function bindAll(view, selector, eventName, fn) {
|
function bindAll(view, selector, eventName, fn) {
|
||||||
var i;
|
|
||||||
var length;
|
|
||||||
var elems = view.querySelectorAll(selector);
|
var elems = view.querySelectorAll(selector);
|
||||||
|
|
||||||
for (i = 0, length = elems.length; i < length; i++) {
|
for (const elem of elems) {
|
||||||
elems[i].addEventListener(eventName, fn);
|
elem.addEventListener(eventName, fn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1923,13 +1808,14 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
return function (view, params) {
|
return function (view, params) {
|
||||||
function reload(instance, page, params) {
|
function reload(instance, page, params) {
|
||||||
loading.show();
|
loading.show();
|
||||||
|
|
||||||
var apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient;
|
var apiClient = params.serverId ? connectionManager.getApiClient(params.serverId) : ApiClient;
|
||||||
var promises = [getPromise(apiClient, params), apiClient.getCurrentUser()];
|
|
||||||
Promise.all(promises).then(function (responses) {
|
Promise.all([getPromise(apiClient, params), apiClient.getCurrentUser()]).then(([item, user]) => {
|
||||||
var item = responses[0];
|
|
||||||
var user = responses[1];
|
|
||||||
currentItem = item;
|
currentItem = item;
|
||||||
reloadFromItem(instance, page, params, item, user);
|
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() {
|
function onPlayClick() {
|
||||||
|
@ -1995,15 +1881,6 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
playbackManager.shuffle(currentItem);
|
playbackManager.shuffle(currentItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onDeleteClick() {
|
|
||||||
require(['deleteHelper'], function (deleteHelper) {
|
|
||||||
deleteHelper.deleteItem({
|
|
||||||
item: currentItem,
|
|
||||||
navigate: true
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function onCancelSeriesTimerClick() {
|
function onCancelSeriesTimerClick() {
|
||||||
require(['recordingHelper'], function (recordingHelper) {
|
require(['recordingHelper'], function (recordingHelper) {
|
||||||
recordingHelper.cancelSeriesTimerWithConfirmation(currentItem.Id, currentItem.ServerId).then(function () {
|
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, '.btnPlayTrailer', 'click', onPlayTrailerClick);
|
||||||
bindAll(view, '.btnCancelSeriesTimer', 'click', onCancelSeriesTimerClick);
|
bindAll(view, '.btnCancelSeriesTimer', 'click', onCancelSeriesTimerClick);
|
||||||
bindAll(view, '.btnCancelTimer', 'click', onCancelTimerClick);
|
bindAll(view, '.btnCancelTimer', 'click', onCancelTimerClick);
|
||||||
bindAll(view, '.btnDeleteItem', 'click', onDeleteClick);
|
|
||||||
bindAll(view, '.btnDownload', 'click', onDownloadClick);
|
bindAll(view, '.btnDownload', 'click', onDownloadClick);
|
||||||
view.querySelector('.trackSelections').addEventListener('submit', onTrackSelectionsSubmit);
|
view.querySelector('.trackSelections').addEventListener('submit', onTrackSelectionsSubmit);
|
||||||
view.querySelector('.btnSplitVersions').addEventListener('click', function () {
|
view.querySelector('.btnSplitVersions').addEventListener('click', function () {
|
||||||
|
@ -2125,9 +2001,7 @@ define(['loading', 'appRouter', 'layoutManager', 'connectionManager', 'userSetti
|
||||||
view.addEventListener('viewshow', function (e) {
|
view.addEventListener('viewshow', function (e) {
|
||||||
var page = this;
|
var page = this;
|
||||||
|
|
||||||
if (layoutManager.mobile) {
|
libraryMenu.setTransparentMenu(true);
|
||||||
libraryMenu.setTransparentMenu(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (e.detail.isRestored) {
|
if (e.detail.isRestored) {
|
||||||
if (currentItem) {
|
if (currentItem) {
|
|
@ -333,13 +333,21 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
|
||||||
osdPoster.innerHTML = '';
|
osdPoster.innerHTML = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let osdLockCount = 0;
|
||||||
|
|
||||||
function showOsd() {
|
function showOsd() {
|
||||||
slideDownToShow(headerElement);
|
slideDownToShow(headerElement);
|
||||||
showMainOsdControls();
|
showMainOsdControls();
|
||||||
startOsdHideTimer();
|
if (!osdLockCount) {
|
||||||
|
startOsdHideTimer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function hideOsd() {
|
function hideOsd() {
|
||||||
|
if (osdLockCount) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
slideUpToHide(headerElement);
|
slideUpToHide(headerElement);
|
||||||
hideMainOsdControls();
|
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() {
|
function startOsdHideTimer() {
|
||||||
stopOsdHideTimer();
|
stopOsdHideTimer();
|
||||||
osdHideTimeout = setTimeout(hideOsd, 3e3);
|
osdHideTimeout = setTimeout(hideOsd, 3e3);
|
||||||
|
@ -1080,7 +1101,7 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
|
||||||
*/
|
*/
|
||||||
var clickedElement;
|
var clickedElement;
|
||||||
|
|
||||||
function onWindowKeyDown(e) {
|
function onKeyDown(e) {
|
||||||
clickedElement = e.srcElement;
|
clickedElement = e.srcElement;
|
||||||
|
|
||||||
var key = keyboardnavigation.getKeyName(e);
|
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) {
|
function onWindowMouseDown(e) {
|
||||||
clickedElement = e.srcElement;
|
clickedElement = e.srcElement;
|
||||||
|
lockOsd();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onWindowMouseUp() {
|
||||||
|
unlockOsd();
|
||||||
}
|
}
|
||||||
|
|
||||||
function onWindowTouchStart(e) {
|
function onWindowTouchStart(e) {
|
||||||
clickedElement = e.srcElement;
|
clickedElement = e.srcElement;
|
||||||
|
lockOsd();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onWindowTouchEnd() {
|
||||||
|
unlockOsd();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getImgUrl(item, chapter, index, maxWidth, apiClient) {
|
function getImgUrl(item, chapter, index, maxWidth, apiClient) {
|
||||||
|
@ -1312,9 +1350,11 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
|
||||||
var headerElement = document.querySelector('.skinHeader');
|
var headerElement = document.querySelector('.skinHeader');
|
||||||
var osdBottomElement = document.querySelector('.videoOsdBottom-maincontrols');
|
var osdBottomElement = document.querySelector('.videoOsdBottom-maincontrols');
|
||||||
|
|
||||||
|
nowPlayingPositionSlider.enableKeyboardDragging();
|
||||||
|
nowPlayingVolumeSlider.enableKeyboardDragging();
|
||||||
|
|
||||||
if (layoutManager.tv) {
|
if (layoutManager.tv) {
|
||||||
nowPlayingPositionSlider.classList.add('focusable');
|
nowPlayingPositionSlider.classList.add('focusable');
|
||||||
nowPlayingPositionSlider.enableKeyboardDragging();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
view.addEventListener('viewbeforeshow', function (e) {
|
view.addEventListener('viewbeforeshow', function (e) {
|
||||||
|
@ -1330,18 +1370,27 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
|
||||||
});
|
});
|
||||||
showOsd();
|
showOsd();
|
||||||
inputManager.on(window, onInputCommand);
|
inputManager.on(window, onInputCommand);
|
||||||
dom.addEventListener(window, 'keydown', onWindowKeyDown, {
|
document.addEventListener('keydown', onKeyDown);
|
||||||
|
dom.addEventListener(document, 'keydown', onKeyDownCapture, {
|
||||||
capture: true
|
capture: true
|
||||||
});
|
});
|
||||||
dom.addEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
|
dom.addEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
|
dom.addEventListener(window, window.PointerEvent ? 'pointerup' : 'mouseup', onWindowMouseUp, {
|
||||||
|
passive: true
|
||||||
|
});
|
||||||
dom.addEventListener(window, 'touchstart', onWindowTouchStart, {
|
dom.addEventListener(window, 'touchstart', onWindowTouchStart, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
|
['touchend', 'touchcancel'].forEach((event) => {
|
||||||
|
dom.addEventListener(window, event, onWindowTouchEnd, {
|
||||||
|
passive: true
|
||||||
|
});
|
||||||
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
require(['appRouter'], function(appRouter) {
|
require(['appRouter'], function(appRouter) {
|
||||||
appRouter.showDirect('/');
|
appRouter.goHome();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1350,15 +1399,24 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
|
||||||
statsOverlay.enabled(false);
|
statsOverlay.enabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
dom.removeEventListener(window, 'keydown', onWindowKeyDown, {
|
document.removeEventListener('keydown', onKeyDown);
|
||||||
|
dom.removeEventListener(document, 'keydown', onKeyDownCapture, {
|
||||||
capture: true
|
capture: true
|
||||||
});
|
});
|
||||||
dom.removeEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
|
dom.removeEventListener(window, window.PointerEvent ? 'pointerdown' : 'mousedown', onWindowMouseDown, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
|
dom.removeEventListener(window, window.PointerEvent ? 'pointerup' : 'mouseup', onWindowMouseUp, {
|
||||||
|
passive: true
|
||||||
|
});
|
||||||
dom.removeEventListener(window, 'touchstart', onWindowTouchStart, {
|
dom.removeEventListener(window, 'touchstart', onWindowTouchStart, {
|
||||||
passive: true
|
passive: true
|
||||||
});
|
});
|
||||||
|
['touchend', 'touchcancel'].forEach((event) => {
|
||||||
|
dom.removeEventListener(window, event, onWindowTouchEnd, {
|
||||||
|
passive: true
|
||||||
|
});
|
||||||
|
});
|
||||||
stopOsdHideTimer();
|
stopOsdHideTimer();
|
||||||
headerElement.classList.remove('osdHeader');
|
headerElement.classList.remove('osdHeader');
|
||||||
headerElement.classList.remove('osdHeader-hidden');
|
headerElement.classList.remove('osdHeader-hidden');
|
||||||
|
@ -1447,16 +1505,13 @@ define(['playbackManager', 'dom', 'inputManager', 'datetime', 'itemHelper', 'med
|
||||||
}, options);
|
}, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
function setVolume() {
|
|
||||||
playbackManager.setVolume(this.value, currentPlayer);
|
|
||||||
}
|
|
||||||
|
|
||||||
view.querySelector('.buttonMute').addEventListener('click', function () {
|
view.querySelector('.buttonMute').addEventListener('click', function () {
|
||||||
playbackManager.toggleMute(currentPlayer);
|
playbackManager.toggleMute(currentPlayer);
|
||||||
});
|
});
|
||||||
nowPlayingVolumeSlider.addEventListener('change', setVolume);
|
|
||||||
nowPlayingVolumeSlider.addEventListener('mousemove', setVolume);
|
nowPlayingVolumeSlider.addEventListener('input', (e) => {
|
||||||
nowPlayingVolumeSlider.addEventListener('touchmove', setVolume);
|
playbackManager.setVolume(e.target.value, currentPlayer);
|
||||||
|
});
|
||||||
|
|
||||||
nowPlayingPositionSlider.addEventListener('change', function () {
|
nowPlayingPositionSlider.addEventListener('change', function () {
|
||||||
var player = currentPlayer;
|
var player = currentPlayer;
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
min-width: 104px;
|
min-width: 104px;
|
||||||
min-height: 24px;
|
min-height: 24px;
|
||||||
padding-top: 1.25em;
|
padding-top: 0.85em;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
@ -52,7 +52,7 @@
|
||||||
<!-- iPad Pro 1 -->
|
<!-- iPad Pro 1 -->
|
||||||
<link href="assets/splash/ipadpro1_splash.png" media="screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" rel="apple-touch-startup-image" />
|
<link href="assets/splash/ipadpro1_splash.png" media="screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" rel="apple-touch-startup-image" />
|
||||||
<link href="assets/splash/ipadpro1_splash_l.png" media="screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" rel="apple-touch-startup-image" />
|
<link href="assets/splash/ipadpro1_splash_l.png" media="screen and (device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" rel="apple-touch-startup-image" />
|
||||||
|
|
||||||
<!-- iPad Pro 3 -->
|
<!-- iPad Pro 3 -->
|
||||||
<link href="assets/splash/ipadpro3_splash.png" media="screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" rel="apple-touch-startup-image" />
|
<link href="assets/splash/ipadpro3_splash.png" media="screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" rel="apple-touch-startup-image" />
|
||||||
<link href="assets/splash/ipadpro3_splash_l.png" media="screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" rel="apple-touch-startup-image" />
|
<link href="assets/splash/ipadpro3_splash_l.png" media="screen and (device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" rel="apple-touch-startup-image" />
|
||||||
|
@ -69,12 +69,19 @@
|
||||||
<title>Jellyfin</title>
|
<title>Jellyfin</title>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.transparentDocument, .backgroundContainer-transparent:not(.withBackdrop) {
|
.transparentDocument,
|
||||||
|
.backgroundContainer-transparent:not(.withBackdrop) {
|
||||||
background: none !important;
|
background: none !important;
|
||||||
background-color: transparent !important;
|
background-color: transparent !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mouseIdle, .mouseIdle button, .mouseIdle select, .mouseIdle input, .mouseIdle textarea, .mouseIdle a, .mouseIdle label {
|
.mouseIdle,
|
||||||
|
.mouseIdle button,
|
||||||
|
.mouseIdle select,
|
||||||
|
.mouseIdle input,
|
||||||
|
.mouseIdle textarea,
|
||||||
|
.mouseIdle a,
|
||||||
|
.mouseIdle label {
|
||||||
cursor: none !important;
|
cursor: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +89,9 @@
|
||||||
background-color: #101010;
|
background-color: #101010;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hide, .mouseIdle .hide-mouse-idle, .mouseIdle-tv .hide-mouse-idle-tv {
|
.hide,
|
||||||
|
.mouseIdle .hide-mouse-idle,
|
||||||
|
.mouseIdle-tv .hide-mouse-idle-tv {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +103,42 @@
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
width: 0.8em;
|
width: 0.8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes fadein {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadein {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.splashLogo {
|
||||||
|
-webkit-animation: fadein 0.5s;
|
||||||
|
animation: fadein 0.5s;
|
||||||
|
width: 30%;
|
||||||
|
height: 30%;
|
||||||
|
background-image: url(assets/img/banner-light.png);
|
||||||
|
background-position: center center;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: contain;
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
-webkit-transform: translate(-50%, -50%);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -103,7 +148,9 @@
|
||||||
<div class="mainDrawer-scrollContainer scrollContainer focuscontainer-y"></div>
|
<div class="mainDrawer-scrollContainer scrollContainer focuscontainer-y"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="skinHeader focuscontainer-x"></div>
|
<div class="skinHeader focuscontainer-x"></div>
|
||||||
<div class="mainAnimatedPages skinBody"></div>
|
<div class="mainAnimatedPages skinBody">
|
||||||
|
<div class="splashLogo"></div>
|
||||||
|
</div>
|
||||||
<div class="mainDrawerHandle"></div>
|
<div class="mainDrawerHandle"></div>
|
||||||
|
|
||||||
<!-- inject:js -->
|
<!-- inject:js -->
|
||||||
|
|
|
@ -649,7 +649,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
|
||||||
function setTrackEventsSubtitleOffset(trackEvents, offsetValue) {
|
function setTrackEventsSubtitleOffset(trackEvents, offsetValue) {
|
||||||
|
|
||||||
if (Array.isArray(trackEvents)) {
|
if (Array.isArray(trackEvents)) {
|
||||||
offsetValue = updateCurrentTrackOffset(offsetValue);
|
offsetValue = updateCurrentTrackOffset(offsetValue) * 1e7; // ticks
|
||||||
trackEvents.forEach(function(trackEvent) {
|
trackEvents.forEach(function(trackEvent) {
|
||||||
trackEvent.StartPositionTicks -= offsetValue;
|
trackEvent.StartPositionTicks -= offsetValue;
|
||||||
trackEvent.EndPositionTicks -= offsetValue;
|
trackEvent.EndPositionTicks -= offsetValue;
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
src += `?v=${self.dashboardVersion}`;
|
src += `?v=${self.dashboardVersion}`;
|
||||||
}
|
}
|
||||||
script.src = src;
|
script.src = src;
|
||||||
|
script.setAttribute('async', '');
|
||||||
|
|
||||||
if (onload) {
|
if (onload) {
|
||||||
script.onload = onload;
|
script.onload = onload;
|
||||||
|
|
|
@ -211,7 +211,7 @@
|
||||||
'MozAnimation': 'animationend',
|
'MozAnimation': 'animationend',
|
||||||
'WebkitAnimation': 'webkitAnimationEnd'
|
'WebkitAnimation': 'webkitAnimationEnd'
|
||||||
};
|
};
|
||||||
for (let t in animations) {
|
for (const t in animations) {
|
||||||
if (el.style[t] !== undefined) {
|
if (el.style[t] !== undefined) {
|
||||||
_animationEvent = animations[t];
|
_animationEvent = animations[t];
|
||||||
return animations[t];
|
return animations[t];
|
||||||
|
@ -251,7 +251,7 @@
|
||||||
'MozTransition': 'transitionend',
|
'MozTransition': 'transitionend',
|
||||||
'WebkitTransition': 'webkitTransitionEnd'
|
'WebkitTransition': 'webkitTransitionEnd'
|
||||||
};
|
};
|
||||||
for (let t in transitions) {
|
for (const t in transitions) {
|
||||||
if (el.style[t] !== undefined) {
|
if (el.style[t] !== undefined) {
|
||||||
_transitionEvent = transitions[t];
|
_transitionEvent = transitions[t];
|
||||||
return transitions[t];
|
return transitions[t];
|
||||||
|
|
|
@ -71,12 +71,12 @@ define(['connectionManager', 'listView', 'cardBuilder', 'imageLoader', 'libraryB
|
||||||
|
|
||||||
html += '<div class="' + sectionClass + '" data-type="' + section.type + '">';
|
html += '<div class="' + sectionClass + '" data-type="' + section.type + '">';
|
||||||
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">';
|
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">';
|
||||||
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">';
|
html += '<h2 class="sectionTitle sectionTitle-cards">';
|
||||||
html += section.name;
|
html += section.name;
|
||||||
html += '</h2>';
|
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 += '<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>';
|
||||||
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right">';
|
html += '<div is="emby-itemscontainer" class="itemsContainer padded-right">';
|
||||||
html += '</div>';
|
html += '</div>';
|
||||||
return html += '</div>';
|
return html += '</div>';
|
||||||
}).join('');
|
}).join('');
|
||||||
|
|
|
@ -78,7 +78,7 @@ export function isNavigationKey(key) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function enable() {
|
export function enable() {
|
||||||
document.addEventListener('keydown', function (e) {
|
window.addEventListener('keydown', function (e) {
|
||||||
const key = getKeyName(e);
|
const key = getKeyName(e);
|
||||||
|
|
||||||
// Ignore navigation keys for non-TV
|
// Ignore navigation keys for non-TV
|
||||||
|
|
|
@ -13,7 +13,7 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
|
||||||
html += '<div class="headerRight">';
|
html += '<div class="headerRight">';
|
||||||
html += '<span class="headerSelectedPlayer"></span>';
|
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="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 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 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>';
|
html += '<button is="paper-icon-button-light" class="headerButton headerButtonRight headerUserButton hide"><span class="material-icons person"></span></button>';
|
||||||
|
|
|
@ -15,7 +15,7 @@ define([
|
||||||
'detailtablecss'], function () {
|
'detailtablecss'], function () {
|
||||||
|
|
||||||
function defineRoute(newRoute) {
|
function defineRoute(newRoute) {
|
||||||
var path = newRoute.path;
|
var path = newRoute.alias ? newRoute.alias : newRoute.path;
|
||||||
console.debug('defining route: ' + path);
|
console.debug('defining route: ' + path);
|
||||||
newRoute.dictionary = 'core';
|
newRoute.dictionary = 'core';
|
||||||
Emby.Page.addRoute(path, newRoute);
|
Emby.Page.addRoute(path, newRoute);
|
||||||
|
@ -240,8 +240,9 @@ define([
|
||||||
transition: 'fade'
|
transition: 'fade'
|
||||||
});
|
});
|
||||||
defineRoute({
|
defineRoute({
|
||||||
path: '/itemdetails.html',
|
alias: '/details',
|
||||||
controller: 'itemDetails',
|
path: '/controllers/itemDetails/index.html',
|
||||||
|
controller: 'itemDetails/index',
|
||||||
autoFocus: false,
|
autoFocus: false,
|
||||||
transition: 'fade'
|
transition: 'fade'
|
||||||
});
|
});
|
||||||
|
|
|
@ -1038,7 +1038,7 @@ var AppInfo = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('SeriesTimer' == itemType) {
|
if ('SeriesTimer' == itemType) {
|
||||||
return 'itemdetails.html?seriesTimerId=' + id + '&serverId=' + serverId;
|
return 'details?seriesTimerId=' + id + '&serverId=' + serverId;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('livetv' == item.CollectionType) {
|
if ('livetv' == item.CollectionType) {
|
||||||
|
@ -1108,13 +1108,13 @@ var AppInfo = {};
|
||||||
var itemTypes = ['Playlist', 'TvChannel', 'Program', 'BoxSet', 'MusicAlbum', 'MusicGenre', 'Person', 'Recording', 'MusicArtist'];
|
var itemTypes = ['Playlist', 'TvChannel', 'Program', 'BoxSet', 'MusicAlbum', 'MusicGenre', 'Person', 'Recording', 'MusicArtist'];
|
||||||
|
|
||||||
if (itemTypes.indexOf(itemType) >= 0) {
|
if (itemTypes.indexOf(itemType) >= 0) {
|
||||||
return 'itemdetails.html?id=' + id + '&serverId=' + serverId;
|
return 'details?id=' + id + '&serverId=' + serverId;
|
||||||
}
|
}
|
||||||
|
|
||||||
var contextSuffix = context ? '&context=' + context : '';
|
var contextSuffix = context ? '&context=' + context : '';
|
||||||
|
|
||||||
if ('Series' == itemType || 'Season' == itemType || 'Episode' == itemType) {
|
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) {
|
if (item.IsFolder) {
|
||||||
|
@ -1125,7 +1125,7 @@ var AppInfo = {};
|
||||||
return '#';
|
return '#';
|
||||||
}
|
}
|
||||||
|
|
||||||
return 'itemdetails.html?id=' + id + '&serverId=' + serverId;
|
return 'details?id=' + id + '&serverId=' + serverId;
|
||||||
};
|
};
|
||||||
|
|
||||||
appRouter.showItem = showItem;
|
appRouter.showItem = showItem;
|
||||||
|
|
|
@ -922,7 +922,7 @@
|
||||||
"ValueSpecialEpisodeName": "خاص - {0}",
|
"ValueSpecialEpisodeName": "خاص - {0}",
|
||||||
"HeaderFavoriteAlbums": "الألبومات المفضلة",
|
"HeaderFavoriteAlbums": "الألبومات المفضلة",
|
||||||
"HeaderAlbumArtists": "فناني الألبومات",
|
"HeaderAlbumArtists": "فناني الألبومات",
|
||||||
"Genres": "الأنواع",
|
"Genres": "التضنيفات",
|
||||||
"Folders": "المجلدات",
|
"Folders": "المجلدات",
|
||||||
"Favorites": "المفضلة",
|
"Favorites": "المفضلة",
|
||||||
"Collections": "مجموعات",
|
"Collections": "مجموعات",
|
||||||
|
@ -964,7 +964,7 @@
|
||||||
"AllEpisodes": "كل الحلقات",
|
"AllEpisodes": "كل الحلقات",
|
||||||
"AllComplexFormats": "جميع التنسيقات المعقدة (ASS ، SSA ، VOBSUB ، PGS ، SUB / IDX ، ...)",
|
"AllComplexFormats": "جميع التنسيقات المعقدة (ASS ، SSA ، VOBSUB ، PGS ، SUB / IDX ، ...)",
|
||||||
"AllChannels": "كل القنوات",
|
"AllChannels": "كل القنوات",
|
||||||
"Albums": "ألبومات",
|
"Albums": "البومات",
|
||||||
"Aired": "عرضت",
|
"Aired": "عرضت",
|
||||||
"AirDate": "تاريخ العرض",
|
"AirDate": "تاريخ العرض",
|
||||||
"AddedOnValue": "أضيفت",
|
"AddedOnValue": "أضيفت",
|
||||||
|
@ -1151,5 +1151,6 @@
|
||||||
"DisplayInOtherHomeScreenSections": "عرض في أقسام الشاشة الرئيسية مثل أحدث الوسائط واستمر في المشاهدة",
|
"DisplayInOtherHomeScreenSections": "عرض في أقسام الشاشة الرئيسية مثل أحدث الوسائط واستمر في المشاهدة",
|
||||||
"DisplayInMyMedia": "عرض على الشاشة الرئيسية",
|
"DisplayInMyMedia": "عرض على الشاشة الرئيسية",
|
||||||
"Display": "عرض",
|
"Display": "عرض",
|
||||||
"Dislike": "لم يعجبنى"
|
"Dislike": "لم يعجبنى",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,5 +19,6 @@
|
||||||
"ThisWizardWillGuideYou": "Гэты памочнік правядзе вас праз усе фазы ўстаноўкі і налады. Спачатку абярыце упадабаную мову.",
|
"ThisWizardWillGuideYou": "Гэты памочнік правядзе вас праз усе фазы ўстаноўкі і налады. Спачатку абярыце упадабаную мову.",
|
||||||
"UserProfilesIntro": "У Jellyfin існуе ўбудаваная падтрымка для карыстальніцкіх профіляў, дазваляючы кожнаму карыстальніку валодаць сваімі ўласнымі параметрамі адлюстравання, станам прайгравання і кіраваннем ўтрымання.",
|
"UserProfilesIntro": "У Jellyfin існуе ўбудаваная падтрымка для карыстальніцкіх профіляў, дазваляючы кожнаму карыстальніку валодаць сваімі ўласнымі параметрамі адлюстравання, станам прайгравання і кіраваннем ўтрымання.",
|
||||||
"WelcomeToProject": "Пачатак працы ў Jellyfin!",
|
"WelcomeToProject": "Пачатак працы ў Jellyfin!",
|
||||||
"WizardCompleted": "Гэта ўсё, што нам трэба зараз. Jellyfin пачынае збіраць звесткі аб вашай медыятэцы. Азнаёмцеся пакуль з некаторымі нашымі праграмамі, а затым націсніце <b>Гатова</b>, каб праглядзець <b>Инфопанель сервера</b>."
|
"WizardCompleted": "Гэта ўсё, што нам трэба зараз. Jellyfin пачынае збіраць звесткі аб вашай медыятэцы. Азнаёмцеся пакуль з некаторымі нашымі праграмамі, а затым націсніце <b>Гатова</b>, каб праглядзець <b>Инфопанель сервера</b>.",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1382,7 +1382,7 @@
|
||||||
"MessagePleaseWait": "Моля,изчакайте. Това може да отнеме минута.",
|
"MessagePleaseWait": "Моля,изчакайте. Това може да отнеме минута.",
|
||||||
"MessagePlayAccessRestricted": "Възпроизвеждането на това съдържание в момента е ограничено.Моля, свържете се с администратора на вашия сървър за повече информация.",
|
"MessagePlayAccessRestricted": "Възпроизвеждането на това съдържание в момента е ограничено.Моля, свържете се с администратора на вашия сървър за повече информация.",
|
||||||
"MessagePasswordResetForUsers": "Следните потребители са занулили паролите си.Те вече могат да влязат с пин кодовете, използвани за извършване на нулирането.",
|
"MessagePasswordResetForUsers": "Следните потребители са занулили паролите си.Те вече могат да влязат с пин кодовете, използвани за извършване на нулирането.",
|
||||||
"MessageNoTrailersFound": "Не са намерени трейлъри.За да подобрите филмовото изживяване инсталирайте канал за трейлъри,може да подредите няколко канала в библиотека.",
|
"MessageNoTrailersFound": "За да подобрите филмовото изживяване инсталирайте канал за трейлъри,може да подредите няколко канала в библиотека.",
|
||||||
"MessageNoServersAvailable": "Не са намерени сървъри, използващи функцията за автоматично откриване на сървър.",
|
"MessageNoServersAvailable": "Не са намерени сървъри, използващи функцията за автоматично откриване на сървър.",
|
||||||
"MessageNoMovieSuggestionsAvailable": "Понастоящем няма предложени филми. Започнете да гледате и оценявате филмите си, а след това се върнете, за да видите препоръките си.",
|
"MessageNoMovieSuggestionsAvailable": "Понастоящем няма предложени филми. Започнете да гледате и оценявате филмите си, а след това се върнете, за да видите препоръките си.",
|
||||||
"MessageNoCollectionsAvailable": "Колекциите ви позволяват да се наслаждавате на персонализирани групи от филми, сериали и албуми. Кликнете върху бутона +, за да започнете да създавате колекции.",
|
"MessageNoCollectionsAvailable": "Колекциите ви позволяват да се наслаждавате на персонализирани групи от филми, сериали и албуми. Кликнете върху бутона +, за да започнете да създавате колекции.",
|
||||||
|
@ -1551,5 +1551,20 @@
|
||||||
"LabelSonyAggregationFlagsHelp": "Определя съдържанието на aggregationFlags елемента във urn:schemas-sonycom:av пространство от имена.",
|
"LabelSonyAggregationFlagsHelp": "Определя съдържанието на aggregationFlags елемента във urn:schemas-sonycom:av пространство от имена.",
|
||||||
"LabelXDlnaDocHelp": "Определя съдържанието на X_DLNADOC елемента в urn:schemas-dlna-org:device-1-0 пространство от имена.",
|
"LabelXDlnaDocHelp": "Определя съдържанието на X_DLNADOC елемента в urn:schemas-dlna-org:device-1-0 пространство от имена.",
|
||||||
"LabelSkipForwardLength": "Време за придвижване напред:",
|
"LabelSkipForwardLength": "Време за придвижване напред:",
|
||||||
"LabelSkipBackLength": "Време за придвижване назад:"
|
"LabelSkipBackLength": "Време за придвижване назад:",
|
||||||
|
"LabelRepositoryUrlHelp": "Местоположението на манифеста на хранилището, което искате да включите.",
|
||||||
|
"MessageNoGenresAvailable": "Доставчиците на метаданни ще могат да изтеглят жанрове от интернет.",
|
||||||
|
"MessageAddRepository": "Ако искате да добавите хранилище, щракнете върху бутона до заглавната част и попълнете исканата информация.",
|
||||||
|
"LabelRepositoryNameHelp": "Персонализирано име за разграничаване на това хранилище от всички останали добавени към вашия сървър.",
|
||||||
|
"LabelRepositoryName": "Име на хранилището",
|
||||||
|
"LabelRepositoryUrl": "Адрес на хранилището",
|
||||||
|
"HeaderNewRepository": "Ново хранилище",
|
||||||
|
"MessageNoRepositories": "Няма хранилища.",
|
||||||
|
"EnableFasterAnimationsHelp": "Използвайте по-бързи анимации и преходи",
|
||||||
|
"EnableFasterAnimations": "Бързи анимации",
|
||||||
|
"EnableDecodingColorDepth10Vp9": "Включи 10 битово хардуерно декодиране за VP9",
|
||||||
|
"EnableDecodingColorDepth10Hevc": "Включи 10 битово хардуерно декодиране за HEVC",
|
||||||
|
"ButtonCast": "Стриймване",
|
||||||
|
"ButtonSyncPlay": "SyncPlay",
|
||||||
|
"TabRepositories": "Хранилища"
|
||||||
}
|
}
|
||||||
|
|
|
@ -818,5 +818,6 @@
|
||||||
"AllowFfmpegThrottling": "Transcodes de l’acceleració",
|
"AllowFfmpegThrottling": "Transcodes de l’acceleració",
|
||||||
"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 s’aturi durant el procés d’extracció. 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.",
|
"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 s’aturi durant el procés d’extracció. 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",
|
"AlbumArtist": "Album artista",
|
||||||
"Album": "Album"
|
"Album": "Album",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1200,7 +1200,7 @@
|
||||||
"Wednesday": "Středa",
|
"Wednesday": "Středa",
|
||||||
"WelcomeToProject": "Vítejte v Jellyfin!",
|
"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>.",
|
"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.",
|
"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 \"|\".",
|
"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 \"|\".",
|
"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í)",
|
"AutoBasedOnLanguageSetting": "Automaticky (na základě jazykového nastavení)",
|
||||||
"Banner": "Výřez plakátu",
|
"Banner": "Výřez plakátu",
|
||||||
"BestFit": "Nejvhodnější",
|
"BestFit": "Nejvhodnější",
|
||||||
"Blacklist": "Černá listina",
|
"Blacklist": "Zakázat vše kromě výjimek",
|
||||||
"BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)",
|
"BobAndWeaveWithHelp": "Bob and weave (vyšší kvalita, ale pomalejší)",
|
||||||
"Browse": "Procházet",
|
"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.",
|
"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",
|
"Vertical": "Svisle",
|
||||||
"VideoRange": "Rozsah videa",
|
"VideoRange": "Rozsah videa",
|
||||||
"ViewPlaybackInfo": "Zobrazení informací o přehrávání",
|
"ViewPlaybackInfo": "Zobrazení informací o přehrávání",
|
||||||
"Whitelist": "Bílá listina",
|
"Whitelist": "Povolit vše kromě výjimek",
|
||||||
"HeaderHome": "Domů",
|
"HeaderHome": "Domů",
|
||||||
"DashboardOperatingSystem": "Operační systém: {0}",
|
"DashboardOperatingSystem": "Operační systém: {0}",
|
||||||
"DashboardArchitecture": "Architektura: {0}",
|
"DashboardArchitecture": "Architektura: {0}",
|
||||||
|
@ -1635,7 +1635,7 @@
|
||||||
"EnableBlurhashHelp": "Nenačtené obrázky budou zobrazeny pomocí neurčitých zástupných obrázků",
|
"EnableBlurhashHelp": "Nenačtené obrázky budou zobrazeny pomocí neurčitých zástupných obrázků",
|
||||||
"EnableBlurhash": "Povolit zástupné obrázky",
|
"EnableBlurhash": "Povolit zástupné obrázky",
|
||||||
"ButtonCast": "Přehrát v zařízení",
|
"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.",
|
"MessageNoGenresAvailable": "Povolit některým poskytovatelům metadat stahovat informace o žánrech z Internetu.",
|
||||||
"EnableFasterAnimationsHelp": "Použít rychlejší animace a přechody",
|
"EnableFasterAnimationsHelp": "Použít rychlejší animace a přechody",
|
||||||
"EnableFasterAnimations": "Rychlejší animace",
|
"EnableFasterAnimations": "Rychlejší animace",
|
||||||
|
@ -1648,5 +1648,7 @@
|
||||||
"LabelRepositoryUrlHelp": "Umístění manifestu repozitáře, který chcete zahrnout.",
|
"LabelRepositoryUrlHelp": "Umístění manifestu repozitáře, který chcete zahrnout.",
|
||||||
"LabelRepositoryUrl": "URL adresa repozitáře",
|
"LabelRepositoryUrl": "URL adresa repozitáře",
|
||||||
"HeaderNewRepository": "Nový repozitář",
|
"HeaderNewRepository": "Nový repozitář",
|
||||||
"MessageNoRepositories": "Neexistují žádné repozitáře."
|
"MessageNoRepositories": "Neexistují žádné repozitáře.",
|
||||||
|
"ButtonPlayer": "Přehrávač",
|
||||||
|
"Writers": "Scénáristé"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1608,5 +1608,6 @@
|
||||||
"Filter": "Filtrer",
|
"Filter": "Filtrer",
|
||||||
"New": "Nye",
|
"New": "Nye",
|
||||||
"ButtonTogglePlaylist": "Spilleliste",
|
"ButtonTogglePlaylist": "Spilleliste",
|
||||||
"ButtonToggleContextMenu": "Mere"
|
"ButtonToggleContextMenu": "Mere",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1586,5 +1586,7 @@
|
||||||
"LabelRepositoryName": "Name des Repository",
|
"LabelRepositoryName": "Name des Repository",
|
||||||
"LabelRepositoryUrl": "URL des Repository",
|
"LabelRepositoryUrl": "URL des Repository",
|
||||||
"HeaderNewRepository": "Neues Repository",
|
"HeaderNewRepository": "Neues Repository",
|
||||||
"MessageNoRepositories": "Keine Repositories."
|
"MessageNoRepositories": "Keine Repositories.",
|
||||||
|
"ButtonPlayer": "Player",
|
||||||
|
"Writers": "Autoren"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1234,5 +1234,6 @@
|
||||||
"AllowFfmpegThrottlingHelp": "Όταν ένας διακωδικοποιητής ή remux φτάσει αρκετά μπροστά από την τρέχουσα θέση αναπαραγωγής, διακόψτε τη διαδικασία ώστε να καταναλώσει λιγότερους πόρους. Αυτό είναι πιο χρήσιμο όταν παρακολουθείτε χωρίς να αναζητάτε συχνά. Απενεργοποιήστε το εάν αντιμετωπίζετε προβλήματα αναπαραγωγής.",
|
"AllowFfmpegThrottlingHelp": "Όταν ένας διακωδικοποιητής ή remux φτάσει αρκετά μπροστά από την τρέχουσα θέση αναπαραγωγής, διακόψτε τη διαδικασία ώστε να καταναλώσει λιγότερους πόρους. Αυτό είναι πιο χρήσιμο όταν παρακολουθείτε χωρίς να αναζητάτε συχνά. Απενεργοποιήστε το εάν αντιμετωπίζετε προβλήματα αναπαραγωγής.",
|
||||||
"ButtonTogglePlaylist": "Λίστα αναπαραγωγής",
|
"ButtonTogglePlaylist": "Λίστα αναπαραγωγής",
|
||||||
"ButtonToggleContextMenu": "Περισσότερα",
|
"ButtonToggleContextMenu": "Περισσότερα",
|
||||||
"ButtonSplit": "Διαχωρισμός"
|
"ButtonSplit": "Διαχωρισμός",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1535,6 +1535,7 @@
|
||||||
"Whitelist": "Whitelist",
|
"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>.",
|
"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",
|
"Writer": "Writer",
|
||||||
|
"Writers": "Writers",
|
||||||
"XmlDocumentAttributeListHelp": "These attributes are applied to the root element of every XML response.",
|
"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 '|'.",
|
"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 '|'.",
|
"XmlTvMovieCategoriesHelp": "Programs with these categories will be displayed as movies. Separate multiple with '|'.",
|
||||||
|
@ -1562,6 +1563,7 @@
|
||||||
"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",
|
"ButtonSyncPlay": "SyncPlay",
|
||||||
"ButtonCast": "Cast",
|
"ButtonCast": "Cast",
|
||||||
|
"ButtonPlayer": "Player",
|
||||||
"MediaInfoVideoRange": "Video range",
|
"MediaInfoVideoRange": "Video range",
|
||||||
"MediaInfoColorSpace": "Color space",
|
"MediaInfoColorSpace": "Color space",
|
||||||
"MediaInfoColorTransfer": "Color transfer",
|
"MediaInfoColorTransfer": "Color transfer",
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
{
|
{
|
||||||
"AddToCollection": "Aldoni al kolekto",
|
"AddToCollection": "Aldoni al kolekto",
|
||||||
"Actor": "Aktoro",
|
"Actor": "Aktoro",
|
||||||
"Absolute": "Absoluta"
|
"Absolute": "Absoluta",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -414,7 +414,7 @@
|
||||||
"HeaderAppearsOn": "Aparece en",
|
"HeaderAppearsOn": "Aparece en",
|
||||||
"HeaderApp": "Aplicación",
|
"HeaderApp": "Aplicación",
|
||||||
"HeaderApiKeysHelp": "Se requiere que las aplicaciones externas tengan una clave de API para comunicarse con el servidor Jellyfin. Las claves se emiten iniciando sesión con una cuenta Jellyfin, u otorgando manualmente una clave a la aplicación.",
|
"HeaderApiKeysHelp": "Se requiere que las aplicaciones externas tengan una clave de API para comunicarse con el servidor Jellyfin. Las claves se emiten iniciando sesión con una cuenta Jellyfin, u otorgando manualmente una clave a la aplicación.",
|
||||||
"HeaderApiKeys": "Llaves API",
|
"HeaderApiKeys": "Claves de API",
|
||||||
"HeaderApiKey": "Contraseña API",
|
"HeaderApiKey": "Contraseña API",
|
||||||
"HeaderAllowMediaDeletionFrom": "Permitir el borrado de medios desde",
|
"HeaderAllowMediaDeletionFrom": "Permitir el borrado de medios desde",
|
||||||
"HeaderAlert": "Alerta",
|
"HeaderAlert": "Alerta",
|
||||||
|
@ -686,7 +686,7 @@
|
||||||
"LabelCertificatePasswordHelp": "Si su certificado requiere una contraseña, ingrésela aquí.",
|
"LabelCertificatePasswordHelp": "Si su certificado requiere una contraseña, ingrésela aquí.",
|
||||||
"LabelCertificatePassword": "Contraseña del certificado:",
|
"LabelCertificatePassword": "Contraseña del certificado:",
|
||||||
"LabelCancelled": "Cancelado",
|
"LabelCancelled": "Cancelado",
|
||||||
"LabelCachePath": "Ruta de caché:",
|
"LabelCachePath": "Ruta a la caché:",
|
||||||
"LabelCache": "Caché:",
|
"LabelCache": "Caché:",
|
||||||
"LabelBurnSubtitles": "Grabar subtítulos:",
|
"LabelBurnSubtitles": "Grabar subtítulos:",
|
||||||
"LabelAudioBitDepth": "Profundidad de bits de audio:",
|
"LabelAudioBitDepth": "Profundidad de bits de audio:",
|
||||||
|
@ -942,7 +942,7 @@
|
||||||
"LabelMetadataReadersHelp": "Clasifique sus fuentes de metadatos locales preferidas en orden de prioridad. Se leerá el primer archivo encontrado.",
|
"LabelMetadataReadersHelp": "Clasifique sus fuentes de metadatos locales preferidas en orden de prioridad. Se leerá el primer archivo encontrado.",
|
||||||
"LabelMetadataReaders": "Lectores de metadatos:",
|
"LabelMetadataReaders": "Lectores de metadatos:",
|
||||||
"LabelMetadataPathHelp": "Especifique una ubicación personalizada para las ilustraciones y los metadatos descargados.",
|
"LabelMetadataPathHelp": "Especifique una ubicación personalizada para las ilustraciones y los metadatos descargados.",
|
||||||
"LabelMetadataPath": "Ruta de metadatos:",
|
"LabelMetadataPath": "Ruta a los metadatos:",
|
||||||
"LabelMetadataDownloadersHelp": "Habilite y clasifique sus descargadores de metadatos preferidos en orden de prioridad. Los descargadores de menor prioridad solo se utilizarán para completar la información que falta.",
|
"LabelMetadataDownloadersHelp": "Habilite y clasifique sus descargadores de metadatos preferidos en orden de prioridad. Los descargadores de menor prioridad solo se utilizarán para completar la información que falta.",
|
||||||
"LabelMetadataDownloadLanguage": "Idioma de descarga preferido:",
|
"LabelMetadataDownloadLanguage": "Idioma de descarga preferido:",
|
||||||
"LabelMetadata": "Metadatos:",
|
"LabelMetadata": "Metadatos:",
|
||||||
|
@ -1190,7 +1190,7 @@
|
||||||
"LabelTunerIpAddress": "Dirección IP del sintonizador:",
|
"LabelTunerIpAddress": "Dirección IP del sintonizador:",
|
||||||
"LabelTriggerType": "Tipo de disparador:",
|
"LabelTriggerType": "Tipo de disparador:",
|
||||||
"LabelTranscodingVideoCodec": "Códec de vídeo:",
|
"LabelTranscodingVideoCodec": "Códec de vídeo:",
|
||||||
"LabelTranscodingThreadCountHelp": "Seleccione el número máximo de hilos para usar al transcodificar. Reducir el recuento de hilos disminuirá el uso de la CPU, pero es posible que no se convierta lo suficientemente rápido para una experiencia de reproducción fluida.",
|
"LabelTranscodingThreadCountHelp": "Elija el número máximo de hilos para usar al transcodificar. Reducir el recuento de hilos disminuirá el uso de la CPU, pero es posible que no se convierta lo suficientemente rápido para una experiencia de reproducción fluida.",
|
||||||
"LabelTranscodingThreadCount": "Conteo de hilos de transcodificación:",
|
"LabelTranscodingThreadCount": "Conteo de hilos de transcodificación:",
|
||||||
"LabelTranscodingProgress": "Progreso de transcodificación:",
|
"LabelTranscodingProgress": "Progreso de transcodificación:",
|
||||||
"LabelTranscodingFramerate": "Velocidad de fotogramas de transcodificación:",
|
"LabelTranscodingFramerate": "Velocidad de fotogramas de transcodificación:",
|
||||||
|
@ -1648,5 +1648,7 @@
|
||||||
"Runtime": "Tiempo de ejecución",
|
"Runtime": "Tiempo de ejecución",
|
||||||
"RunAtStartup": "Ejecutar en el arranque",
|
"RunAtStartup": "Ejecutar en el arranque",
|
||||||
"Rewind": "Rebobinar",
|
"Rewind": "Rebobinar",
|
||||||
"ResumeAt": "Reanudar desde {0}"
|
"ResumeAt": "Reanudar desde {0}",
|
||||||
|
"ButtonPlayer": "Reproductor",
|
||||||
|
"Writers": "Escritores"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1066,7 +1066,7 @@
|
||||||
"OptionReportByteRangeSeekingWhenTranscodingHelp": "Esto es requerido para algunos dispositivos que no pueden hacer búsquedas de tiempo muy bien.",
|
"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",
|
"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.",
|
"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",
|
"OptionResumable": "Reanudable",
|
||||||
"OptionRuntime": "Duración",
|
"OptionRuntime": "Duración",
|
||||||
"OptionSaturday": "Sábado",
|
"OptionSaturday": "Sábado",
|
||||||
|
@ -1424,7 +1424,7 @@
|
||||||
"ValueSeriesCount": "{0} series",
|
"ValueSeriesCount": "{0} series",
|
||||||
"Vertical": "Vertical",
|
"Vertical": "Vertical",
|
||||||
"OptionThumb": "Miniatura",
|
"OptionThumb": "Miniatura",
|
||||||
"OptionThumbCard": "Tarjeta miniatura",
|
"OptionThumbCard": "Miniatura",
|
||||||
"HeaderFavoriteBooks": "Libros favoritos",
|
"HeaderFavoriteBooks": "Libros favoritos",
|
||||||
"LabelPleaseRestart": "Los cambios tendrán efecto después de recargar manualmente el cliente web.",
|
"LabelPleaseRestart": "Los cambios tendrán efecto después de recargar manualmente el cliente web.",
|
||||||
"LabelPlayMethod": "Método de reproducción:",
|
"LabelPlayMethod": "Método de reproducción:",
|
||||||
|
@ -1487,7 +1487,7 @@
|
||||||
"HeaderFavoritePeople": "Personas favoritas",
|
"HeaderFavoritePeople": "Personas favoritas",
|
||||||
"Episode": "Episodio",
|
"Episode": "Episodio",
|
||||||
"ClientSettings": "Configuración del cliente",
|
"ClientSettings": "Configuración del cliente",
|
||||||
"BoxSet": "Box Set",
|
"BoxSet": "Colección",
|
||||||
"AskAdminToCreateLibrary": "Pide a un administrador crear una biblioteca.",
|
"AskAdminToCreateLibrary": "Pide a un administrador crear una biblioteca.",
|
||||||
"Artist": "Artista",
|
"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.",
|
"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",
|
"HeaderHttpsSettings": "Opciones HTTPS",
|
||||||
"HeaderDVR": "DVR",
|
"HeaderDVR": "DVR",
|
||||||
"ApiKeysCaption": "Lista de claves API actualmente habilitadas",
|
"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.",
|
"MessageSyncPlayErrorMedia": "¡Fallo al activar SyncPlay! Error en el archivo de medios.",
|
||||||
"MessageSyncPlayErrorMissingSession": "¡Fallo al activar SyncPlay! Falta la sesión.",
|
"MessageSyncPlayErrorMissingSession": "¡Fallo al activar SyncPlay! Falta la sesión.",
|
||||||
"MessageSyncPlayErrorNoActivePlayer": "No se ha encontrado ningún reproductor activo. SyncPlay ha sido desactivado.",
|
"MessageSyncPlayErrorNoActivePlayer": "No se ha encontrado ningún reproductor activo. SyncPlay ha sido desactivado.",
|
||||||
|
@ -1552,5 +1552,25 @@
|
||||||
"HeaderSyncPlayEnabled": "SyncPlay habilitado",
|
"HeaderSyncPlayEnabled": "SyncPlay habilitado",
|
||||||
"HeaderSyncPlaySelectGroup": "Unirse a un grupo",
|
"HeaderSyncPlaySelectGroup": "Unirse a un grupo",
|
||||||
"EnableDetailsBannerHelp": "Mostrar una imagen banner en la parte superior de la página de detalles del elemento.",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,7 +192,7 @@
|
||||||
"ExitFullscreen": "Quitar pantalla completa",
|
"ExitFullscreen": "Quitar pantalla completa",
|
||||||
"ExtraLarge": "Extragrande",
|
"ExtraLarge": "Extragrande",
|
||||||
"ExtractChapterImagesHelp": "La extracción de imágenes de capítulos permitirá a los clientes mostrar gráficamente la selección de escenas. El proceso puede ser lento, intensivo en recursos y requerir varios gigabytes de espacio. Se ejecuta cuando se añaden vídeos y también como tarea programable por la noche. El horario es configurable en el área de tareas programadas. No se recomienda ejecutar esta tarea durante las horas pico de uso.",
|
"ExtractChapterImagesHelp": "La extracción de imágenes de capítulos permitirá a los clientes mostrar gráficamente la selección de escenas. El proceso puede ser lento, intensivo en recursos y requerir varios gigabytes de espacio. Se ejecuta cuando se añaden vídeos y también como tarea programable por la noche. El horario es configurable en el área de tareas programadas. No se recomienda ejecutar esta tarea durante las horas pico de uso.",
|
||||||
"FFmpegSavePathNotFound": "No podemos localizar FFmpeg usando la ruta que has ingresado. FFprobe también es necesario y debe existir en la misma carpeta. Estos componentes normalmente se agrupan juntos en la misma descarga. Compruebe la ruta y vuelva a intentarlo.",
|
"FFmpegSavePathNotFound": "No se ha podido localizar ffmpeg ni ffprobe en la ruta especificada. Comprueba la ruta y vuelva a intentarlo.",
|
||||||
"FastForward": "Avanzar rápido",
|
"FastForward": "Avanzar rápido",
|
||||||
"Favorite": "Favorito",
|
"Favorite": "Favorito",
|
||||||
"Favorites": "Favoritos",
|
"Favorites": "Favoritos",
|
||||||
|
@ -249,7 +249,7 @@
|
||||||
"HeaderChannels": "Canales",
|
"HeaderChannels": "Canales",
|
||||||
"HeaderChapterImages": "Imágenes de capítulos",
|
"HeaderChapterImages": "Imágenes de capítulos",
|
||||||
"HeaderCodecProfile": "Perfil de códec",
|
"HeaderCodecProfile": "Perfil de códec",
|
||||||
"HeaderCodecProfileHelp": "Perfiles de códec indican las limitaciones de un dispositivo cuando se reproducen códecs específicos. Si se aplica una limitación entonces el medio se transcodificará, incluso si el códec está configurado para reproducción directa.",
|
"HeaderCodecProfileHelp": "Los perfiles de los códecs indican las limitaciones de un dispositivo cuando reproduce un códec en específico. Si lo que se va a reproducir no está dentro de estos límites (por ejemplo, bitrate demasiado alto), el contenido se convertirá, incluso si el códec está configurado para reproducción directa.",
|
||||||
"HeaderConfigureRemoteAccess": "Configurar acceso remoto",
|
"HeaderConfigureRemoteAccess": "Configurar acceso remoto",
|
||||||
"HeaderConfirmPluginInstallation": "Confirmar la instalación del complemento",
|
"HeaderConfirmPluginInstallation": "Confirmar la instalación del complemento",
|
||||||
"HeaderConfirmProfileDeletion": "Confirmar borrado del perfil",
|
"HeaderConfirmProfileDeletion": "Confirmar borrado del perfil",
|
||||||
|
@ -257,7 +257,7 @@
|
||||||
"HeaderConnectToServer": "Conectar al servidor",
|
"HeaderConnectToServer": "Conectar al servidor",
|
||||||
"HeaderConnectionFailure": "Fallo de conexión",
|
"HeaderConnectionFailure": "Fallo de conexión",
|
||||||
"HeaderContainerProfile": "Perfil de contenedor",
|
"HeaderContainerProfile": "Perfil de contenedor",
|
||||||
"HeaderContainerProfileHelp": "Perfiles de códec indican las limitaciones de un dispositivo mientras reproduce formatos específicos. Si se aplica una limitación entonces el medio se transcodificará, incluso si el formato está configurado para reproducción directa.",
|
"HeaderContainerProfileHelp": "Los perfiles de los contenedores indican las limitaciones de un dispositivo cuando reproduce contenido en un formato en específico. Si lo que se va a reproducir no está dentro de estos límites, el contenedor del contenido se cambiará, incluso si el formato está configurado para reproducción directa.",
|
||||||
"HeaderContinueListening": "Continuar escuchando",
|
"HeaderContinueListening": "Continuar escuchando",
|
||||||
"HeaderContinueWatching": "Continuar viendo",
|
"HeaderContinueWatching": "Continuar viendo",
|
||||||
"HeaderCustomDlnaProfiles": "Perfiles personalizados",
|
"HeaderCustomDlnaProfiles": "Perfiles personalizados",
|
||||||
|
@ -375,7 +375,7 @@
|
||||||
"HeaderSelectServer": "Selecionar servidor",
|
"HeaderSelectServer": "Selecionar servidor",
|
||||||
"HeaderSelectServerCachePath": "Seleccione la ruta para el caché del servidor",
|
"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.",
|
"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",
|
"HeaderSelectTranscodingPath": "Ruta para los archivos temporales de las conversiones",
|
||||||
"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.",
|
"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",
|
"HeaderSendMessage": "Enviar mensaje",
|
||||||
"HeaderSeries": "Series",
|
"HeaderSeries": "Series",
|
||||||
|
@ -404,7 +404,7 @@
|
||||||
"HeaderTunerDevices": "Sintonizadores",
|
"HeaderTunerDevices": "Sintonizadores",
|
||||||
"HeaderTuners": "Sintonizadores",
|
"HeaderTuners": "Sintonizadores",
|
||||||
"HeaderTypeImageFetchers": "{0} capturadores de imágenes",
|
"HeaderTypeImageFetchers": "{0} capturadores de imágenes",
|
||||||
"HeaderTypeText": "Entrar texto",
|
"HeaderTypeText": "Introducir texto",
|
||||||
"HeaderUpcomingOnTV": "Próximamente en la televisión",
|
"HeaderUpcomingOnTV": "Próximamente en la televisión",
|
||||||
"HeaderUploadImage": "Subir imagen",
|
"HeaderUploadImage": "Subir imagen",
|
||||||
"HeaderUser": "Usuario",
|
"HeaderUser": "Usuario",
|
||||||
|
@ -621,7 +621,7 @@
|
||||||
"LabelMoviePrefixHelp": "Si se aplica un prefijo a títulos de películas, escríbalo para que el servidor pueda manejarlo correctamente.",
|
"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):",
|
"LabelMovieRecordingPath": "Ruta de grabaciones de películas (opcional):",
|
||||||
"LabelMusicStreamingTranscodingBitrate": "Tasa de bits para la reproducció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.",
|
"LabelMusicStreamingTranscodingBitrateHelp": "Tasa de bits máxima para la música.",
|
||||||
"LabelName": "Nombre:",
|
"LabelName": "Nombre:",
|
||||||
"LabelNewName": "Nuevo nombre:",
|
"LabelNewName": "Nuevo nombre:",
|
||||||
"LabelNewPassword": "Nueva contraseña:",
|
"LabelNewPassword": "Nueva contraseña:",
|
||||||
|
@ -674,7 +674,7 @@
|
||||||
"LabelRefreshMode": "Modo de refresco:",
|
"LabelRefreshMode": "Modo de refresco:",
|
||||||
"LabelReleaseDate": "Fecha de lanzamiento:",
|
"LabelReleaseDate": "Fecha de lanzamiento:",
|
||||||
"LabelRemoteClientBitrateLimit": "Límite de la transmisión de tasa de bits por internet (Mbps):",
|
"LabelRemoteClientBitrateLimit": "Límite de la transmisión de tasa de bits por internet (Mbps):",
|
||||||
"LabelRemoteClientBitrateLimitHelp": "Un límite opcional de tasa de bits para todos los dispositivos fuera de la red. Esto es útil para evitar que los dispositivos soliciten una tasa de bits más alta que la que su conexión a Internet puede manejar. Esto puede ocasionar una mayor carga de la CPU en su servidor para transcodificar vídeos sobre la marcha a una tasa de bits más baja.",
|
"LabelRemoteClientBitrateLimitHelp": "Especifica el bitrate máximo para los dispositivos que se encuentren fuera de la red local. Esto es útil para permitir la reproducción del contenido que tengas con una tasa de bits muy alta cuando la conexión a internet de tu servidor o la del cliente no sea lo suficientemente rápida. Esto ocasionará mayor carga, ya que el contenido que supere esta tasa de bits se convertirá para que esté dentro del límite establecido.",
|
||||||
"LabelRuntimeMinutes": "Tiempo de ejecución (minutos):",
|
"LabelRuntimeMinutes": "Tiempo de ejecución (minutos):",
|
||||||
"LabelSaveLocalMetadata": "Guardar imágenes y etiquetas en las carpetas de medios",
|
"LabelSaveLocalMetadata": "Guardar imágenes y etiquetas en las carpetas de medios",
|
||||||
"LabelSaveLocalMetadataHelp": "Guardar imágenes y etiquetas directamente en las carpetas en las que estén los elementos hará que se puedan editar más fácilmente.",
|
"LabelSaveLocalMetadataHelp": "Guardar imágenes y etiquetas directamente en las carpetas en las que estén los elementos hará que se puedan editar más fácilmente.",
|
||||||
|
@ -749,8 +749,8 @@
|
||||||
"LabelYourFirstName": "Tu nombre:",
|
"LabelYourFirstName": "Tu nombre:",
|
||||||
"LabelYoureDone": "¡Ya está!",
|
"LabelYoureDone": "¡Ya está!",
|
||||||
"LabelZipCode": "Código postal:",
|
"LabelZipCode": "Código postal:",
|
||||||
"LabelffmpegPath": "Ruta de FFmpeg:",
|
"LabelffmpegPath": "Ruta de ffmpeg:",
|
||||||
"LabelffmpegPathHelp": "a ruta de acceso al archivo de la aplicación FFmpeg o la carpeta que contiene FFmpeg.",
|
"LabelffmpegPathHelp": "Carpeta donde se encuentra ffmpeg, el componente utilizado para realizar las conversiones. No la cambies a no ser que sepas lo que haces.",
|
||||||
"LanNetworksHelp": "Lista de direcciones IP separadas por comas o entradas de dirección IP / máscara de red para redes que se considerarán en la red local al imponer restricciones de ancho de banda. Si se establece, todas las demás direcciones IP se considerarán en la red externa y estarán sujetas a las restricciones de ancho de banda externo. Si se deja en blanco, solo se considera que la subred del servidor está en la red local.",
|
"LanNetworksHelp": "Lista de direcciones IP separadas por comas o entradas de dirección IP / máscara de red para redes que se considerarán en la red local al imponer restricciones de ancho de banda. Si se establece, todas las demás direcciones IP se considerarán en la red externa y estarán sujetas a las restricciones de ancho de banda externo. Si se deja en blanco, solo se considera que la subred del servidor está en la red local.",
|
||||||
"Large": "Grande",
|
"Large": "Grande",
|
||||||
"LatestFromLibrary": "Reciente en {0}",
|
"LatestFromLibrary": "Reciente en {0}",
|
||||||
|
@ -935,7 +935,7 @@
|
||||||
"OptionEnableM2tsModeHelp": "Activar modo M2TS cuando se codifique a MPEGTS.",
|
"OptionEnableM2tsModeHelp": "Activar modo M2TS cuando se codifique a MPEGTS.",
|
||||||
"OptionEnded": "Finalizado",
|
"OptionEnded": "Finalizado",
|
||||||
"OptionEquals": "Igual",
|
"OptionEquals": "Igual",
|
||||||
"OptionEstimateContentLength": "Estimar la longitud del contenido al transcodificar",
|
"OptionEstimateContentLength": "Estimar la longitud del contenido al convertirse",
|
||||||
"OptionEveryday": "Todos los días",
|
"OptionEveryday": "Todos los días",
|
||||||
"OptionExternallyDownloaded": "Descarga externa",
|
"OptionExternallyDownloaded": "Descarga externa",
|
||||||
"OptionExtractChapterImage": "Habilitar la extracción de imágenes de los capítulos",
|
"OptionExtractChapterImage": "Habilitar la extracción de imágenes de los capítulos",
|
||||||
|
@ -973,8 +973,8 @@
|
||||||
"OptionProfileVideoAudio": "Vídeo y audio",
|
"OptionProfileVideoAudio": "Vídeo y audio",
|
||||||
"OptionProtocolHls": "Emisión HTTP en directo",
|
"OptionProtocolHls": "Emisión HTTP en directo",
|
||||||
"OptionReleaseDate": "Fecha de lanzamiento",
|
"OptionReleaseDate": "Fecha de lanzamiento",
|
||||||
"OptionReportByteRangeSeekingWhenTranscoding": "Indicar que el servidor soporta la búsqueda de byte al transcodificar",
|
"OptionReportByteRangeSeekingWhenTranscoding": "Indicar que el servidor soporta la búsqueda de byte al convertir",
|
||||||
"OptionReportByteRangeSeekingWhenTranscodingHelp": "Esto es necesario para algunos dispositivos que no buscan el tiempo muy bien.",
|
"OptionReportByteRangeSeekingWhenTranscodingHelp": "Esto es necesario para los dispositivos que no cambian entre los diferentes puntos de tiempo del contenido correctamente.",
|
||||||
"OptionRequirePerfectSubtitleMatch": "Sólo descargar subtítulos que son una combinación perfecta para mis archivos de vídeo",
|
"OptionRequirePerfectSubtitleMatch": "Sólo descargar subtítulos que son una combinación perfecta para mis archivos de vídeo",
|
||||||
"OptionRequirePerfectSubtitleMatchHelp": "Requerir una coincidencia perfecta filtra los subtítulos para incluir sólo aquellos que coinciden con el archivo de vídeo. Desmarcando esta opción, aumentará la probabilidad de que los subtítulos se descarguen, pero puede que el texto del subtítulo no coincida con el vídeo.",
|
"OptionRequirePerfectSubtitleMatchHelp": "Requerir una coincidencia perfecta filtra los subtítulos para incluir sólo aquellos que coinciden con el archivo de vídeo. Desmarcando esta opción, aumentará la probabilidad de que los subtítulos se descarguen, pero puede que el texto del subtítulo no coincida con el vídeo.",
|
||||||
"OptionResElement": "Elemento res",
|
"OptionResElement": "Elemento res",
|
||||||
|
@ -1355,7 +1355,7 @@
|
||||||
"LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:",
|
"LabelPasswordResetProvider": "Proveedor de restablecimiento de contraseña:",
|
||||||
"LabelServerName": "Nombre del servidor:",
|
"LabelServerName": "Nombre del servidor:",
|
||||||
"LabelTranscodePath": "Ruta para los archivos temporales de las conversiones:",
|
"LabelTranscodePath": "Ruta para los archivos temporales de las conversiones:",
|
||||||
"LabelTranscodes": "Transcodificaciones:",
|
"LabelTranscodes": "Archivos temporales de las conversiones:",
|
||||||
"LabelUserLoginAttemptsBeforeLockout": "Intentos fallidos de inicio de sesión antes de que el usuario sea bloqueado:",
|
"LabelUserLoginAttemptsBeforeLockout": "Intentos fallidos de inicio de sesión antes de que el usuario sea bloqueado:",
|
||||||
"DashboardVersionNumber": "Versión: {0}",
|
"DashboardVersionNumber": "Versión: {0}",
|
||||||
"DashboardServerName": "Servidor: {0}",
|
"DashboardServerName": "Servidor: {0}",
|
||||||
|
@ -1497,7 +1497,7 @@
|
||||||
"AlbumArtist": "Artista del álbum",
|
"AlbumArtist": "Artista del álbum",
|
||||||
"Album": "Álbum",
|
"Album": "Álbum",
|
||||||
"LabelDeinterlaceMethod": "Metodo de desentrelazar:",
|
"LabelDeinterlaceMethod": "Metodo de desentrelazar:",
|
||||||
"DeinterlaceMethodHelp": "Seleccione el método de desentrelazar para el transcodificar de contenido entrelazado.",
|
"DeinterlaceMethodHelp": "Seleccione el tipo de filtro que se aplicará para desentrelazar el contenido que esté entrelazado durante la conversión.",
|
||||||
"LabelLibraryPageSize": "Tamaño de la página de la biblioteca:",
|
"LabelLibraryPageSize": "Tamaño de la página de la biblioteca:",
|
||||||
"LabelLibraryPageSizeHelp": "Establece la cantidad de artículos a mostrar en una página de la biblioteca. Ponlo en 0 para desactivar la paginación.",
|
"LabelLibraryPageSizeHelp": "Establece la cantidad de artículos a mostrar en una página de la biblioteca. Ponlo en 0 para desactivar la paginación.",
|
||||||
"UnsupportedPlayback": "No es posible desencriptar contenido protegido mediante DRM; sin embargo se intentará su reproducción. Algunos archivos pueden aparecer completamente negros debido a encriptación u otras características no soportadas, como títulos interactivos.",
|
"UnsupportedPlayback": "No es posible desencriptar contenido protegido mediante DRM; sin embargo se intentará su reproducción. Algunos archivos pueden aparecer completamente negros debido a encriptación u otras características no soportadas, como títulos interactivos.",
|
||||||
|
@ -1525,7 +1525,7 @@
|
||||||
"EnableBlurhash": "Mostrar una representación de las imágenes mientras cargan",
|
"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",
|
"EnableBlurhashHelp": "Aparecerá una representación de los colores de las imágenes antes de que terminen de cargar",
|
||||||
"HeaderDVR": "DVR",
|
"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.",
|
"MessageSyncPlayErrorMedia": "¡No se pudo activar SyncPlay! Error de medio.",
|
||||||
"MessageSyncPlayErrorMissingSession": "¡No se pudo activar SyncPlay! Sesión desconectada.",
|
"MessageSyncPlayErrorMissingSession": "¡No se pudo activar SyncPlay! Sesión desconectada.",
|
||||||
"MessageSyncPlayErrorNoActivePlayer": "No hay reproductor activo. SyncPlay ha sido desactivado.",
|
"MessageSyncPlayErrorNoActivePlayer": "No hay reproductor activo. SyncPlay ha sido desactivado.",
|
||||||
|
@ -1562,6 +1562,16 @@
|
||||||
"ButtonSyncPlay": "SyncPlay",
|
"ButtonSyncPlay": "SyncPlay",
|
||||||
"ButtonCast": "Enviar",
|
"ButtonCast": "Enviar",
|
||||||
"MessageNoGenresAvailable": "Permitir a algunos proveedores de metadatos extraer géneros de Internet.",
|
"MessageNoGenresAvailable": "Permitir a algunos proveedores de metadatos extraer géneros de Internet.",
|
||||||
"EnableDecodingColorDepth10Vp9": "Habilite la decodificación por hardware de 10 bits para Vp9",
|
"EnableDecodingColorDepth10Vp9": "Habilite la decodificación por hardware de 10 bits para VP9",
|
||||||
"EnableDecodingColorDepth10Hevc": "Habilite la decodificación por hardware de 10 bits para HEVC"
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1548,5 +1548,6 @@
|
||||||
"EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes",
|
"EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes",
|
||||||
"ShowMore": "Mostrar más",
|
"ShowMore": "Mostrar más",
|
||||||
"ShowLess": "Mostrar menos",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,5 +12,6 @@
|
||||||
"Books": "Libros",
|
"Books": "Libros",
|
||||||
"Albums": "Álbumes",
|
"Albums": "Álbumes",
|
||||||
"Artists": "Artistas",
|
"Artists": "Artistas",
|
||||||
"Channels": "Canales"
|
"Channels": "Canales",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1553,5 +1553,6 @@
|
||||||
"EnableFastImageFadeIn": "Faster animations",
|
"EnableFastImageFadeIn": "Faster animations",
|
||||||
"EnableFastImageFadeInHelp": "Use faster animations and transitions",
|
"EnableFastImageFadeInHelp": "Use faster animations and transitions",
|
||||||
"EnableBlurhash": "Enable blurred placeholders for images",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1246,5 +1246,6 @@
|
||||||
"MediaInfoAnamorphic": "Anamorfinen",
|
"MediaInfoAnamorphic": "Anamorfinen",
|
||||||
"ErrorGettingTvLineups": "TV esiintyjälistan lataamisessa tapahtui virhe. Varmista, että tiedot on oikein ja yritä uudelleen.",
|
"ErrorGettingTvLineups": "TV esiintyjälistan lataamisessa tapahtui virhe. Varmista, että tiedot on oikein ja yritä uudelleen.",
|
||||||
"EnableDetailsBannerHelp": "Näyttää julistekuvan yksityiskohdat -sivun ylälaidassa.",
|
"EnableDetailsBannerHelp": "Näyttää julistekuvan yksityiskohdat -sivun ylälaidassa.",
|
||||||
"EnableDetailsBanner": "Yksityiskohtien banneri"
|
"EnableDetailsBanner": "Yksityiskohtien banneri",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,7 +97,7 @@
|
||||||
"AllowMediaConversion": "Autoriser la conversion des médias",
|
"AllowMediaConversion": "Autoriser la conversion des médias",
|
||||||
"AllowMediaConversionHelp": "Autoriser ou refuser l'accès à la fonctionnalité de 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",
|
"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.",
|
"AllowRemoteAccess": "Autoriser les connexions distantes à ce serveur Jellyfin.",
|
||||||
"AllowRemoteAccessHelp": "Si l'option est désactivée, toutes les connexions distantes seront bloquées.",
|
"AllowRemoteAccessHelp": "Si l'option est désactivée, toutes les connexions distantes seront bloquées.",
|
||||||
"Artists": "Artistes",
|
"Artists": "Artistes",
|
||||||
|
@ -134,13 +134,13 @@
|
||||||
"BirthLocation": "Lieu de naissance",
|
"BirthLocation": "Lieu de naissance",
|
||||||
"BirthPlaceValue": "Lieu de naissance : {0}",
|
"BirthPlaceValue": "Lieu de naissance : {0}",
|
||||||
"Blacklist": "Liste noire",
|
"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",
|
"Box": "Boîtier",
|
||||||
"BoxRear": "Dos de boîtier",
|
"BoxRear": "Dos de boîtier",
|
||||||
"Browse": "Parcourir",
|
"Browse": "Parcourir",
|
||||||
"BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.",
|
"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.",
|
"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 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",
|
"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",
|
"ButtonAccept": "Accepter",
|
||||||
"ButtonAdd": "Ajouter",
|
"ButtonAdd": "Ajouter",
|
||||||
"ButtonAddMediaLibrary": "Ajouter une médiathèque",
|
"ButtonAddMediaLibrary": "Ajouter une médiathèque",
|
||||||
|
@ -187,7 +187,7 @@
|
||||||
"ButtonMore": "Plus",
|
"ButtonMore": "Plus",
|
||||||
"ButtonNetwork": "Réseau",
|
"ButtonNetwork": "Réseau",
|
||||||
"AspectRatio": "Format de visionnement",
|
"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",
|
"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.",
|
"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",
|
"AllowFfmpegThrottling": "Restreindre la vitesse de transcodage",
|
||||||
|
@ -198,5 +198,68 @@
|
||||||
"HeaderFavoriteShows": "Séries favorites",
|
"HeaderFavoriteShows": "Séries favorites",
|
||||||
"HeaderFavoriteEpisodes": "Épisodes favoris",
|
"HeaderFavoriteEpisodes": "Épisodes favoris",
|
||||||
"HeaderFavoriteArtists": "Artistes 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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1506,7 +1506,7 @@
|
||||||
"HeaderFavoritePlaylists": "Listes de lecture favorites",
|
"HeaderFavoritePlaylists": "Listes de lecture favorites",
|
||||||
"TabDVR": "DVR",
|
"TabDVR": "DVR",
|
||||||
"LabelChromecastVersion": "Version de Chromecast",
|
"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",
|
"LabelEnableHttps": "Activer HTTPS",
|
||||||
"HeaderServerAddressSettings": "Paramètres adresses serveur",
|
"HeaderServerAddressSettings": "Paramètres adresses serveur",
|
||||||
"HeaderRemoteAccessSettings": "Paramètres d'accès distant",
|
"HeaderRemoteAccessSettings": "Paramètres d'accès distant",
|
||||||
|
@ -1521,7 +1521,7 @@
|
||||||
"EnableDetailsBanner": "Bannière des détails",
|
"EnableDetailsBanner": "Bannière des détails",
|
||||||
"EnableDetailsBannerHelp": "Affichez une image de bannière en haut de la page de détails de l'article.",
|
"EnableDetailsBannerHelp": "Affichez une image de bannière en haut de la page de détails de l'article.",
|
||||||
"HeaderSyncPlaySelectGroup": "Rejoindre un groupe",
|
"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",
|
"LabelSyncPlayLeaveGroupDescription": "Désactiver SyncPlay",
|
||||||
"LabelSyncPlayLeaveGroup": "Quitter le groupe",
|
"LabelSyncPlayLeaveGroup": "Quitter le groupe",
|
||||||
"LabelSyncPlayNewGroupDescription": "Créer un nouveau groupe",
|
"LabelSyncPlayNewGroupDescription": "Créer un nouveau groupe",
|
||||||
|
@ -1529,14 +1529,14 @@
|
||||||
"LabelSyncPlaySyncMethod": "Méthode de synchronisation :",
|
"LabelSyncPlaySyncMethod": "Méthode de synchronisation :",
|
||||||
"LabelSyncPlayPlaybackDiff": "Décalage de la lecture :",
|
"LabelSyncPlayPlaybackDiff": "Décalage de la lecture :",
|
||||||
"MillisecondsUnit": "ms",
|
"MillisecondsUnit": "ms",
|
||||||
"LabelSyncPlayTimeOffset": "Décalage de temps avec le serveur :",
|
"LabelSyncPlayTimeOffset": "Décalage de temps avec le serveur :",
|
||||||
"HeaderSyncPlayEnabled": "SyncPlay activé",
|
"HeaderSyncPlayEnabled": "SyncPlay activé",
|
||||||
"MessageSyncPlayLibraryAccessDenied": "L'accès à ce contenu est restreint.",
|
"MessageSyncPlayLibraryAccessDenied": "L'accès à ce contenu est restreint.",
|
||||||
"MessageSyncPlayJoinGroupDenied": "Permission requise pour utiliser SyncPlay.",
|
"MessageSyncPlayJoinGroupDenied": "Permission requise pour utiliser SyncPlay.",
|
||||||
"MessageSyncPlayCreateGroupDenied": "Permission requise pour créer un groupe.",
|
"MessageSyncPlayCreateGroupDenied": "Permission requise pour créer un groupe.",
|
||||||
"MessageSyncPlayGroupDoesNotExist": "Impossible de rejoindre le groupe car il n'existe pas.",
|
"MessageSyncPlayGroupDoesNotExist": "Impossible de rejoindre le groupe car il n'existe pas.",
|
||||||
"MessageSyncPlayPlaybackPermissionRequired": "Autorisation de lecture requise.",
|
"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...",
|
"MessageSyncPlayGroupWait": "<b>{0}</b> est en train de charger...",
|
||||||
"MessageSyncPlayUserLeft": "<b>{0}</b> a quitté le groupe.",
|
"MessageSyncPlayUserLeft": "<b>{0}</b> a quitté le groupe.",
|
||||||
"MessageSyncPlayUserJoined": "<b>{0}</b> a rejoint 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.",
|
"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.",
|
"MessageSyncPlayErrorMedia": "Impossible d'activer SyncPlay ! Erreur média.",
|
||||||
"MessageSyncPlayErrorMissingSession": "Impossible d'activer SyncPlay ! Session manquante.",
|
"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.",
|
"MessageSyncPlayErrorAccessingGroups": "Une erreur s'est produite pendant l'accès à la liste de groupes.",
|
||||||
"ShowMore": "Voir plus",
|
"ShowMore": "Voir plus",
|
||||||
"ShowLess": "Voir moins",
|
"ShowLess": "Voir moins",
|
||||||
"EnableBlurhashHelp": "Les images qui sont encore en cours de chargement seront remplacées par une image générique floue",
|
"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",
|
"EnableBlurhash": "Utilise des images génériques floues à la place des images",
|
||||||
"ButtonCast": "Diffuser",
|
"ButtonCast": "Diffuser",
|
||||||
"ButtonSyncPlay": "Lecture synchronisée",
|
"ButtonSyncPlay": "SyncPlay",
|
||||||
"TabRepositories": "Dépôts",
|
"TabRepositories": "Dépôts",
|
||||||
"MessageNoGenresAvailable": "Utiliser des fournisseurs de métadonnées pour récupérer les genres depuis internet.",
|
"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.",
|
"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.",
|
||||||
|
|
|
@ -11,5 +11,6 @@
|
||||||
"AirDate": "Data de emisión",
|
"AirDate": "Data de emisión",
|
||||||
"Aired": "Emitido",
|
"Aired": "Emitido",
|
||||||
"AddToPlaylist": "Engadir á lista de reprodución",
|
"AddToPlaylist": "Engadir á lista de reprodución",
|
||||||
"Add": "Engadir"
|
"Add": "Engadir",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,5 +165,6 @@
|
||||||
"VersionNumber": "Version {0}",
|
"VersionNumber": "Version {0}",
|
||||||
"Absolute": "Absolut",
|
"Absolute": "Absolut",
|
||||||
"Actor": "Schauspiler",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -771,5 +771,6 @@
|
||||||
"LabelSource": "מקור:",
|
"LabelSource": "מקור:",
|
||||||
"LabelSoundEffects": "אפקטי סאונד:",
|
"LabelSoundEffects": "אפקטי סאונד:",
|
||||||
"ButtonTogglePlaylist": "רשימת ניגון",
|
"ButtonTogglePlaylist": "רשימת ניגון",
|
||||||
"ButtonToggleContextMenu": "עוד"
|
"ButtonToggleContextMenu": "עוד",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -112,5 +112,6 @@
|
||||||
"AlbumArtist": "चित्राधार कलाकार",
|
"AlbumArtist": "चित्राधार कलाकार",
|
||||||
"AllowOnTheFlySubtitleExtraction": "मक्खी पर उपशीर्षक निष्कर्षण की अनुमति दें",
|
"AllowOnTheFlySubtitleExtraction": "मक्खी पर उपशीर्षक निष्कर्षण की अनुमति दें",
|
||||||
"Album": "एल्बम",
|
"Album": "एल्बम",
|
||||||
"AddItemToCollectionHelp": "उनके लिए खोज करके संग्रह में आइटम जोड़ें और उन्हें संग्रह में जोड़ने के लिए उनके राइट-क्लिक या टैप मेनू का उपयोग करें।"
|
"AddItemToCollectionHelp": "उनके लिए खोज करके संग्रह में आइटम जोड़ें और उन्हें संग्रह में जोड़ने के लिए उनके राइट-क्लिक या टैप मेनू का उपयोग करें।",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1050,5 +1050,193 @@
|
||||||
"Alerts": "Upozorenja",
|
"Alerts": "Upozorenja",
|
||||||
"AlbumArtist": "Izvođač na albumu",
|
"AlbumArtist": "Izvođač na albumu",
|
||||||
"Album": "Album",
|
"Album": "Album",
|
||||||
"AddToPlayQueue": "Dodaj u red izvođenja"
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1562,6 +1562,15 @@
|
||||||
"MessageNoGenresAvailable": "Engedélyezz néhány metaadat szolgáltatót, hogy műfaj adatokat tölthess le az internetről.",
|
"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",
|
"EnableFasterAnimationsHelp": "Gyorsabb animációk és áttűnések használata",
|
||||||
"EnableFasterAnimations": "Gyorsabb animációk",
|
"EnableFasterAnimations": "Gyorsabb animációk",
|
||||||
"EnableDecodingColorDepth10Vp9": "10 bites hardveres dekódolás engedélyezése Vp9-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"
|
"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ó.",
|
||||||
|
"Writers": "Írók"
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,5 +204,6 @@
|
||||||
"Alerts": "Peringatan",
|
"Alerts": "Peringatan",
|
||||||
"AddedOnValue": "Ditambahkan {0}",
|
"AddedOnValue": "Ditambahkan {0}",
|
||||||
"AllowFfmpegThrottling": "Transcode Tercekik",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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?",
|
"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",
|
"CommunityRating": "Mat samfélagsins",
|
||||||
"ButtonStart": "Byrja",
|
"ButtonStart": "Byrja",
|
||||||
"BoxSet": "Kassasett"
|
"BoxSet": "Kassasett",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1567,5 +1567,6 @@
|
||||||
"LabelRepositoryUrlHelp": "URL del repository manifest che si vuole includere.",
|
"LabelRepositoryUrlHelp": "URL del repository manifest che si vuole includere.",
|
||||||
"LabelRepositoryUrl": "URL Repository",
|
"LabelRepositoryUrl": "URL Repository",
|
||||||
"HeaderNewRepository": "Nuovo Repository",
|
"HeaderNewRepository": "Nuovo Repository",
|
||||||
"MessageNoRepositories": "Nessun repository."
|
"MessageNoRepositories": "Nessun repository.",
|
||||||
|
"ButtonPlayer": "Player"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1143,5 +1143,6 @@
|
||||||
"ClientSettings": "クライアント設定",
|
"ClientSettings": "クライアント設定",
|
||||||
"Artist": "アーティスト",
|
"Artist": "アーティスト",
|
||||||
"AlbumArtist": "アルバム アーティスト",
|
"AlbumArtist": "アルバム アーティスト",
|
||||||
"Album": "アルバム"
|
"Album": "アルバム",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1543,5 +1543,6 @@
|
||||||
"HeaderRemoteAccessSettings": "Qashyqtan qatynaý parametrleri",
|
"HeaderRemoteAccessSettings": "Qashyqtan qatynaý parametrleri",
|
||||||
"HeaderHttpsSettings": "HTTPS parametrleri",
|
"HeaderHttpsSettings": "HTTPS parametrleri",
|
||||||
"HeaderFavoritePlaylists": "Tańdaýly oınatý tizimder",
|
"HeaderFavoritePlaylists": "Tańdaýly oınatý tizimder",
|
||||||
"HeaderDVR": "DVR"
|
"HeaderDVR": "DVR",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1429,5 +1429,6 @@
|
||||||
"ButtonToggleContextMenu": "더보기",
|
"ButtonToggleContextMenu": "더보기",
|
||||||
"Rate": "평",
|
"Rate": "평",
|
||||||
"PerfectMatch": "정확히 일치",
|
"PerfectMatch": "정확히 일치",
|
||||||
"OtherArtist": "다른 아티스트"
|
"OtherArtist": "다른 아티스트",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1014,5 +1014,6 @@
|
||||||
"ButtonToggleContextMenu": "Daugiau",
|
"ButtonToggleContextMenu": "Daugiau",
|
||||||
"ButtonSplit": "Skirstyti",
|
"ButtonSplit": "Skirstyti",
|
||||||
"AskAdminToCreateLibrary": "Prašyti administratoriaus, kad sukurtų mediateka.",
|
"AskAdminToCreateLibrary": "Prašyti administratoriaus, kad sukurtų mediateka.",
|
||||||
"Album": "Albumas"
|
"Album": "Albumas",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -602,14 +602,14 @@
|
||||||
"AsManyAsPossible": "Cik vien iespējams",
|
"AsManyAsPossible": "Cik vien iespējams",
|
||||||
"Artists": "Izpildītāji",
|
"Artists": "Izpildītāji",
|
||||||
"Art": "Māksla",
|
"Art": "Māksla",
|
||||||
"AroundTime": "Ap {0}",
|
"AroundTime": "Ap",
|
||||||
"Anytime": "Jebkad",
|
"Anytime": "Jebkad",
|
||||||
"AnyLanguage": "Jebkura Valoda",
|
"AnyLanguage": "Jebkura Valoda",
|
||||||
"AlwaysPlaySubtitles": "Vienmēr Rādīt",
|
"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.",
|
"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.",
|
"AllowRemoteAccessHelp": "Ja atķeksēts, visi attālinātie savienojumi tiks bloķēti.",
|
||||||
"AllowRemoteAccess": "Atļaut attālinātus savienojumus šim Jellyfin Serverim.",
|
"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",
|
"AllowMediaConversion": "Atļaut multimēdiju pārveidošanu",
|
||||||
"AllLibraries": "Visas bibliotēkas",
|
"AllLibraries": "Visas bibliotēkas",
|
||||||
"AllLanguages": "Visas valodas",
|
"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.",
|
"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.",
|
"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",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,5 +97,6 @@
|
||||||
"ButtonRemove": "काढून टाका",
|
"ButtonRemove": "काढून टाका",
|
||||||
"ButtonPreviousTrack": "मागचा ट्रॅक",
|
"ButtonPreviousTrack": "मागचा ट्रॅक",
|
||||||
"ButtonPlay": "प्ले",
|
"ButtonPlay": "प्ले",
|
||||||
"ButtonPause": "पॉझ"
|
"ButtonPause": "पॉझ",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,5 +102,6 @@
|
||||||
"HeaderContinueWatching": "Terus Menonton",
|
"HeaderContinueWatching": "Terus Menonton",
|
||||||
"Genres": "Genre-genre",
|
"Genres": "Genre-genre",
|
||||||
"Collections": "Koleksi",
|
"Collections": "Koleksi",
|
||||||
"Channels": "Saluran"
|
"Channels": "Saluran",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1552,5 +1552,6 @@
|
||||||
"HeaderDVR": "Opptak",
|
"HeaderDVR": "Opptak",
|
||||||
"ApiKeysCaption": "Liste over aktive API-nøkler",
|
"ApiKeysCaption": "Liste over aktive API-nøkler",
|
||||||
"EnableDetailsBannerHelp": "Viser et bildebanner øverst på detaljsiden.",
|
"EnableDetailsBannerHelp": "Viser et bildebanner øverst på detaljsiden.",
|
||||||
"EnableDetailsBanner": "Detaljebanner"
|
"EnableDetailsBanner": "Detaljebanner",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1558,5 +1558,6 @@
|
||||||
"HeaderRemoteAccessSettings": "Externe toegang instellingen",
|
"HeaderRemoteAccessSettings": "Externe toegang instellingen",
|
||||||
"HeaderHttpsSettings": "HTTPS instellingen",
|
"HeaderHttpsSettings": "HTTPS instellingen",
|
||||||
"HeaderDVR": "DVR",
|
"HeaderDVR": "DVR",
|
||||||
"ApiKeysCaption": "Lijst met de momenteel ingeschakelde API-sleutels"
|
"ApiKeysCaption": "Lijst met de momenteel ingeschakelde API-sleutels",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1479,5 +1479,6 @@
|
||||||
"DeinterlaceMethodHelp": "Wybierz metodę usuwania przeplotu używaną podczas transkodowania.",
|
"DeinterlaceMethodHelp": "Wybierz metodę usuwania przeplotu używaną podczas transkodowania.",
|
||||||
"ClientSettings": "Ustawienia klienta",
|
"ClientSettings": "Ustawienia klienta",
|
||||||
"ButtonTogglePlaylist": "Playlista",
|
"ButtonTogglePlaylist": "Playlista",
|
||||||
"ButtonToggleContextMenu": "Więcej"
|
"ButtonToggleContextMenu": "Więcej",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,5 +22,6 @@
|
||||||
"HeaderCastCrew": "Mateys",
|
"HeaderCastCrew": "Mateys",
|
||||||
"Add": "Upend",
|
"Add": "Upend",
|
||||||
"Actor": "Privateer",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1511,7 +1511,7 @@
|
||||||
"LabelNightly": "Nightly",
|
"LabelNightly": "Nightly",
|
||||||
"LabelStable": "Estável",
|
"LabelStable": "Estável",
|
||||||
"LabelChromecastVersion": "Versão do Chromecast",
|
"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",
|
"LabelEnableHttps": "Habilitar HTTPS",
|
||||||
"HeaderServerAddressSettings": "Configurações da localização do servidor",
|
"HeaderServerAddressSettings": "Configurações da localização do servidor",
|
||||||
"HeaderRemoteAccessSettings": "Configurações de acesso remoto",
|
"HeaderRemoteAccessSettings": "Configurações de acesso remoto",
|
||||||
|
@ -1567,5 +1567,7 @@
|
||||||
"LabelRepositoryUrlHelp": "A localização do manifesto do repositório que você deseja incluir.",
|
"LabelRepositoryUrlHelp": "A localização do manifesto do repositório que você deseja incluir.",
|
||||||
"LabelRepositoryUrl": "URL do repositório",
|
"LabelRepositoryUrl": "URL do repositório",
|
||||||
"HeaderNewRepository": "Novo repositório",
|
"HeaderNewRepository": "Novo repositório",
|
||||||
"MessageNoRepositories": "Não há repositórios."
|
"MessageNoRepositories": "Não há repositórios.",
|
||||||
|
"ButtonPlayer": "Reprodutor",
|
||||||
|
"Writers": "Escritores"
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.",
|
"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",
|
"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.",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1416,5 +1416,6 @@
|
||||||
"HeaderDVR": "DVR",
|
"HeaderDVR": "DVR",
|
||||||
"ApiKeysCaption": "Lista das chaves de API ativadas no momento",
|
"ApiKeysCaption": "Lista das chaves de API ativadas no momento",
|
||||||
"ButtonTogglePlaylist": "Lista de leitura",
|
"ButtonTogglePlaylist": "Lista de leitura",
|
||||||
"ButtonToggleContextMenu": "Mais"
|
"ButtonToggleContextMenu": "Mais",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1558,5 +1558,15 @@
|
||||||
"EnableFasterAnimationsHelp": "Utilizați animații și tranziții mai rapide",
|
"EnableFasterAnimationsHelp": "Utilizați animații și tranziții mai rapide",
|
||||||
"EnableFasterAnimations": "Animații mai rapide",
|
"EnableFasterAnimations": "Animații mai rapide",
|
||||||
"EnableDecodingColorDepth10Vp9": "Activați decodarea hardware pe 10 biți pentru VP9",
|
"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."
|
||||||
}
|
}
|
||||||
|
|
|
@ -1504,7 +1504,7 @@
|
||||||
"MessageUnauthorizedUser": "В настоящее время у вас нет доступа к серверу. Пожалуйста, свяжитесь с администратором сервера для получения дополнительной информации.",
|
"MessageUnauthorizedUser": "В настоящее время у вас нет доступа к серверу. Пожалуйста, свяжитесь с администратором сервера для получения дополнительной информации.",
|
||||||
"HeaderFavoritePlaylists": "Избранные плей-листы",
|
"HeaderFavoritePlaylists": "Избранные плей-листы",
|
||||||
"LabelRequireHttpsHelp": "Если этот флажок установлен, сервер будет автоматически перенаправлять все запросы через HTTP на HTTPS. Это не имеет никакого эффекта, если сервер не слушает HTTPS.",
|
"LabelRequireHttpsHelp": "Если этот флажок установлен, сервер будет автоматически перенаправлять все запросы через HTTP на HTTPS. Это не имеет никакого эффекта, если сервер не слушает HTTPS.",
|
||||||
"LabelEnableHttpsHelp": "Позволяет серверу слушать сконфигурированный HTTPS-порт. Действительный сертификат также должен быть сконфигурирован для того, чтобы это вступило в силу.",
|
"LabelEnableHttpsHelp": "Позволяет серверу слушать HTTPS-порт. Для работы необходим действующий сертификат.",
|
||||||
"ApiKeysCaption": "Список действующих текущих API-ключей",
|
"ApiKeysCaption": "Список действующих текущих API-ключей",
|
||||||
"TabDVR": "DVR",
|
"TabDVR": "DVR",
|
||||||
"SaveChanges": "Сохранить изменения",
|
"SaveChanges": "Сохранить изменения",
|
||||||
|
@ -1545,12 +1545,27 @@
|
||||||
"LabelSyncPlayPlaybackDiff": "Разница времени воспроизведения:",
|
"LabelSyncPlayPlaybackDiff": "Разница времени воспроизведения:",
|
||||||
"MillisecondsUnit": "мс",
|
"MillisecondsUnit": "мс",
|
||||||
"LabelSyncPlayTimeOffset": "Сдвиг времени относительно сервера:",
|
"LabelSyncPlayTimeOffset": "Сдвиг времени относительно сервера:",
|
||||||
"SyncPlayAccessHelp": "Выберите уровень доступа данного пользователя к функциональности SyncPlay. SyncPlay позволяет синхронизировать воспроизведение с другими устройствами.",
|
"SyncPlayAccessHelp": "Выберите уровень доступа данного пользователя к функции SyncPlay. SyncPlay позволяет синхронизировать воспроизведение с другими устройствами.",
|
||||||
"MessageSyncPlayErrorMedia": "Не удалось включить SyncPlay! Ошибка медиаданных.",
|
"MessageSyncPlayErrorMedia": "Не удалось включить SyncPlay! Ошибка медиаданных.",
|
||||||
"MessageSyncPlayErrorMissingSession": "Не удалось включить SyncPlay! Отсутствует сеанс.",
|
"MessageSyncPlayErrorMissingSession": "Не удалось включить SyncPlay! Отсутствует сеанс.",
|
||||||
"MessageSyncPlayErrorNoActivePlayer": "Активный проигрыватель не найден. SyncPlay был отключен.",
|
"MessageSyncPlayErrorNoActivePlayer": "Активный проигрыватель не найден. SyncPlay был отключен.",
|
||||||
"ShowMore": "Показать больше",
|
"ShowMore": "Показать больше",
|
||||||
"ShowLess": "Показать меньше",
|
"ShowLess": "Показать меньше",
|
||||||
"EnableBlurhashHelp": "Рисунки, которые всё ещё загружаются, будут отображаться с размытым заполнением",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1568,5 +1568,7 @@
|
||||||
"MessageAddRepository": "Pokiaľ chcete pridať repozitár, kliknite na tlačidlo vedľa hlavičky a vyplňte požadované informácie.",
|
"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.",
|
"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",
|
"LabelRepositoryName": "Názov repozitára",
|
||||||
"LabelRepositoryUrlHelp": "Umiestnenie manifestu repozitára, ktorý chcete zahrnúť."
|
"LabelRepositoryUrlHelp": "Umiestnenie manifestu repozitára, ktorý chcete zahrnúť.",
|
||||||
|
"ButtonPlayer": "Prehrávač",
|
||||||
|
"Writers": "Scenáristi"
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
"Alerts": "Alarmi",
|
"Alerts": "Alarmi",
|
||||||
"All": "Vse",
|
"All": "Vse",
|
||||||
"AllChannels": "Vsi kanali",
|
"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",
|
"AllEpisodes": "Vse epizode",
|
||||||
"AllLanguages": "Vsi jeziki",
|
"AllLanguages": "Vsi jeziki",
|
||||||
"AllLibraries": "Vse knjižnice",
|
"AllLibraries": "Vse knjižnice",
|
||||||
|
@ -1275,5 +1275,6 @@
|
||||||
"Episode": "Epizoda",
|
"Episode": "Epizoda",
|
||||||
"EnableDetailsBannerHelp": "Prikaži sliko pasice na vrhu strani podrobnosti.",
|
"EnableDetailsBannerHelp": "Prikaži sliko pasice na vrhu strani podrobnosti.",
|
||||||
"EnableDetailsBanner": "Pasica podrobnosti",
|
"EnableDetailsBanner": "Pasica podrobnosti",
|
||||||
"DeinterlaceMethodHelp": "Izberite način razpletanja pri prekodiranju prepletenih vsebin."
|
"DeinterlaceMethodHelp": "Izberite način razpletanja pri prekodiranju prepletenih vsebin.",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -194,5 +194,6 @@
|
||||||
"AlbumArtist": "Извођач албума",
|
"AlbumArtist": "Извођач албума",
|
||||||
"Album": "Албум",
|
"Album": "Албум",
|
||||||
"AirDate": "Премијера",
|
"AirDate": "Премијера",
|
||||||
"AdditionalNotificationServices": "Прегледајте каталог додатака да бисте инсталирали сервисе за обавештења."
|
"AdditionalNotificationServices": "Прегледајте каталог додатака да бисте инсталирали сервисе за обавештења.",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1513,5 +1513,6 @@
|
||||||
"HeaderServerAddressSettings": "Serveradressinställningar",
|
"HeaderServerAddressSettings": "Serveradressinställningar",
|
||||||
"HeaderRemoteAccessSettings": "Inställningar för fjärråtkomst",
|
"HeaderRemoteAccessSettings": "Inställningar för fjärråtkomst",
|
||||||
"HeaderHttpsSettings": "HTTPS-inställningar",
|
"HeaderHttpsSettings": "HTTPS-inställningar",
|
||||||
"HeaderDVR": "PVR"
|
"HeaderDVR": "PVR",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -768,5 +768,6 @@
|
||||||
"LabelSkipIfAudioTrackPresent": "Varsayılan ses izi indirme diliyle uyuşuyorsa atla",
|
"LabelSkipIfAudioTrackPresent": "Varsayılan ses izi indirme diliyle uyuşuyorsa atla",
|
||||||
"LabelSize": "Boyut:",
|
"LabelSize": "Boyut:",
|
||||||
"LabelSimultaneousConnectionLimit": "Eşzamanlı yayın limiti:",
|
"LabelSimultaneousConnectionLimit": "Eşzamanlı yayın limiti:",
|
||||||
"LabelServerName": "Sunucu adı:"
|
"LabelServerName": "Sunucu adı:",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,5 +159,6 @@
|
||||||
"AllowOnTheFlySubtitleExtractionHelp": "Вбудовані субтитри можуть бути експортовані з відео і надіслані, по черзі, клієнтам у вигляді тексту. Це допоможе уникнути перекодування відео. На деяких системах, перекодування може зайняти тривалий час і зупинити відтворення відео, для того щоб забезпечити експортування. Вимкнення цієї функції дозволить вбудованим субтитрам бути інтегрованим у відео, під час перекодування, якщо вбудовані субтитри не підтримуються на стороні клієнта.",
|
"AllowOnTheFlySubtitleExtractionHelp": "Вбудовані субтитри можуть бути експортовані з відео і надіслані, по черзі, клієнтам у вигляді тексту. Це допоможе уникнути перекодування відео. На деяких системах, перекодування може зайняти тривалий час і зупинити відтворення відео, для того щоб забезпечити експортування. Вимкнення цієї функції дозволить вбудованим субтитрам бути інтегрованим у відео, під час перекодування, якщо вбудовані субтитри не підтримуються на стороні клієнта.",
|
||||||
"AllowOnTheFlySubtitleExtraction": "Дозволити експортування субтитрів «на льоту»",
|
"AllowOnTheFlySubtitleExtraction": "Дозволити експортування субтитрів «на льоту»",
|
||||||
"AllowHWTranscodingHelp": "Дозволити клієнту перекодування на «на льоту». Це дозволить відмикати перекодування, якщо вона вимагається сервером.",
|
"AllowHWTranscodingHelp": "Дозволити клієнту перекодування на «на льоту». Це дозволить відмикати перекодування, якщо вона вимагається сервером.",
|
||||||
"AllComplexFormats": "Усі складні формати (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)"
|
"AllComplexFormats": "Усі складні формати (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1,3 @@
|
||||||
{}
|
{
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
|
}
|
||||||
|
|
|
@ -825,5 +825,6 @@
|
||||||
"LabelMaxStreamingBitrateHelp": "Thiết lập bitrate tối đa khi truyền tải.",
|
"LabelMaxStreamingBitrateHelp": "Thiết lập bitrate tối đa khi truyền tải.",
|
||||||
"LabelMaxStreamingBitrate": "Chất lượng phát tối đa:",
|
"LabelMaxStreamingBitrate": "Chất lượng phát tối đa:",
|
||||||
"LabelMaxScreenshotsPerItem": "Số lượng ảnh chụp tối đa mỗi mục:",
|
"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"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1546,7 +1546,7 @@
|
||||||
"LabelSyncPlayLeaveGroupDescription": "关闭同步播放",
|
"LabelSyncPlayLeaveGroupDescription": "关闭同步播放",
|
||||||
"EnableDetailsBanner": "详细信息页面的横幅",
|
"EnableDetailsBanner": "详细信息页面的横幅",
|
||||||
"ButtonCast": "投射",
|
"ButtonCast": "投射",
|
||||||
"ButtonSyncPlay": "同步播放",
|
"ButtonSyncPlay": "SyncPlay",
|
||||||
"EnableBlurhashHelp": "仍在加载的图片将显示带有模糊的占位符",
|
"EnableBlurhashHelp": "仍在加载的图片将显示带有模糊的占位符",
|
||||||
"EnableBlurhash": "为图片启用模糊的占位符",
|
"EnableBlurhash": "为图片启用模糊的占位符",
|
||||||
"SyncPlayAccessHelp": "为此用户选择对同步播放功能的访问级别。同步播放让你可以和其他设备同步播放进度。",
|
"SyncPlayAccessHelp": "为此用户选择对同步播放功能的访问级别。同步播放让你可以和其他设备同步播放进度。",
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"Add": "添加",
|
"Add": "添加",
|
||||||
"ButtonAdd": "新增",
|
"ButtonAdd": "增加",
|
||||||
"ButtonAddScheduledTaskTrigger": "新增觸發",
|
"ButtonAddScheduledTaskTrigger": "新增觸發點",
|
||||||
"ButtonAddUser": "添加用戶",
|
"ButtonAddUser": "添加用戶",
|
||||||
"ButtonCancel": "取消",
|
"ButtonCancel": "取消",
|
||||||
"ButtonDelete": "删除",
|
"ButtonDelete": "删除",
|
||||||
|
@ -10,12 +10,12 @@
|
||||||
"ButtonFilter": "過濾",
|
"ButtonFilter": "過濾",
|
||||||
"ButtonHelp": "幫助",
|
"ButtonHelp": "幫助",
|
||||||
"ButtonManualLogin": "手動登入",
|
"ButtonManualLogin": "手動登入",
|
||||||
"ButtonNew": "最新",
|
"ButtonNew": "新增",
|
||||||
"ButtonOk": "確定",
|
"ButtonOk": "確定",
|
||||||
"ButtonPlay": "播放",
|
"ButtonPlay": "播放",
|
||||||
"ButtonQuickStartGuide": "快速入門指南",
|
"ButtonQuickStartGuide": "快速入門指南",
|
||||||
"ButtonRefresh": "重新整理",
|
"ButtonRefresh": "重新整理",
|
||||||
"ButtonRefreshGuideData": "重新整理電視指南資料",
|
"ButtonRefreshGuideData": "重新整理指南資料",
|
||||||
"ButtonRemove": "清除",
|
"ButtonRemove": "清除",
|
||||||
"ButtonRename": "重新命名",
|
"ButtonRename": "重新命名",
|
||||||
"ButtonResetPassword": "重設密碼",
|
"ButtonResetPassword": "重設密碼",
|
||||||
|
@ -378,17 +378,17 @@
|
||||||
"Ascending": "上升",
|
"Ascending": "上升",
|
||||||
"Artist": "藝人",
|
"Artist": "藝人",
|
||||||
"Art": "藝術",
|
"Art": "藝術",
|
||||||
"AroundTime": "大約{0}",
|
"AroundTime": "大約",
|
||||||
"AlwaysPlaySubtitlesHelp": "無論語言是哪種音頻,都將加載與語言首選項匹配的字幕。",
|
"AlwaysPlaySubtitlesHelp": "無論語言是哪種音頻,都將加載與語言首選項匹配的字幕。",
|
||||||
"AllowedRemoteAddressesHelp": "IP地址或IP /網絡掩碼條目的逗號分隔列表,用於允許遠程連接的網絡。 如果保留為空白,將允許所有遠程地址。",
|
"AllowedRemoteAddressesHelp": "IP地址或IP /網絡掩碼條目的逗號分隔列表,用於允許遠程連接的網絡。 如果保留為空白,將允許所有遠程地址。",
|
||||||
"AllowRemoteAccessHelp": "如果未選中,則將阻止所有遠程連接。",
|
"AllowRemoteAccessHelp": "如果未選中,則將阻止所有遠程連接。",
|
||||||
"AllowRemoteAccess": "允許與此Jellyfin服務器的遠程連接。",
|
"AllowRemoteAccess": "允許與此Jellyfin服務器的遠程連接。",
|
||||||
"AllowFfmpegThrottlingHelp": "當轉碼或remux距離當前播放位置足夠遠時,請暫停該過程,以減少資源消耗。 在不經常觀看的情況下,此功能最為有用。 如果遇到播放問題,請關閉此功能。",
|
"AllowFfmpegThrottlingHelp": "當轉碼或無損複製進度遠超於當前播放位置,暫停進程可減少資源消耗。 在不經常觀看的情況下,此功能最為有用。 如果遇到播放問題,請關閉此功能。",
|
||||||
"AllowOnTheFlySubtitleExtractionHelp": "可以從視頻中提取嵌入式字幕,然後以純文本格式將其交付給客戶端,以幫助防止視頻轉碼。 在某些系統上,這可能需要很長時間,並且會導致提取過程中視頻播放停止。 如果客戶端設備本身不支持嵌入的字幕,則可以禁用此選項以通過視頻轉碼刻錄字幕。",
|
"AllowOnTheFlySubtitleExtractionHelp": "可以從視頻中提取嵌入式字幕,然後以純文本格式將其交付給客戶端,以幫助防止視頻轉碼。 在某些系統上,這可能需要很長時間,並且會導致提取過程中視頻播放停止。 如果客戶端設備本身不支持嵌入的字幕,則可以禁用此選項以通過視頻轉碼刻錄字幕。",
|
||||||
"AllowOnTheFlySubtitleExtraction": "允許即時提取字幕",
|
"AllowOnTheFlySubtitleExtraction": "允許即時提取字幕",
|
||||||
"AllowMediaConversionHelp": "授予或拒絕訪問轉換媒體功能的權限。",
|
"AllowMediaConversionHelp": "授予或拒絕訪問轉換媒體功能的權限。",
|
||||||
"AllowMediaConversion": "允許媒體轉換",
|
"AllowMediaConversion": "允許媒體轉換",
|
||||||
"AllowHWTranscodingHelp": "允許調諧器即時轉碼流。 這可以幫助減少服務器所需的代碼轉換。",
|
"AllowHWTranscodingHelp": "允許調諧器即時轉碼。 這可減少使用伺服器轉碼。",
|
||||||
"AllLibraries": "所有媒體庫",
|
"AllLibraries": "所有媒體庫",
|
||||||
"AllEpisodes": "所有劇集",
|
"AllEpisodes": "所有劇集",
|
||||||
"AllComplexFormats": "所有格式(ASS,SSA,VOBSUB,PGS,SUB,IDX等)",
|
"AllComplexFormats": "所有格式(ASS,SSA,VOBSUB,PGS,SUB,IDX等)",
|
||||||
|
@ -399,8 +399,109 @@
|
||||||
"Aired": "已播出",
|
"Aired": "已播出",
|
||||||
"AirDate": "播出日期",
|
"AirDate": "播出日期",
|
||||||
"AdditionalNotificationServices": "瀏覽插件目錄以安裝其他通知服務。",
|
"AdditionalNotificationServices": "瀏覽插件目錄以安裝其他通知服務。",
|
||||||
"AddToPlayQueue": "添加到播放列",
|
"AddToPlayQueue": "添加到播放隊列",
|
||||||
"AddToCollection": "添加到收藏",
|
"AddToCollection": "添加到收藏",
|
||||||
"AddItemToCollectionHelp": "通過搜索項目並使用右鍵單擊或點擊菜單將其添加到集合中,從而將它們添加到集合中。",
|
"AddItemToCollectionHelp": "搜尋物件並使用右鍵點擊或點擊菜單將他們添加到收藏中。",
|
||||||
"AccessRestrictedTryAgainLater": "目前限制訪問。 請稍後再試。"
|
"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": "確定若服務器對視頻進行轉碼時是否嵌入字幕。 關閉這功能將使用更少時間。 選擇'自動'可嵌入基於圖像的格式字幕(VOBSUB,PGS,SUB,IDX等)和某些ASS或SSA字幕。",
|
||||||
|
"BrowsePluginCatalogMessage": "瀏覽我們的插件目錄以查看可用的插件。",
|
||||||
|
"BoxRear": "盒裝(背面)",
|
||||||
|
"BoxSet": "套裝",
|
||||||
|
"Box": "盒裝"
|
||||||
}
|
}
|
||||||
|
|
|
@ -1015,7 +1015,7 @@
|
||||||
"LabelEnableDlnaServerHelp": "允許網絡上的 UPnP 設備瀏覽和播放內容。",
|
"LabelEnableDlnaServerHelp": "允許網絡上的 UPnP 設備瀏覽和播放內容。",
|
||||||
"LabelEnableHardwareDecodingFor": "為以下啟用硬體解碼:",
|
"LabelEnableHardwareDecodingFor": "為以下啟用硬體解碼:",
|
||||||
"LabelEpisodeNumber": "集:",
|
"LabelEpisodeNumber": "集:",
|
||||||
"LabelBaseUrlHelp": "您可以在此處新增自訂路徑來進入伺服器。",
|
"LabelBaseUrlHelp": "您可以在此處自訂伺服器URL路徑的子目錄。",
|
||||||
"LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片",
|
"LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片",
|
||||||
"LabelHttpsPort": "本地 HTTPS 端口:",
|
"LabelHttpsPort": "本地 HTTPS 端口:",
|
||||||
"LabelFailed": "失敗",
|
"LabelFailed": "失敗",
|
||||||
|
@ -1655,5 +1655,6 @@
|
||||||
"New": "新增",
|
"New": "新增",
|
||||||
"ApiKeysCaption": "目前已啟用的API金鑰列表",
|
"ApiKeysCaption": "目前已啟用的API金鑰列表",
|
||||||
"ButtonTogglePlaylist": "播放清單",
|
"ButtonTogglePlaylist": "播放清單",
|
||||||
"ButtonToggleContextMenu": "更多"
|
"ButtonToggleContextMenu": "更多",
|
||||||
|
"ButtonSyncPlay": "SyncPlay"
|
||||||
}
|
}
|
||||||
|
|
|
@ -227,7 +227,7 @@ html {
|
||||||
color: #fff !important;
|
color: #fff !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailSticky {
|
.detailRibbon {
|
||||||
background: #303030;
|
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-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);
|
background: -webkit-linear-gradient(left, #bcbcbc, #a7b4b7, #beb5a5, #adbec2, #b9c7cb);
|
||||||
|
@ -257,11 +257,6 @@ html {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mediaInfoTimerIcon,
|
|
||||||
.starIcon {
|
|
||||||
color: #cb272a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.emby-input,
|
.emby-input,
|
||||||
.emby-textarea {
|
.emby-textarea {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
|
|
@ -223,7 +223,7 @@ html {
|
||||||
color: #fff !important;
|
color: #fff !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailSticky {
|
.detailRibbon {
|
||||||
background: #303030;
|
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-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);
|
background: -webkit-linear-gradient(left, #291a31, #033664, #011432, #141a3a, #291a31);
|
||||||
|
@ -261,11 +261,6 @@ html {
|
||||||
background: rgba(170, 170, 190, 0.2);
|
background: rgba(170, 170, 190, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.mediaInfoTimerIcon,
|
|
||||||
.starIcon {
|
|
||||||
color: #cb272a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.emby-input,
|
.emby-input,
|
||||||
.emby-textarea {
|
.emby-textarea {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
|
|
@ -203,11 +203,11 @@ html {
|
||||||
background: rgba(30, 30, 30, 0.9);
|
background: rgba(30, 30, 30, 0.9);
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailSticky {
|
.detailRibbon {
|
||||||
background: rgba(32, 32, 32, 0.8);
|
background: rgba(32, 32, 32, 0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
.noBackdrop .detailSticky {
|
.noBackdrop .detailRibbon {
|
||||||
background: #202020;
|
background: #202020;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,11 +236,6 @@ html {
|
||||||
background: rgba(170, 170, 190, 0.2);
|
background: rgba(170, 170, 190, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.mediaInfoTimerIcon,
|
|
||||||
.starIcon {
|
|
||||||
color: #cb272a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.emby-input,
|
.emby-input,
|
||||||
.emby-textarea {
|
.emby-textarea {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
@ -453,3 +448,8 @@ html {
|
||||||
.metadataSidebarIcon {
|
.metadataSidebarIcon {
|
||||||
color: #00a4dc;
|
color: #00a4dc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.emby-button.detailFloatingButton {
|
||||||
|
background-color: #00a4dc;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
|
@ -221,7 +221,7 @@ html {
|
||||||
color: #fff !important;
|
color: #fff !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailSticky {
|
.detailRibbon {
|
||||||
background-color: #303030;
|
background-color: #303030;
|
||||||
color: #ccc;
|
color: #ccc;
|
||||||
color: rgba(255, 255, 255, 0.87);
|
color: rgba(255, 255, 255, 0.87);
|
||||||
|
@ -250,11 +250,6 @@ html {
|
||||||
background: #fff;
|
background: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mediaInfoTimerIcon,
|
|
||||||
.starIcon {
|
|
||||||
color: #cb272a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.emby-input,
|
.emby-input,
|
||||||
.emby-textarea {
|
.emby-textarea {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
|
|
@ -307,7 +307,7 @@ a[data-role=button] {
|
||||||
color: #f8f8fe !important;
|
color: #f8f8fe !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailSticky {
|
.detailRibbon {
|
||||||
background: #000420;
|
background: #000420;
|
||||||
background: -moz-linear-gradient(left, #000420 0%, #06256f 18%, #2b052b 38%, #2b052b 68%, #06256f 81%, #000420 100%);
|
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%);
|
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);
|
background: rgba(170, 170, 190, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.mediaInfoTimerIcon,
|
|
||||||
.starIcon {
|
|
||||||
color: #f2b01e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.emby-input,
|
.emby-input,
|
||||||
.emby-textarea {
|
.emby-textarea {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
|
|
@ -209,7 +209,7 @@ html {
|
||||||
color: #fff !important;
|
color: #fff !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.detailSticky {
|
.detailRibbon {
|
||||||
background-color: #081b3b;
|
background-color: #081b3b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,11 +243,6 @@ html {
|
||||||
background: rgba(170, 170, 190, 0.2);
|
background: rgba(170, 170, 190, 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.mediaInfoTimerIcon,
|
|
||||||
.starIcon {
|
|
||||||
color: #cb272a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.emby-input,
|
.emby-input,
|
||||||
.emby-textarea {
|
.emby-textarea {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
|
|
|
@ -6273,10 +6273,10 @@ isurl@^1.0.0-alpha5:
|
||||||
has-to-string-tag-x "^1.2.0"
|
has-to-string-tag-x "^1.2.0"
|
||||||
is-object "^1.0.1"
|
is-object "^1.0.1"
|
||||||
|
|
||||||
jellyfin-apiclient@^1.2.2:
|
jellyfin-apiclient@^1.3.0:
|
||||||
version "1.2.2"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/jellyfin-apiclient/-/jellyfin-apiclient-1.2.2.tgz#64f058320603df02d926f4c1b929b42c6acc4527"
|
resolved "https://registry.yarnpkg.com/jellyfin-apiclient/-/jellyfin-apiclient-1.3.0.tgz#428ec998ef17a755a7c07f6284f6eb4a56a63242"
|
||||||
integrity sha512-UwC56orm4darWlnNQJ1nbKo+W8ywlheJSJC6d9zm06CslYtOc/Dkv9kz2PadQEh+6EiBsB0hAZCc7FJ9ahOoGQ==
|
integrity sha512-jq+erwtg175Vg/VnxPdMIc+R2e0+t22T42tJiirMU84xBgk+h3maJar7Umr5NHyfkbt6J8d0TmR2O7nXwVpR+w==
|
||||||
|
|
||||||
"jellyfin-noto@https://github.com/jellyfin/jellyfin-noto":
|
"jellyfin-noto@https://github.com/jellyfin/jellyfin-noto":
|
||||||
version "1.0.3"
|
version "1.0.3"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue