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

Merge pull request #1687 from MediaBrowser/dev

Dev
This commit is contained in:
Luke 2016-04-27 15:29:58 -04:00
commit 8f2cfb16e7
145 changed files with 5062 additions and 2285 deletions

View file

@ -16,12 +16,12 @@
},
"devDependencies": {},
"ignore": [],
"version": "1.2.39",
"_release": "1.2.39",
"version": "1.2.48",
"_release": "1.2.48",
"_resolution": {
"type": "version",
"tag": "1.2.39",
"commit": "956d151bb5506eea13c56b69f21220b55d2b7d35"
"tag": "1.2.48",
"commit": "342107db8bbaa343a4c61be6fd2591121a83ffff"
},
"_source": "https://github.com/MediaBrowser/emby-webcomponents.git",
"_target": "^1.2.0",

View file

@ -25,12 +25,17 @@
transition: transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);
transition: transform .3s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),-webkit-transform .3s cubic-bezier(.4,0,.2,1);
z-index: -1;*/
max-height: 84%;
}
.actionSheet.centered .actionSheetContent {
text-align: center;
align-items: center;
}
.layout-tv .actionSheet {
max-height: none;
}
.actionSheet.centered .actionSheetContent {
text-align: center;
align-items: center;
}
.actionSheetContent {
margin: 0 !important;

View file

@ -0,0 +1,12 @@
.clearButton {
background: transparent;
border: 0 !important;
padding: 0 !important;
cursor: pointer;
outline: none !important;
color: inherit;
width: 100%;
vertical-align: middle;
font-family: inherit;
font-size: inherit;
}

View file

@ -0,0 +1,398 @@
.tvguide {
display: flex;
flex-direction: column;
align-items: initial;
}
.tvGuideHeader {
white-space: nowrap;
width: 100%;
flex-shrink: 0;
}
.tvProgramSectionHeader {
margin: 0;
}
.tvProgram {
display: block;
text-decoration: none;
white-space: nowrap;
position: relative;
}
.tvProgramTimeSlotInner {
padding: .5em;
}
.tvProgramInfo {
vertical-align: middle;
padding: .5em .5em;
border-bottom: .65vh solid #121212;
}
.tvProgramCurrentTimeSlot {
background-color: green;
}
.tvProgramName {
color: #fff;
margin-bottom: .5em;
}
.tvProgramTime {
color: #fff;
}
.newTvProgram {
color: yellow;
text-transform: uppercase;
}
.liveTvProgram {
color: #64A239;
text-transform: uppercase;
}
.premiereTvProgram {
color: orange;
text-transform: uppercase;
}
.programAccent {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
}
.sportsProgramInfo .programAccent {
background-color: #0A7C33;
}
.newsProgramInfo .programAccent {
background-color: #523378;
}
.movieProgramInfo .programAccent {
background-color: #A43913;
}
.childProgramInfo .programAccent {
background-color: #0B487D;
}
.timerCircle {
display: inline-block;
width: 1em;
height: 1em;
border-radius: 50%;
background: #cc0000;
border: 1px solid #cc3333;
margin-left: 1em;
}
.seriesTimerCircle {
position: relative;
margin-left: 0;
left: 21px;
opacity: .3;
}
.itemMiscInfo .seriesTimerCircle:first-child {
margin-left: 1em;
}
.seriesTimerCircle + .seriesTimerCircle {
opacity: .65;
left: 0;
}
.seriesTimerCircle + .seriesTimerCircle + .seriesTimerCircle {
opacity: 1;
left: -21px;
}
.channelTimeslotHeader {
float: left;
}
.timeslotHeaders {
white-space: nowrap;
}
.mobileGuide .timeslotHeaders {
overflow-x: hidden;
}
.programContainer {
white-space: nowrap;
position: relative;
}
.programGridContainer {
margin-left: 12.2vw;
}
.channelPrograms {
white-space: nowrap;
position: relative;
}
.channelPrograms, .timeslotHeadersInner {
width: 1800vw;
}
@media all and (min-width: 600px) {
.channelPrograms, .timeslotHeadersInner {
width: 1400vw;
}
}
@media all and (min-width: 800px) {
.channelPrograms, .timeslotHeadersInner {
width: 1200vw;
}
}
@media all and (min-width: 1280px) {
.channelPrograms, .timeslotHeadersInner {
width: 660vw;
}
}
.timeslotHeader {
display: inline-flex;
align-items: center;
text-indent: .35em;
}
.channelHeaderCell, .channelTimeslotHeader {
overflow: hidden;
text-overflow: ellipsis;
border-right: 1px solid #121212;
width: 24vw;
background: rgba(40, 40, 40, .9);
display: flex;
align-items: center;
color: #fff !important;
text-decoration: none;
}
@media all and (min-width: 500px) {
.channelHeaderCell, .channelTimeslotHeader {
width: 16vw;
}
}
@media all and (min-width: 600px) {
.channelHeaderCell, .channelTimeslotHeader {
width: 16vw;
}
}
@media all and (min-width: 800px) {
.channelHeaderCell, .channelTimeslotHeader {
width: 14vw;
}
}
@media all and (min-width: 1280px) {
.channelHeaderCell, .channelTimeslotHeader {
width: 12vw;
}
}
.btnSelectDate {
color: #fff;
padding-left: .5em;
}
.channelHeaderCell {
border-bottom: .65vh solid #121212 !important;
background-size: auto 65.7%;
background-position: 90% center;
background-repeat: no-repeat;
}
@media all and (max-width: 800px) {
.guideCurrentDay {
display: none;
}
}
@media all and (max-width: 1280px) {
.guideChannelInfoWithImage .guideChannelName {
display: none;
}
}
.channelPrograms, .channelHeaderCell {
height: 15vh;
}
@media all and (min-height: 500px) {
.channelPrograms, .channelHeaderCell {
height: 10.5vh;
}
}
@media all and (min-height: 600px) {
.channelPrograms, .channelHeaderCell {
height: 9vh;
}
}
@media all and (min-height: 720px) {
.channelPrograms, .channelHeaderCell {
height: 6vh;
}
.layout-tv .channelPrograms, .layout-tv .channelHeaderCell {
height: 7.6vh;
}
}
.channelTimeslotHeader {
border-right-color: transparent;
}
.channelTimeslotHeader, .timeslotHeader {
background: transparent;
}
.timeslotHeader, .channelTimeslotHeader {
height: 14vh;
}
@media all and (min-height: 500px) {
.timeslotHeader, .channelTimeslotHeader {
height: 10vh;
}
}
@media all and (min-height: 600px) {
.timeslotHeader, .channelTimeslotHeader {
height: 8vh;
}
}
@media all and (min-height: 720px) {
.timeslotHeader, .channelTimeslotHeader {
height: 5.75vh;
}
}
.pointerInput .channelHeaderCell:hover {
background-color: #444;
}
.channelList {
float: left;
}
.programGrid {
padding-bottom: 4px;
}
.timeslotHeader {
width: 2.0833333333333333333333333333333%;
}
.programCell {
position: absolute;
top: 0;
/* Unfortunately the borders using vh get rounded while the bottom property doesn't. So this is a little hack to try and make them even*/
bottom: .59vh;
border-left: .65vh solid #121212 !important;
background-color: rgba(32, 32, 32, .95);
display: flex;
color: #fff !important;
text-decoration: none;
overflow: hidden;
align-items: center;
}
.timeslotCellInner {
position: absolute;
bottom: 0;
overflow: hidden;
width: 100%;
top: 0;
display: block;
text-decoration: none;
color: #fff !important;
}
.guideProgramName {
padding: 0 .5em 0;
overflow: hidden;
text-overflow: ellipsis;
}
.guideProgramTime {
padding: 0 .5em .35em;
color: #bbb;
}
.programCell iron-icon {
margin-left: auto;
margin-right: .5em;
height: 3.5vh;
width: 3.5vh;
color: #ddd;
flex-shrink: 0;
}
.programCell iron-icon + iron-icon {
margin-left: .25em;
}
.guideChannelInfo {
display: inline-block;
max-width: 110px;
overflow: hidden;
white-space: nowrap;
padding-left: .7em;
}
.guideChannelName {
margin-left: auto;
margin-right: .3em;
max-width: 6vw;
text-overflow: ellipsis;
overflow: hidden;
}
.channelList, .programGrid {
height: auto !important;
}
.programCell:focus, .channelHeaderCell:focus, .btnSelectDate:focus {
background-color: #52B54B;
outline: none !important;
}
.programCell:focus .programAccent {
background-color: transparent !important;
}
.timerIcon, .seriesTimerIcon {
color: #cc3333 !important;
}

View file

@ -0,0 +1,641 @@
define(['globalize', 'connectionManager', 'loading', 'scrollHelper', 'datetime', 'focusManager', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'registrationservices', 'clearButtonStyle', 'css!./guide.css', 'html!./icons.html', 'scrollStyles'], function (globalize, connectionManager, loading, scrollHelper, datetime, focusManager, imageLoader, events, layoutManager, itemShortcuts, registrationServices) {
var baseUrl;
function Guide(options) {
var self = this;
var items = {};
self.refresh = function () {
reloadPage(options.element);
};
self.destroy = function () {
itemShortcuts.off(options.element);
items = {};
};
self.options = options;
// 30 mins
var cellCurationMinutes = 30;
var cellDurationMs = cellCurationMinutes * 60 * 1000;
var msPerDay = 86400000;
var currentDate;
var channelQuery = {
StartIndex: 0,
EnableFavoriteSorting: true
};
var channelsPromise;
function normalizeDateToTimeslot(date) {
var minutesOffset = date.getMinutes() - cellCurationMinutes;
if (minutesOffset >= 0) {
date.setHours(date.getHours(), cellCurationMinutes, 0, 0);
} else {
date.setHours(date.getHours(), 0, 0, 0);
}
return date;
}
function showLoading() {
loading.show();
}
function hideLoading() {
loading.hide();
}
function getChannelLimit(context) {
return registrationServices.validateFeature('livetv').then(function () {
var limit = 400;
context.querySelector('.guideRequiresUnlock').classList.add('hide');
return limit;
}, function () {
var limit = 5;
context.querySelector('.guideRequiresUnlock').classList.remove('hide');
context.querySelector('.unlockText').innerHTML = globalize.translate('MessageLiveTvGuideRequiresUnlock', limit);
return limit;
});
}
function reloadGuide(context, newStartDate) {
var apiClient = connectionManager.currentApiClient();
channelQuery.UserId = apiClient.getCurrentUserId();
getChannelLimit(context).then(function (channelLimit) {
showLoading();
channelQuery.Limit = channelLimit;
channelQuery.AddCurrentProgram = false;
channelsPromise = channelsPromise || apiClient.getLiveTvChannels(channelQuery);
var date = newStartDate;
// Add one second to avoid getting programs that are just ending
date = new Date(date.getTime() + 1000);
// Subtract to avoid getting programs that are starting when the grid ends
var nextDay = new Date(date.getTime() + msPerDay - 2000);
console.log(nextDay);
channelsPromise.then(function (channelsResult) {
apiClient.getLiveTvPrograms({
UserId: apiClient.getCurrentUserId(),
MaxStartDate: nextDay.toISOString(),
MinEndDate: date.toISOString(),
channelIds: channelsResult.Items.map(function (c) {
return c.Id;
}).join(','),
ImageTypeLimit: 1,
EnableImageTypes: "Primary,Backdrop",
SortBy: "StartDate"
}).then(function (programsResult) {
renderGuide(context, date, channelsResult.Items, programsResult.Items, apiClient);
hideLoading();
});
});
});
}
function getDisplayTime(date) {
if ((typeof date).toString().toLowerCase() === 'string') {
try {
date = datetime.parseISO8601Date(date, { toLocal: true });
} catch (err) {
return date;
}
}
return datetime.getDisplayTime(date).toLowerCase();
}
function getTimeslotHeadersHtml(startDate, endDateTime) {
var html = '';
// clone
startDate = new Date(startDate.getTime());
html += '<div class="timeslotHeadersInner">';
while (startDate.getTime() < endDateTime) {
html += '<div class="timeslotHeader">';
html += getDisplayTime(startDate);
html += '</div>';
// Add 30 mins
startDate.setTime(startDate.getTime() + cellDurationMs);
}
html += '</div>';
return html;
}
function parseDates(program) {
if (!program.StartDateLocal) {
try {
program.StartDateLocal = datetime.parseISO8601Date(program.StartDate, { toLocal: true });
} catch (err) {
}
}
if (!program.EndDateLocal) {
try {
program.EndDateLocal = datetime.parseISO8601Date(program.EndDate, { toLocal: true });
} catch (err) {
}
}
return null;
}
function getChannelProgramsHtml(context, date, channel, programs) {
var html = '';
var startMs = date.getTime();
var endMs = startMs + msPerDay - 1;
programs = programs.filter(function (curr) {
return curr.ChannelId == channel.Id;
});
html += '<div class="channelPrograms">';
for (var i = 0, length = programs.length; i < length; i++) {
var program = programs[i];
if (program.ChannelId != channel.Id) {
continue;
}
parseDates(program);
if (program.EndDateLocal.getTime() < startMs) {
continue;
}
if (program.StartDateLocal.getTime() > endMs) {
break;
}
items[program.Id] = program;
var renderStartMs = Math.max(program.StartDateLocal.getTime(), startMs);
var startPercent = (program.StartDateLocal.getTime() - startMs) / msPerDay;
startPercent *= 100;
startPercent = Math.max(startPercent, 0);
var renderEndMs = Math.min(program.EndDateLocal.getTime(), endMs);
var endPercent = (renderEndMs - renderStartMs) / msPerDay;
endPercent *= 100;
var cssClass = "programCell clearButton itemAction";
var addAccent = true;
if (program.IsKids) {
cssClass += " childProgramInfo";
} else if (program.IsSports) {
cssClass += " sportsProgramInfo";
} else if (program.IsNews) {
cssClass += " newsProgramInfo";
} else if (program.IsMovie) {
cssClass += " movieProgramInfo";
}
else {
cssClass += " plainProgramInfo";
addAccent = false;
}
html += '<button data-action="link" data-isfolder="' + program.IsFolder + '" data-id="' + program.Id + '" data-serverid="' + program.ServerId + '" data-type="' + program.Type + '" class="' + cssClass + '" style="left:' + startPercent + '%;width:' + endPercent + '%;">';
var guideProgramNameClass = "guideProgramName";
html += '<div class="' + guideProgramNameClass + '">';
if (program.IsLive) {
html += '<span class="liveTvProgram">' + globalize.translate('core#AttributeLive') + '&nbsp;</span>';
}
else if (program.IsPremiere) {
html += '<span class="premiereTvProgram">' + globalize.translate('core#AttributePremiere') + '&nbsp;</span>';
}
else if (program.IsSeries && !program.IsRepeat) {
html += '<span class="newTvProgram">' + globalize.translate('core#AttributeNew') + '&nbsp;</span>';
}
html += program.Name;
html += '</div>';
if (program.IsHD) {
html += '<iron-icon icon="guide:hd"></iron-icon>';
}
if (program.SeriesTimerId) {
html += '<iron-icon class="seriesTimerIcon" icon="guide:fiber-smart-record"></iron-icon>';
}
else if (program.TimerId) {
html += '<iron-icon class="timerIcon" icon="guide:fiber-manual-record"></iron-icon>';
}
if (addAccent) {
html += '<div class="programAccent"></div>';
}
html += '</button>';
}
html += '</div>';
return html;
}
function renderPrograms(context, date, channels, programs) {
var html = [];
for (var i = 0, length = channels.length; i < length; i++) {
html.push(getChannelProgramsHtml(context, date, channels[i], programs));
}
var programGrid = context.querySelector('.programGrid');
programGrid.innerHTML = html.join('');
programGrid.scrollTop = 0;
programGrid.scrollLeft = 0;
}
function renderChannelHeaders(context, channels, apiClient) {
var html = '';
for (var i = 0, length = channels.length; i < length; i++) {
var channel = channels[i];
var hasChannelImage = channel.ImageTags.Primary;
var dataSrc = '';
if (hasChannelImage) {
var url = apiClient.getScaledImageUrl(channel.Id, {
maxHeight: 200,
tag: channel.ImageTags.Primary,
type: "Primary"
});
dataSrc = ' data-src="' + url + '"';
}
html += '<button type="button" class="channelHeaderCell clearButton itemAction lazy"' + dataSrc + ' data-action="link" data-isfolder="' + channel.IsFolder + '" data-id="' + channel.Id + '" data-serverid="' + channel.ServerId + '" data-type="' + channel.Type + '">';
var cssClass = hasChannelImage ? 'guideChannelInfo guideChannelInfoWithImage' : 'guideChannelInfo';
html += '<div class="' + cssClass + '"><div class="guideChannelName">' + channel.Number + '</div></div>';
html += '</button>';
}
var channelList = context.querySelector('.channelList');
channelList.innerHTML = html;
imageLoader.lazyChildren(channelList);
}
function renderGuide(context, date, channels, programs, apiClient) {
//var list = [];
//channels.forEach(function(i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels.forEach(function (i) {
// list.push(i);
//});
//channels = list;
renderChannelHeaders(context, channels, apiClient);
var startDate = date;
var endDate = new Date(startDate.getTime() + msPerDay);
context.querySelector('.timeslotHeaders').innerHTML = getTimeslotHeadersHtml(startDate, endDate);
items = {};
renderPrograms(context, date, channels, programs);
if (layoutManager.tv) {
focusManager.autoFocus(context.querySelector('.programGrid'), true);
}
}
function nativeScrollTo(container, pos, horizontal) {
if (container.scrollTo) {
if (horizontal) {
container.scrollTo(pos, 0);
} else {
container.scrollTo(0, pos);
}
} else {
if (horizontal) {
container.scrollLeft = Math.round(pos);
} else {
container.scrollTop = Math.round(pos);
}
}
}
var lastGridScroll = 0;
var lastHeaderScroll = 0;
function onProgramGridScroll(context, elem, timeslotHeaders) {
if ((new Date().getTime() - lastHeaderScroll) >= 1000) {
lastGridScroll = new Date().getTime();
nativeScrollTo(timeslotHeaders, elem.scrollLeft, true);
}
}
function onTimeslotHeadersScroll(context, elem, programGrid) {
if ((new Date().getTime() - lastGridScroll) >= 1000) {
lastHeaderScroll = new Date().getTime();
nativeScrollTo(programGrid, elem.scrollLeft, true);
}
}
function getFutureDateText(date) {
var weekday = [];
weekday[0] = globalize.translate('core#OptionSundayShort');
weekday[1] = globalize.translate('core#OptionMondayShort');
weekday[2] = globalize.translate('core#OptionTuesdayShort');
weekday[3] = globalize.translate('core#OptionWednesdayShort');
weekday[4] = globalize.translate('core#OptionThursdayShort');
weekday[5] = globalize.translate('core#OptionFridayShort');
weekday[6] = globalize.translate('core#OptionSaturdayShort');
var day = weekday[date.getDay()];
date = date.toLocaleDateString();
if (date.toLowerCase().indexOf(day.toLowerCase()) == -1) {
return day + " " + date;
}
return date;
}
function changeDate(page, date) {
var newStartDate = normalizeDateToTimeslot(date);
currentDate = newStartDate;
reloadGuide(page, newStartDate);
var text = getFutureDateText(date);
text = '<span class="guideCurrentDay">' + text.replace(' ', ' </span>');
page.querySelector('.btnSelectDate').innerHTML = text;
}
var dateOptions = [];
function setDateRange(page, guideInfo) {
var today = new Date();
today.setHours(today.getHours(), 0, 0, 0);
var start = datetime.parseISO8601Date(guideInfo.StartDate, { toLocal: true });
var end = datetime.parseISO8601Date(guideInfo.EndDate, { toLocal: true });
start.setHours(0, 0, 0, 0);
end.setHours(0, 0, 0, 0);
if (start.getTime() >= end.getTime()) {
end.setDate(start.getDate() + 1);
}
start = new Date(Math.max(today, start));
dateOptions = [];
while (start <= end) {
dateOptions.push({
name: getFutureDateText(start),
id: start.getTime()
});
start.setDate(start.getDate() + 1);
start.setHours(0, 0, 0, 0);
}
var date = new Date();
if (currentDate) {
date.setTime(currentDate.getTime());
}
changeDate(page, date);
}
function reloadPage(page) {
showLoading();
var apiClient = connectionManager.currentApiClient();
apiClient.getLiveTvGuideInfo().then(function (guideInfo) {
setDateRange(page, guideInfo);
});
}
function selectDate(page) {
require(['actionsheet'], function (actionsheet) {
actionsheet.show({
items: dateOptions,
title: globalize.translate('core#HeaderSelectDate'),
callback: function (id) {
var date = new Date();
date.setTime(parseInt(id));
changeDate(page, date);
}
});
});
}
function createVerticalScroller(view, pageInstance) {
if (layoutManager.tv) {
scrollHelper.centerFocus.on(view.querySelector('.smoothScrollY'), false);
var programGrid = view.querySelector('.programGrid');
scrollHelper.centerFocus.on(programGrid, true);
}
}
function parentWithClass(elem, className) {
while (!elem.classList || !elem.classList.contains(className)) {
elem = elem.parentNode;
if (!elem) {
return null;
}
}
return elem;
}
var selectedMediaInfoTimeout;
var focusedElement;
function onProgramGridFocus(e) {
var programCell = parentWithClass(e.target, 'programCell');
if (!programCell) {
return;
}
focusedElement = e.target;
if (selectedMediaInfoTimeout) {
clearTimeout(selectedMediaInfoTimeout);
}
selectedMediaInfoTimeout = setTimeout(onSelectedMediaInfoTimeout, 700);
}
function onSelectedMediaInfoTimeout() {
var focused = focusedElement
if (focused && document.activeElement == focused) {
var id = focused.getAttribute('data-id');
var item = items[id];
if (item) {
events.trigger(self, 'focus', [
{
item: item
}]);
}
}
}
var xhr = new XMLHttpRequest();
xhr.open('GET', baseUrl + '/tvguide.template.html', true);
xhr.onload = function (e) {
var template = this.response;
var context = options.element;
context.innerHTML = globalize.translateDocument(template, 'core');
var programGrid = context.querySelector('.programGrid');
var timeslotHeaders = context.querySelector('.timeslotHeaders');
programGrid.addEventListener('focus', onProgramGridFocus, true);
programGrid.addEventListener('scroll', function () {
onProgramGridScroll(context, this, timeslotHeaders);
});
timeslotHeaders.addEventListener('scroll', function () {
onTimeslotHeadersScroll(context, this, programGrid);
});
context.querySelector('.btnSelectDate').addEventListener('click', function () {
selectDate(context);
});
context.querySelector('.btnUnlockGuide').addEventListener('click', function () {
reloadPage(context);
});
context.classList.add('tvguide');
createVerticalScroller(context, self);
itemShortcuts.on(context);
events.trigger(self, 'load');
self.refresh();
}
xhr.send();
};
Guide.setBaseUrl = function (url) {
baseUrl = url;
};
return Guide;
});

View file

@ -0,0 +1,42 @@
<!--
Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<!--
`iron-icons` is a utility import that includes the definition for the `iron-icon` element, `iron-iconset-svg` element, as well as an import for the default icon set.
The `iron-icons` directory also includes imports for additional icon sets that can be loaded into your project.
Example loading icon set:
<link rel="import" href="../iron-icons/maps-icons.html">
To use an icon from one of these sets, first prefix your `iron-icon` with the icon set name, followed by a colon, ":", and then the icon id.
Example using the directions-bus icon from the maps icon set:
<iron-icon icon="maps:directions-bus"></iron-icon>
See [iron-icon](#iron-icon) for more information about working with icons.
See [iron-iconset](#iron-iconset) and [iron-iconset-svg](#iron-iconset-svg) for more information about how to create a custom iconset.
@group Iron Elements
@element iron-icons
@demo demo/index.html
-->
<iron-iconset-svg name="guide" size="24">
<svg>
<defs>
<g id="fiber-manual-record"><circle cx="12" cy="12" r="8" /></g>
<g id="fiber-smart-record"><g><circle cx="9" cy="12" r="8" /><path d="M17 4.26v2.09c2.33.82 4 3.04 4 5.65s-1.67 4.83-4 5.65v2.09c3.45-.89 6-4.01 6-7.74s-2.55-6.85-6-7.74z" /></g></g>
<g id="hd"><path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-8 12H9.5v-2h-2v2H6V9h1.5v2.5h2V9H11v6zm2-6h4c.55 0 1 .45 1 1v4c0 .55-.45 1-1 1h-4V9zm1.5 4.5h2v-3h-2v3z" /></g>
</defs>
</svg>
</iron-iconset-svg>

View file

@ -0,0 +1,22 @@
<div class="tvGuideHeader">
<div class="channelTimeslotHeader">
<button class="btnSelectDate clearButton" style="display:block;"></button>
</div>
<div class="timeslotHeaders smoothScrollX" style="scroll-behavior: auto;"></div>
</div>
<div class="smoothScrollY guideVerticalScroller" style="flex-grow: 1;">
<div class="programContainer">
<div class="channelList"></div>
<div class="programGridContainer programGrid smoothScrollX" style="white-space: nowrap;">
</div>
</div>
</div>
<div class="guideRequiresUnlock readOnlyContent hide" style="margin:1em auto;text-align:center;padding:1em;flex-shrink:0;">
<p class="unlockText"></p>
<paper-button raised class="secondary block btnUnlockGuide"><iron-icon icon="check"></iron-icon><span>${ButtonUnlockGuide}</span></paper-button>
</div>

View file

@ -271,17 +271,17 @@ define(['loading', 'viewManager', 'skinManager', 'pluginManager', 'backdrop', 'b
var apiClient = connectionManager.currentApiClient();
var pathname = ctx.pathname.toLowerCase();
console.log('Emby.Page - processing path request ' + pathname);
console.log('embyRouter - processing path request ' + pathname);
if ((!apiClient || !apiClient.isLoggedIn()) && !route.anonymous) {
console.log('Emby.Page - route does not allow anonymous access, redirecting to login');
console.log('embyRouter - route does not allow anonymous access, redirecting to login');
beginConnectionWizard();
return;
}
if (apiClient && apiClient.isLoggedIn()) {
console.log('Emby.Page - user is authenticated');
console.log('embyRouter - user is authenticated');
var isCurrentRouteStartup = currentRouteInfo ? currentRouteInfo.route.startup : true;
if (ctx.isBack && (route.isDefaultRoute || route.startup) && !isCurrentRouteStartup) {
@ -289,7 +289,7 @@ define(['loading', 'viewManager', 'skinManager', 'pluginManager', 'backdrop', 'b
return;
}
else if (route.isDefaultRoute) {
console.log('Emby.Page - loading skin home page');
console.log('embyRouter - loading skin home page');
skinManager.loadUserSkin();
return;
} else if (route.roles) {
@ -303,7 +303,7 @@ define(['loading', 'viewManager', 'skinManager', 'pluginManager', 'backdrop', 'b
}
}
console.log('Emby.Page - proceeding to ' + pathname);
console.log('embyRouter - proceeding to ' + pathname);
callback();
}
@ -484,8 +484,10 @@ define(['loading', 'viewManager', 'skinManager', 'pluginManager', 'backdrop', 'b
function showItem(item) {
if (typeof (item) === 'string') {
Emby.Models.item(item).then(showItem);
require(['connectionManager'], function (connectionManager) {
var apiClient = connectionManager.currentApiClient();
apiClient.getItem(apiClient.getCurrentUserId(), item).then(showItem);
});
} else {
skinManager.getCurrentSkin().showItem(item);
}

View file

@ -0,0 +1,168 @@
define(['playbackManager', 'inputManager', 'connectionManager', 'embyRouter'], function (playbackManager, inputManager, connectionManager, embyRouter) {
function playAllFromHere(card, serverId) {
var cards = card.parentNode.querySelectorAll('.itemAction[data-id]');
var ids = [];
var foundCard = false;
for (var i = 0, length = cards.length; i < length; i++) {
if (cards[i] == card) {
foundCard = true;
}
if (foundCard) {
ids.push(cards[i].getAttribute('data-id'));
}
}
playbackManager.play({
ids: ids,
serverId: serverId
});
}
function showSlideshow(startItemId, serverId) {
var apiClient = connectionManager.getApiClient(serverId);
var userId = apiClient.getCurrentUserId();
return apiClient.getItem(userId, startItemId).then(function (item) {
return apiClient.getItems(userId, {
MediaTypes: 'Photo',
Filters: 'IsNotFolder',
ParentId: item.ParentId
}).then(function (result) {
var items = result.Items;
var index = items.map(function (i) {
return i.Id;
}).indexOf(startItemId);
if (index == -1) {
index = 0;
}
require(['slideshow'], function (slideshow) {
var newSlideShow = new slideshow({
showTitle: false,
cover: false,
items: items,
startIndex: index,
interval: 8000,
interactive: true
});
newSlideShow.show();
});
});
});
}
function showItem(options) {
if (options.Type == 'Photo') {
showSlideshow(options.Id, options.ServerId);
return;
}
embyRouter.showItem(options);
}
function executeAction(card, action) {
var id = card.getAttribute('data-id');
var serverId = card.getAttribute('data-serverid');
var type = card.getAttribute('data-type');
var isfolder = card.getAttribute('data-isfolder') == 'true';
if (action == 'link') {
showItem({
Id: id,
Type: type,
IsFolder: isfolder,
ServerId: serverId
});
}
else if (action == 'instantmix') {
playbackManager.instantMix(id, serverId);
}
else if (action == 'play') {
var startPositionTicks = parseInt(card.getAttribute('data-startpositionticks') || '0');
playbackManager.play({
ids: [id],
startPositionTicks: startPositionTicks,
serverId: serverId
});
}
else if (action == 'playallfromhere') {
playAllFromHere(card, serverId);
}
else if (action == 'setplaylistindex') {
}
}
function onClick(e) {
var card = parentWithClass(e.target, 'itemAction');
if (card) {
var action = card.getAttribute('data-action');
if (action) {
executeAction(card, action);
}
}
}
function parentWithClass(elem, className) {
while (!elem.classList || !elem.classList.contains(className)) {
elem = elem.parentNode;
if (!elem) {
return null;
}
}
return elem;
}
function onCommand(e) {
var cmd = e.detail.command;
if (cmd == 'play') {
var card = parentWithClass(e.target, 'itemAction');
if (card) {
executeAction(card, cmd);
}
}
}
function on(context) {
context.addEventListener('click', onClick);
inputManager.on(context, onCommand);
}
function off(context) {
context.removeEventListener('click', onClick);
inputManager.off(context, onCommand);
}
return {
on: on,
off: off
};
});

View file

@ -1,6 +1,6 @@
{
"name": "iron-overlay-behavior",
"version": "1.6.3",
"version": "1.6.4",
"license": "http://polymer.github.io/LICENSE.txt",
"description": "Provides a behavior for making an element an overlay",
"private": true,
@ -35,11 +35,11 @@
},
"ignore": [],
"homepage": "https://github.com/polymerelements/iron-overlay-behavior",
"_release": "1.6.3",
"_release": "1.6.4",
"_resolution": {
"type": "version",
"tag": "v1.6.3",
"commit": "5b331ebaefe3214937b94ba19769154efee46244"
"tag": "v1.6.4",
"commit": "983654132fd8281c3da07d79eea8a0f5b28e7a4f"
},
"_source": "git://github.com/polymerelements/iron-overlay-behavior.git",
"_target": "^1.0.0",

View file

@ -1,6 +1,6 @@
{
"name": "iron-overlay-behavior",
"version": "1.6.3",
"version": "1.6.4",
"license": "http://polymer.github.io/LICENSE.txt",
"description": "Provides a behavior for making an element an overlay",
"private": true,

View file

@ -113,7 +113,9 @@ context. You should place this element as a child of `<body>` whenever possible.
},
/**
* Returns the reason this dialog was last closed.
* Contains the reason(s) this overlay was last closed (see `iron-overlay-closed`).
* `IronOverlayBehavior` provides the `canceled` reason; implementers of the
* behavior can provide other reasons in addition to `canceled`.
*/
closingReason: {
// was a getter before, but needs to be a property so other
@ -322,16 +324,23 @@ context. You should place this element as a child of `<body>` whenever possible.
this._manager.addOrRemoveOverlay(this);
this.__isAnimating = true;
// requestAnimationFrame for non-blocking rendering
if (this.__openChangedAsync) {
window.cancelAnimationFrame(this.__openChangedAsync);
}
// Defer any animation-related code on attached
// (_openedChanged gets called again on attached).
if (!this.isAttached) {
return;
}
this.__isAnimating = true;
if (this.opened) {
if (this.withBackdrop) {
this.backdropElement.prepare();
}
// requestAnimationFrame for non-blocking rendering
this.__openChangedAsync = window.requestAnimationFrame(function() {
this.__openChangedAsync = null;
this._prepareRenderOpened();
@ -574,24 +583,26 @@ context. You should place this element as a child of `<body>` whenever possible.
Polymer.IronOverlayBehavior = [Polymer.IronFitBehavior, Polymer.IronResizableBehavior, Polymer.IronOverlayBehaviorImpl];
/**
* Fired after the `iron-overlay` opens.
* @event iron-overlay-opened
*/
* Fired after the overlay opens.
* @event iron-overlay-opened
*/
/**
* Fired when the `iron-overlay` is canceled, but before it is closed.
* Cancel the event to prevent the `iron-overlay` from closing.
* @event iron-overlay-canceled
* @param {Event} event The closing of the `iron-overlay` can be prevented
* by calling `event.preventDefault()`. The `event.detail` is the original event that originated
* the canceling (e.g. ESC keyboard event or click event outside the `iron-overlay`).
*/
* Fired when the overlay is canceled, but before it is closed.
* @event iron-overlay-canceled
* @param {Event} event The closing of the overlay can be prevented
* by calling `event.preventDefault()`.
* @param {Event} event.detail It is the original event that originated
* the canceling (e.g. ESC keyboard event or click event outside the overlay).
*/
/**
* Fired after the `iron-overlay` closes.
* @event iron-overlay-closed
* @param {{canceled: (boolean|undefined)}} closingReason Contains `canceled` (whether the overlay was canceled).
*/
* Fired after the overlay closes.
* @event iron-overlay-closed
* @param {Event} event The event
* @param {Object} event.detail It is the `closingReason` property (contains
* `canceled`, whether the overlay was canceled).
*/
})();
</script>

View file

@ -339,6 +339,12 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
var overlay = /** @type {?} */ (this.currentOverlay());
// Check if clicked outside of top overlay.
if (overlay && this._overlayInPath(Polymer.dom(event).path) !== overlay) {
if (overlay.withBackdrop) {
// There's no need to stop the propagation as the backdrop element
// already got this mousedown/touchstart event. Calling preventDefault
// on this event ensures that click/tap won't be triggered at all.
event.preventDefault();
}
overlay._onCaptureClick(event);
}
},

View file

@ -155,6 +155,21 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
assert.equal(getComputedStyle(overlay).display, 'none', 'overlay starts hidden');
});
test('_renderOpened called only after is attached', function(done) {
var overlay = document.createElement('test-overlay');
// The overlay is ready at this point, but not yet attached.
var spy = sinon.spy(overlay, '_renderOpened');
// This triggers _openedChanged.
overlay.opened = true;
// Even if not attached yet, overlay should be the current overlay!
assert.equal(overlay, overlay._manager.currentOverlay(), 'currentOverlay ok');
// Wait long enough for requestAnimationFrame callback.
overlay.async(function() {
assert.isFalse(spy.called, '_renderOpened not called');
done();
}, 100);
});
test('overlay open/close events', function(done) {
var nevents = 0;
@ -751,6 +766,27 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
done();
});
});
test('withBackdrop = true prevents click outside event', function(done) {
runAfterOpen(overlay, function() {
overlay.addEventListener('iron-overlay-canceled', function(event) {
assert.isTrue(event.detail.defaultPrevented, 'click event prevented');
done();
});
MockInteractions.tap(document.body);
});
});
test('withBackdrop = false does not prevent click outside event', function(done) {
overlay.withBackdrop = false;
runAfterOpen(overlay, function() {
overlay.addEventListener('iron-overlay-canceled', function(event) {
assert.isFalse(event.detail.defaultPrevented, 'click event not prevented');
done();
});
MockInteractions.tap(document.body);
});
});
});
suite('multiple overlays', function() {

View file

@ -1,6 +1,6 @@
{
"name": "iron-validatable-behavior",
"version": "1.0.5",
"version": "1.1.0",
"description": "Provides a behavior for an element that validates user input",
"authors": "The Polymer Authors",
"keywords": [
@ -9,9 +9,7 @@
"iron",
"behavior"
],
"main": [
"iron-validatable-behavior.html"
],
"main": "iron-validatable-behavior.html",
"private": true,
"repository": {
"type": "git",
@ -29,14 +27,14 @@
"iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
"iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
"test-fixture": "PolymerElements/test-fixture#^1.0.0",
"web-component-tester": "*",
"web-component-tester": "^4.0.0",
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
},
"_release": "1.0.5",
"_release": "1.1.0",
"_resolution": {
"type": "version",
"tag": "v1.0.5",
"commit": "c1334b835892b3d7a329a8e6b8741d4be3a8d99c"
"tag": "v1.1.0",
"commit": "01ed585b28d8ab41367518f9aebd8442b9166bfe"
},
"_source": "git://github.com/PolymerElements/iron-validatable-behavior.git",
"_target": "^1.0.0",

View file

@ -0,0 +1,33 @@
<!-- Instructions: https://github.com/PolymerElements/iron-validatable-behavior/CONTRIBUTING.md#filing-issues -->
### Description
<!-- Example: The `paper-foo` element causes the page to turn pink when clicked. -->
### Expected outcome
<!-- Example: The page stays the same color. -->
### Actual outcome
<!-- Example: The page turns pink. -->
### Live Demo
<!-- Example: https://jsbin.com/cagaye/edit?html,output -->
### Steps to reproduce
<!-- Example
1. Put a `paper-foo` element in the page.
2. Open the page in a web browser.
3. Click the `paper-foo` element.
-->
### Browsers Affected
<!-- Check all that apply -->
- [ ] Chrome
- [ ] Firefox
- [ ] Safari 9
- [ ] Safari 8
- [ ] Safari 7
- [ ] Edge
- [ ] IE 11
- [ ] IE 10

View file

@ -0,0 +1,23 @@
language: node_js
sudo: required
before_script:
- npm install -g bower polylint web-component-tester
- bower install
- polylint
env:
global:
- secure: AsXK1s4viLG4eumYMxE0bJasVbWrpQ7JaUboMoK4Nzhmunx01udikRRAJifl3nkcc4m2GpzCb4Kmtyh5hxyLA05uE416VzmfDq3dGJKsNAQXbSescSVik63llq4HXAdOvek2eSo5wOVGNHslscIed5K2bJajXfPMIODJyBxo8aE=
- secure: V/H/0+/R8owujbwe3IDbND8v5zs4pWTe0hRCLefjgR9ci2lmNNP54Zb97nOZnLQqynafDSyrngL3+RP5F0fk1dC++cpuxQNKoYPwDFPZ41LAxp5dgtyxkb+J4eWtq0UilWF5thVt4oB1OWwPGtxMmSl+imXXKtq4a4Ov++t2Apo=
node_js: stable
addons:
firefox: latest
apt:
sources:
- google-chrome
packages:
- google-chrome-stable
sauce_connect: true
script:
- xvfb-run wct
- "if [ \"${TRAVIS_PULL_REQUEST}\" = \"false\" ]; then wct -s 'default'; fi"
dist: trusty

View file

@ -0,0 +1,77 @@
<!--
This file is autogenerated based on
https://github.com/PolymerElements/ContributionGuide/blob/master/CONTRIBUTING.md
If you edit that file, it will get updated everywhere else.
If you edit this file, your changes will get overridden :)
You can however override the jsbin link with one that's customized to this
specific element:
jsbin=https://jsbin.com/cagaye/edit?html,output
-->
# Polymer Elements
## Guide for Contributors
Polymer Elements are built in the open, and the Polymer authors eagerly encourage any and all forms of community contribution. When contributing, please follow these guidelines:
### Filing Issues
**If you are filing an issue to request a feature**, please provide a clear description of the feature. It can be helpful to describe answers to the following questions:
1. **Who will use the feature?** _“As someone filling out a form…”_
2. **When will they use the feature?** _“When I enter an invalid value…”_
3. **What is the users goal?** _“I want to be visually notified that the value needs to be corrected…”_
**If you are filing an issue to report a bug**, please provide:
1. **A clear description of the bug and related expectations.** Consider using the following example template for reporting a bug:
```markdown
The `paper-foo` element causes the page to turn pink when clicked.
## Expected outcome
The page stays the same color.
## Actual outcome
The page turns pink.
## Steps to reproduce
1. Put a `paper-foo` element in the page.
2. Open the page in a web browser.
3. Click the `paper-foo` element.
```
2. **A reduced test case that demonstrates the problem.** If possible, please include the test case as a JSBin. Start with this template to easily import and use relevant Polymer Elements: [https://jsbin.com/cagaye/edit?html,output](https://jsbin.com/cagaye/edit?html,output).
3. **A list of browsers where the problem occurs.** This can be skipped if the problem is the same across all browsers.
### Submitting Pull Requests
**Before creating a pull request**, please ensure that an issue exists for the corresponding change in the pull request that you intend to make. **If an issue does not exist, please create one per the guidelines above**. The goal is to discuss the design and necessity of the proposed change with Polymer authors and community before diving into a pull request.
When submitting pull requests, please provide:
1. **A reference to the corresponding issue** or issues that will be closed by the pull request. Please refer to these issues in the pull request description using the following syntax:
```markdown
(For a single issue)
Fixes #20
(For multiple issues)
Fixes #32, fixes #40
```
2. **A succinct description of the design** used to fix any related issues. For example:
```markdown
This fixes #20 by removing styles that leaked which would cause the page to turn pink whenever `paper-foo` is clicked.
```
3. **At least one test for each bug fixed or feature added** as part of the pull request. Pull requests that fix bugs or add features without accompanying tests will not be considered.
If a proposed change contains multiple commits, please [squash commits](https://www.google.com/url?q=http://blog.steveklabnik.com/posts/2012-11-08-how-to-squash-commits-in-a-github-pull-request) to as few as is necessary to succinctly express the change. A Polymer author can help you squash commits, so dont be afraid to ask us if you need help with that!

View file

@ -1,6 +1,6 @@
{
"name": "iron-validatable-behavior",
"version": "1.0.5",
"version": "1.1.0",
"description": "Provides a behavior for an element that validates user input",
"authors": "The Polymer Authors",
"keywords": [
@ -9,9 +9,7 @@
"iron",
"behavior"
],
"main": [
"iron-validatable-behavior.html"
],
"main": "iron-validatable-behavior.html",
"private": true,
"repository": {
"type": "git",
@ -29,7 +27,7 @@
"iron-component-page": "PolymerElements/iron-component-page#^1.0.0",
"iron-validator-behavior": "PolymerElements/iron-validator-behavior#^1.0.0",
"test-fixture": "PolymerElements/test-fixture#^1.0.0",
"web-component-tester": "*",
"web-component-tester": "^4.0.0",
"webcomponentsjs": "webcomponents/webcomponentsjs#^0.7.0"
}
}

View file

@ -12,6 +12,10 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
<link rel="import" href="../iron-meta/iron-meta.html">
<script>
/**
* Singleton IronMeta instance.
*/
Polymer.IronValidatableBehaviorMeta = null;
/**
* `Use Polymer.IronValidatableBehavior` to implement an element that validates user input.
@ -41,14 +45,6 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
properties: {
/**
* Namespace for this validator.
*/
validatorType: {
type: String,
value: 'validator'
},
/**
* Name of the validator to use.
*/
@ -66,22 +62,35 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
value: false
},
/**
* This property is deprecated and should not be used. Use the global
* validator meta singleton, `Polymer.IronValidatableBehaviorMeta` instead.
*/
_validatorMeta: {
type: Object
}
},
/**
* Namespace for this validator. This property is deprecated and should
* not be used. For all intents and purposes, please consider it a
* read-only, config-time property.
*/
validatorType: {
type: String,
value: 'validator'
},
_validator: {
computed: '__computeValidator(validator)'
}
},
observers: [
'_invalidChanged(invalid)'
],
get _validator() {
return this._validatorMeta && this._validatorMeta.byKey(this.validator);
},
ready: function() {
this._validatorMeta = new Polymer.IronMeta({type: this.validatorType});
registered: function() {
Polymer.IronValidatableBehaviorMeta = new Polymer.IronMeta({type: 'validator'});
},
_invalidChanged: function() {
@ -128,6 +137,11 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
return this._validator.validate(value);
}
return true;
},
__computeValidator: function() {
return Polymer.IronValidatableBehaviorMeta &&
Polymer.IronValidatableBehaviorMeta.byKey(this.validator);
}
};

View file

@ -0,0 +1,30 @@
<!--
@license
Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<link rel="import" href="../../polymer/polymer.html">
<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
<script>
Polymer({
is: 'cats-only',
behaviors: [
Polymer.IronValidatorBehavior
],
validate: function(value) {
return value === 'cats';
}
});
</script>

View file

@ -0,0 +1,30 @@
<!--
@license
Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<link rel="import" href="../../polymer/polymer.html">
<link rel="import" href="../../iron-validator-behavior/iron-validator-behavior.html">
<script>
Polymer({
is: 'dogs-only',
behaviors: [
Polymer.IronValidatorBehavior
],
validate: function(value) {
return value === 'dogs';
}
});
</script>

View file

@ -1,5 +1,4 @@
<!doctype html>
<!--
<!DOCTYPE html><!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
@ -7,11 +6,9 @@ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
Code distributed by Google as part of the polymer project is also
subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
-->
<html>
<head>
--><html><head>
<title>paper-validatable-behavior tests</title>
<title>iron-validatable-behavior tests</title>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
@ -23,13 +20,13 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
<body>
<script>
/* no tests */
WCT.loadSuites([
'iron-validatable-behavior.html'
'iron-validatable-behavior.html',
'iron-validatable-behavior.html?dom=shadow'
]);
</script>
</body>
</html>
</body></html>

View file

@ -1,5 +1,6 @@
<!doctype html>
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
@ -23,6 +24,8 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
<link rel="import" href="../../test-fixture/test-fixture.html">
<link rel="import" href="test-validatable.html">
<link rel="import" href="cats-only.html">
<link rel="import" href="dogs-only.html">
</head>
<body>
@ -33,6 +36,14 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
</template>
</test-fixture>
<test-fixture id="validators">
<template>
<cats-only></cats-only>
<dogs-only></dogs-only>
<test-validatable></test-validatable>
</template>
</test-fixture>
<script>
suite('basic', function() {
@ -51,6 +62,25 @@ subject to an additional IP rights grant found at http://polymer.github.io/PATEN
assert.isTrue(valid);
});
test('changing the validator works', function() {
var node = fixture('validators');
var input = node[2];
// Initially there's no validator, so everything is valid.
assert.isTrue(input.validate(''));
assert.isTrue(input.validate('cats'));
// Only valid if the value is 'cats'.
input.validator = 'cats-only';
assert.isFalse(input.validate('ca'));
assert.isTrue(input.validate('cats'));
// Only valid if the value is 'dogs'.
input.validator = 'dogs-only';
assert.isFalse(input.validate('cats'));
assert.isTrue(input.validate('dogs'));
});
});
</script>

View file

@ -1,4 +1,5 @@
<!--
@license
Copyright (c) 2015 The Polymer Project Authors. All rights reserved.
This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt

View file

@ -45,7 +45,7 @@
"tag": "v1.0.11",
"commit": "e3c1ab0c72905b58fb4d9adc2921ea73b5c085a5"
},
"_source": "git://github.com/PolymerElements/paper-behaviors.git",
"_source": "git://github.com/polymerelements/paper-behaviors.git",
"_target": "^1.0.0",
"_originalSource": "PolymerElements/paper-behaviors"
"_originalSource": "polymerelements/paper-behaviors"
}

View file

@ -32,14 +32,14 @@
"iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0"
},
"ignore": [],
"homepage": "https://github.com/PolymerElements/paper-ripple",
"homepage": "https://github.com/polymerelements/paper-ripple",
"_release": "1.0.5",
"_resolution": {
"type": "version",
"tag": "v1.0.5",
"commit": "d72e7a9a8ab518b901ed18dde492df3b87a93be5"
},
"_source": "git://github.com/PolymerElements/paper-ripple.git",
"_source": "git://github.com/polymerelements/paper-ripple.git",
"_target": "^1.0.0",
"_originalSource": "PolymerElements/paper-ripple"
"_originalSource": "polymerelements/paper-ripple"
}

View file

@ -1,4 +1,4 @@
<div id="cinemaModeConfigurationPage" data-role="page" class="page type-interior playbackConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Cinema-Mode" data-require="scripts/cinemamodeconfiguration,paper-checkbox,paper-input">
<div id="cinemaModeConfigurationPage" data-role="page" class="page type-interior playbackConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Cinema-Mode" data-require="scripts/cinemamodeconfiguration,paper-checkbox,paper-input,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,519 +0,0 @@
define(['jQuery', 'livetvcss', 'scripts/livetvcomponents', 'scrollStyles'], function ($) {
return function (options) {
var self = this;
self.refresh = function () {
reloadPage(options.element);
};
// 30 mins
var cellCurationMinutes = 30;
var cellDurationMs = cellCurationMinutes * 60 * 1000;
var msPerDay = 86400000;
var currentDate;
var defaultChannels = browserInfo.mobile ? 50 : 100;
var channelLimit = 1000;
var channelQuery = {
StartIndex: 0,
Limit: defaultChannels,
EnableFavoriteSorting: true
};
var channelsPromise;
function normalizeDateToTimeslot(date) {
var minutesOffset = date.getMinutes() - cellCurationMinutes;
if (minutesOffset >= 0) {
date.setHours(date.getHours(), cellCurationMinutes, 0, 0);
} else {
date.setHours(date.getHours(), 0, 0, 0);
}
return date;
}
function reloadChannels(page) {
channelsPromise = null;
reloadGuide(page);
}
function reloadGuide(page) {
Dashboard.showLoadingMsg();
channelQuery.UserId = Dashboard.getCurrentUserId();
channelQuery.Limit = Math.min(channelQuery.Limit || defaultChannels, channelLimit);
channelQuery.AddCurrentProgram = false;
channelsPromise = channelsPromise || ApiClient.getLiveTvChannels(channelQuery);
var date = currentDate;
// Add one second to avoid getting programs that are just ending
date = new Date(date.getTime() + 1000);
// Subtract to avoid getting programs that are starting when the grid ends
var nextDay = new Date(date.getTime() + msPerDay - 2000);
console.log(nextDay);
channelsPromise.then(function (channelsResult) {
ApiClient.getLiveTvPrograms({
UserId: Dashboard.getCurrentUserId(),
MaxStartDate: nextDay.toISOString(),
MinEndDate: date.toISOString(),
channelIds: channelsResult.Items.map(function (c) {
return c.Id;
}).join(','),
ImageTypeLimit: 1,
EnableImages: false,
SortBy: "StartDate"
}).then(function (programsResult) {
renderGuide(page, date, channelsResult.Items, programsResult.Items);
Dashboard.hideLoadingMsg();
LibraryBrowser.setLastRefreshed(page);
});
if (options.enablePaging !== false) {
var channelPagingHtml = LibraryBrowser.getQueryPagingHtml({
startIndex: channelQuery.StartIndex,
limit: channelQuery.Limit,
totalRecordCount: channelsResult.TotalRecordCount,
updatePageSizeSetting: false,
showLimit: true
});
var channelPaging = page.querySelector('.channelPaging');
channelPaging.innerHTML = channelPagingHtml;
$(channelPaging);
}
page.querySelector('.btnNextPage').addEventListener('click', function () {
channelQuery.StartIndex += channelQuery.Limit;
reloadChannels(page);
});
page.querySelector('.btnPreviousPage').addEventListener('click', function () {
channelQuery.StartIndex -= channelQuery.Limit;
reloadChannels(page);
});
page.querySelector('#selectPageSize').addEventListener('change', function () {
channelQuery.Limit = parseInt(this.value);
channelQuery.StartIndex = 0;
reloadChannels(page);
});
});
}
function getTimeslotHeadersHtml(startDate, endDateTime) {
var html = '';
// clone
startDate = new Date(startDate.getTime());
html += '<div class="timeslotHeadersInner">';
while (startDate.getTime() < endDateTime) {
html += '<div class="timeslotHeader">';
html += '<div class="timeslotHeaderInner">';
html += LibraryBrowser.getDisplayTime(startDate);
html += '</div>';
html += '</div>';
// Add 30 mins
startDate.setTime(startDate.getTime() + cellDurationMs);
}
html += '</div>';
return html;
}
function parseDates(program) {
if (!program.StartDateLocal) {
try {
program.StartDateLocal = parseISO8601Date(program.StartDate, { toLocal: true });
} catch (err) {
}
}
if (!program.EndDateLocal) {
try {
program.EndDateLocal = parseISO8601Date(program.EndDate, { toLocal: true });
} catch (err) {
}
}
return null;
}
function getChannelProgramsHtml(page, date, channel, programs) {
var html = '';
var startMs = date.getTime();
var endMs = startMs + msPerDay - 1;
programs = programs.filter(function (curr) {
return curr.ChannelId == channel.Id;
});
html += '<div class="channelPrograms">';
for (var i = 0, length = programs.length; i < length; i++) {
var program = programs[i];
if (program.ChannelId != channel.Id) {
continue;
}
parseDates(program);
if (program.EndDateLocal.getTime() < startMs) {
continue;
}
if (program.StartDateLocal.getTime() > endMs) {
break;
}
var renderStartMs = Math.max(program.StartDateLocal.getTime(), startMs);
var startPercent = (program.StartDateLocal.getTime() - startMs) / msPerDay;
startPercent *= 100;
startPercent = Math.max(startPercent, 0);
var renderEndMs = Math.min(program.EndDateLocal.getTime(), endMs);
var endPercent = (renderEndMs - renderStartMs) / msPerDay;
endPercent *= 100;
var cssClass = "programCell";
var addAccent = true;
if (program.IsKids) {
cssClass += " childProgramInfo";
} else if (program.IsSports) {
cssClass += " sportsProgramInfo";
} else if (program.IsNews) {
cssClass += " newsProgramInfo";
} else if (program.IsMovie) {
cssClass += " movieProgramInfo";
}
else {
cssClass += " plainProgramInfo";
addAccent = false;
}
html += '<a href="itemdetails.html?id=' + program.Id + '" class="' + cssClass + '" data-programid="' + program.Id + '" style="left:' + startPercent + '%;width:' + endPercent + '%;">';
html += '<div class="guideProgramName">';
html += program.Name;
html += '</div>';
html += '<div class="guideProgramTime">';
if (program.IsLive) {
html += '<span class="liveTvProgram">' + Globalize.translate('LabelLiveProgram') + '&nbsp;&nbsp;</span>';
}
else if (program.IsPremiere) {
html += '<span class="premiereTvProgram">' + Globalize.translate('LabelPremiereProgram') + '&nbsp;&nbsp;</span>';
}
else if (program.IsSeries && !program.IsRepeat) {
html += '<span class="newTvProgram">' + Globalize.translate('LabelNewProgram') + '&nbsp;&nbsp;</span>';
}
html += LibraryBrowser.getDisplayTime(program.StartDateLocal);
html += ' - ';
html += LibraryBrowser.getDisplayTime(program.EndDateLocal);
if (program.SeriesTimerId) {
html += '<div class="timerCircle seriesTimerCircle"></div>';
html += '<div class="timerCircle seriesTimerCircle"></div>';
html += '<div class="timerCircle seriesTimerCircle"></div>';
}
else if (program.TimerId) {
html += '<div class="timerCircle"></div>';
}
html += '</div>';
if (addAccent) {
html += '<div class="programAccent"></div>';
}
html += '</a>';
}
html += '</div>';
return html;
}
function renderPrograms(page, date, channels, programs) {
var html = [];
for (var i = 0, length = channels.length; i < length; i++) {
html.push(getChannelProgramsHtml(page, date, channels[i], programs));
}
var programGrid = page.querySelector('.programGrid');
programGrid.innerHTML = html.join('');
$(programGrid).scrollTop(0).scrollLeft(0);
}
function renderChannelHeaders(page, channels) {
var html = '';
for (var i = 0, length = channels.length; i < length; i++) {
var channel = channels[i];
html += '<div class="channelHeaderCellContainer">';
html += '<a class="channelHeaderCell" href="itemdetails.html?id=' + channel.Id + '">';
var hasChannelImage = channel.ImageTags.Primary;
var cssClass = hasChannelImage ? 'guideChannelInfo guideChannelInfoWithImage' : 'guideChannelInfo';
html += '<div class="' + cssClass + '">' + channel.Number + '</div>';
if (hasChannelImage) {
var url = ApiClient.getScaledImageUrl(channel.Id, {
maxHeight: 44,
maxWidth: 70,
tag: channel.ImageTags.Primary,
type: "Primary"
});
html += '<div class="guideChannelImage lazy" data-src="' + url + '"></div>';
} else {
html += '<div class="guideChannelName">' + channel.Name + '</div>';
}
html += '</a>';
html += '</div>';
}
var channelList = page.querySelector('.channelList');
channelList.innerHTML = html;
ImageLoader.lazyChildren(channelList);
}
function renderGuide(page, date, channels, programs) {
renderChannelHeaders(page, channels);
var startDate = date;
var endDate = new Date(startDate.getTime() + msPerDay);
page.querySelector('.timeslotHeaders').innerHTML = getTimeslotHeadersHtml(startDate, endDate);
renderPrograms(page, date, channels, programs);
}
var gridScrolling = false;
var headersScrolling = false;
function onProgramGridScroll(page, elem) {
if (!headersScrolling) {
gridScrolling = true;
$(page.querySelector('.timeslotHeaders')).scrollLeft($(elem).scrollLeft());
gridScrolling = false;
}
}
function onTimeslotHeadersScroll(page, elem) {
if (!gridScrolling) {
headersScrolling = true;
$(page.querySelector('.programGrid')).scrollLeft($(elem).scrollLeft());
headersScrolling = false;
}
}
function changeDate(page, date) {
currentDate = normalizeDateToTimeslot(date);
reloadGuide(page);
var text = LibraryBrowser.getFutureDateText(date);
text = '<span class="currentDay">' + text.replace(' ', ' </span>');
page.querySelector('.currentDate').innerHTML = text;
}
var dateOptions = [];
function setDateRange(page, guideInfo) {
var today = new Date();
today.setHours(today.getHours(), 0, 0, 0);
var start = parseISO8601Date(guideInfo.StartDate, { toLocal: true });
var end = parseISO8601Date(guideInfo.EndDate, { toLocal: true });
start.setHours(0, 0, 0, 0);
end.setHours(0, 0, 0, 0);
if (start.getTime() >= end.getTime()) {
end.setDate(start.getDate() + 1);
}
start = new Date(Math.max(today, start));
dateOptions = [];
while (start <= end) {
dateOptions.push({
name: LibraryBrowser.getFutureDateText(start),
id: start.getTime(),
ironIcon: 'today'
});
start.setDate(start.getDate() + 1);
start.setHours(0, 0, 0, 0);
}
var date = new Date();
if (currentDate) {
date.setTime(currentDate.getTime());
}
changeDate(page, date);
}
function reloadPageAfterValidation(page, limit) {
channelLimit = limit;
ApiClient.getLiveTvGuideInfo().then(function (guideInfo) {
setDateRange(page, guideInfo);
});
}
function reloadPage(page) {
$('.guideRequiresUnlock', page).hide();
RegistrationServices.validateFeature('livetv').then(function () {
Dashboard.showLoadingMsg();
reloadPageAfterValidation(page, 1000);
}, function () {
Dashboard.showLoadingMsg();
var limit = 5;
$('.guideRequiresUnlock', page).show();
$('.unlockText', page).html(Globalize.translate('MessageLiveTvGuideRequiresUnlock', limit));
reloadPageAfterValidation(page, limit);
});
}
function selectDate(page) {
require(['actionsheet'], function (actionsheet) {
actionsheet.show({
items: dateOptions,
showCancel: true,
title: Globalize.translate('HeaderSelectDate'),
callback: function (id) {
var date = new Date();
date.setTime(parseInt(id));
changeDate(page, date);
}
});
});
}
var xhr = new XMLHttpRequest();
xhr.open('GET', 'components/tvguide/tvguide.template.html', true);
xhr.onload = function (e) {
var template = this.response;
var tabContent = options.element;
tabContent.innerHTML = Globalize.translateDocument(template);
tabContent.querySelector('.programGrid').addEventListener('scroll', function (e) {
onProgramGridScroll(tabContent, e.target);
});
if (browserInfo.mobile) {
tabContent.querySelector('.tvGuide').classList.add('mobileGuide');
} else {
tabContent.querySelector('.tvGuide').classList.remove('mobileGuide');
tabContent.querySelector('.timeslotHeaders').addEventListener('scroll', function (e) {
onTimeslotHeadersScroll(tabContent, e.target);
});
}
if (AppInfo.enableHeadRoom && options.enableHeadRoom) {
requirejs(["headroom"], function () {
// construct an instance of Headroom, passing the element
var headroom = new Headroom(tabContent.querySelector('.tvGuideHeader'));
// initialise
headroom.init();
});
}
$('.btnUnlockGuide', tabContent).on('click', function () {
reloadPage(tabContent);
});
$('.btnSelectDate', tabContent).on('click', function () {
selectDate(tabContent);
});
self.refresh();
}
xhr.send();
};
});

View file

@ -1,19 +0,0 @@
<div class="tvGuide">
<div class="tvGuideHeader">
<div class="channelTimeslotHeader">
<div class="timeslotHeaderInner">
<a class="btnSelectDate" href="#" style="display:block;padding-left:5px;color:#fff;text-decoration:none;font-weight:normal!important;padding:5px 10px 4px 0;font-size:13px;"><iron-icon icon="schedule" style="margin-right:3px;width:18px;height:18px;"></iron-icon><span class="currentDate" style="vertical-align: middle;"></span></a>
</div>
</div>
<div class="timeslotHeaders smoothScrollX"></div>
</div>
<div class="programContainer">
<div class="channelList"></div>
<div class="programGrid smoothScrollX"></div>
</div>
<div class="channelPaging"></div>
</div>
<div class="guideRequiresUnlock readOnlyContent" style="margin:1em auto;text-align:center;display:none;padding:1em;">
<p class="unlockText"></p>
<paper-button raised class="secondary block btnUnlockGuide"><iron-icon icon="check"></iron-icon><span>${ButtonUnlockGuide}</span></paper-button>
</div>

View file

@ -1,4 +1,4 @@
<div id="connectLoginPage" data-role="page" class="page standalonePage connectLoginPage" data-theme="b" data-require="scripts/connectlogin,paper-input">
<div id="connectLoginPage" data-role="page" class="page standalonePage connectLoginPage" data-theme="b" data-require="scripts/connectlogin,paper-input,paper-button">
<div data-role="content">

View file

@ -66,14 +66,6 @@
padding-top: 10px;
}
.absolutePageTabContent {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
/*.pageWithAbsoluteTabs .pageTabContent {
padding-left: .5em !important;
padding-right: .5em !important;

View file

@ -11,11 +11,24 @@
}
.absolutePageTabContent {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1000;
margin: 0 !important;
width: 100% !important;
top: 98px !important;
/* Page needs to supply padding */
top: 92px !important;
transition: transform 200ms ease-out;
}
.absolutePageTabContent.headroomUnpinned {
transform: translateY(-92px);
bottom: -92px!important;
}
.sidebarDivider {
height: 1px;
background: #eaeaea;

View file

@ -1,421 +1,17 @@
.guideTabContent {
background: #161616;
}
.tvGuide {
text-align: left;
}
.tvGuideHeader {
white-space: nowrap;
position: fixed;
top: 95px;
left: 0;
z-index: 100;
max-width: 100%;
}
.neon-animating .tvGuideHeader {
position: static;
}
.tvGuideHeader.headroom--unpinned {
-webkit-transform: translateY(-98px);
transform: translateY(-98px);
}
.tvProgramSectionHeader {
margin: 0;
}
.tvProgram {
display: block;
text-decoration: none;
font-weight: normal !important;
white-space: nowrap;
position: relative;
}
.detailSectionHeader + .tvProgram {
border-top: 6px solid #161616;
margin-top: 1px;
}
.tvProgramTimeSlot {
width: 80px;
vertical-align: middle;
font-weight: bold;
color: #fff;
position: absolute;
top: 0;
left: 0;
bottom: 0;
border-bottom: 6px solid #161616;
}
.tvProgramTimeSlotInner {
padding: .5em;
}
.tvProgramInfo {
vertical-align: middle;
padding: .5em .5em;
border-bottom: 6px solid #161616;
}
.tvProgramTimeSlot + .tvProgramInfo {
margin-left: 80px;
border-left: 6px solid #161616;
position: relative;
}
.tvProgramCurrentTimeSlot {
background-color: green;
}
.tvProgramName {
color: #fff;
font-weight: bold;
margin-bottom: .5em;
}
.tvProgramTime {
color: #fff;
}
.newTvProgram {
color: #E88606;
}
.liveTvProgram {
color: #64A239;
}
.premiereTvProgram {
color: yellow;
}
.programAccent {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 2px;
}
.sportsProgramInfo .programAccent {
background-color: #0A7C33;
}
.newsProgramInfo .programAccent {
background-color: #523378;
}
.movieProgramInfo .programAccent {
background-color: #A43913;
}
.childProgramInfo .programAccent {
background-color: #0B487D;
}
.timerCircle {
display: inline-block;
width: 12px;
height: 12px;
border-radius: 50%;
background: #cc0000;
border: 1px solid #cc3333;
margin-left: 1em;
}
.seriesTimerCircle {
position: relative;
margin-left: 0;
left: 21px;
opacity: .3;
}
.itemMiscInfo .seriesTimerCircle:first-child {
margin-left: 1em;
}
.seriesTimerCircle + .seriesTimerCircle {
opacity: .65;
left: 0;
}
.seriesTimerCircle + .seriesTimerCircle + .seriesTimerCircle {
opacity: 1;
left: -21px;
}
.channelImageContainer .itemDetailImage {
max-width: 200px;
max-height: 110px;
margin-top: 1em;
margin-bottom: 1em;
}
.channelTimeslotHeader {
float: left;
}
.timeslotHeaders {
white-space: nowrap;
}
.mobileGuide .timeslotHeaders {
overflow-x: hidden;
}
.programContainer {
white-space: nowrap;
position: relative;
margin: 0 auto;
margin-top: 44px;
}
.mobileGuide .programContainer {
margin-top: 38px;
}
.channelPrograms {
white-space: nowrap;
height: 61px;
position: relative;
}
.channelPrograms, .timeslotHeadersInner {
width: 12000px;
}
.timeslotHeader {
display: inline-block;
}
.timeslotHeaderInner {
padding: .6em .35em .5em;
font-weight: 400;
}
.channelTimeslotHeader .timeslotHeaderInner {
padding-top: .4em;
}
.channelHeaderCell, .channelTimeslotHeader {
overflow: hidden;
text-overflow: ellipsis;
border-right: 1px solid #161616;
width: 199px;
background: #303030;
}
.channelHeaderCell {
border-bottom: 0 !important;
}
.channelHeaderCellContainer + .channelHeaderCellContainer .channelHeaderCell {
border-top: 6px solid #161616;
}
.channelTimeslotHeader {
border-right-color: #52B54B;
}
.channelTimeslotHeader, .timeslotHeader {
background: #52B54B;
}
.timeslotHeader, .channelTimeslotHeader {
height: 42px;
}
.channelHeaderCell {
padding: 0;
text-decoration: none;
font-weight: 400 !important;
color: #fff !important;
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.pointerInput .channelHeaderCell:hover {
background-color: #444;
}
.channelList {
float: left;
font-weight: 400;
}
.programGrid {
padding-bottom: 4px;
}
.programGrid, .timeslotHeaders {
margin-left: 200px;
}
.timeslotHeader {
width: 2.0833333333333333333333333333333%;
}
.programCell {
position: absolute;
top: 0;
bottom: 6px;
border-left: 6px solid #161616;
background-color: #212121;
display: block;
color: #fff !important;
text-decoration: none;
font-weight: 400 !important;
overflow: hidden;
}
.timeslotCellInner {
position: absolute;
bottom: 0;
overflow: hidden;
width: 100%;
top: 0;
display: block;
text-decoration: none;
font-weight: normal !important;
color: #fff !important;
}
.channelHeaderCell {
height: 55px;
}
.guideProgramName {
padding: .5em .5em .35em;
}
.guideProgramTime {
padding: 0 .5em .35em;
color: #bbb;
}
.guideChannelInfo {
display: inline-block;
max-width: 110px;
overflow: hidden;
white-space: nowrap;
margin-left: .5em;
margin-right: auto;
}
.guideChannelImage {
width: 70px;
height: 44px;
background-size: contain;
background-position: right center;
background-repeat: no-repeat;
margin-right: .5em;
}
.guideChannelName {
margin-right: .5em;
max-width: 50%;
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 1920px) {
.channelPrograms, .timeslotHeadersInner {
width: 10000px;
}
}
@media (max-width: 1600px) {
.channelPrograms, .timeslotHeadersInner {
width: 8000px;
}
}
@media (max-width: 600px) {
.guideChannelInfoWithImage {
display: none;
}
.timerPageImageContainer {
display: none !important;
}
.channelHeaderCell, .channelTimeslotHeader {
width: 98px;
}
.programGrid, .timeslotHeaders {
margin-left: 99px;
}
.currentDay {
display: none;
}
.channelPrograms, .timeslotHeadersInner {
width: 6500px;
}
.timeslotHeaderInner {
padding-top: .8em;
}
.channelTimeslotHeader a {
padding-left: 0 !important;
}
.channelTimeslotHeader i {
margin-right: 4px !important;
}
.channelTimeslotHeader .timeslotHeaderInner {
padding-top: .5em;
}
}
.channelList, .programGrid {
height: auto !important;
}
.itemOverlayContent {
width: 200px;
}
@media (min-width: 800px) {
.itemOverlayContent {
width: 300px;
}
.channelList, .timeslotHeaderInner {
font-size: 110%;
}
}
@media (min-width: 1000px) {
.itemOverlayContent {
width: 400px;
}
}
@media (min-width: 1200px) {
.itemOverlayContent {
width: 500px;
}
background: #121212;
}
.chkAdvanced {
margin-left: auto;
}
/* Allow vertical space for anything that slides up at the bottom */
.guideVerticalScroller {
padding-bottom: 160px;
}
.tvGuideHeader.headroom--unpinned {
-webkit-transform: none;
transform: none;
}

View file

@ -300,6 +300,10 @@ body {
height: 100%;
}
body.autoScrollY {
overflow-y: auto !important;
}
/* Without this, no content will be displayed in mobile safari */
.pageContainer {
overflow-x: visible !important;

View file

@ -1,4 +1,4 @@
<div id="dashboardPage" data-role="page" class="page type-interior dashboardHomePage" data-require="scripts/dashboardpage,humanedate,buttonenabled,paper-icon-item,paper-item-body,paper-fab,emby-collapsible">
<div id="dashboardPage" data-role="page" class="page type-interior dashboardHomePage" data-require="scripts/dashboardpage,humanedate,buttonenabled,paper-icon-item,paper-item-body,paper-fab,emby-collapsible,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="dashboardHostingPage" data-role="page" class="page type-interior advancedConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Hosting%20Settings" data-require="scripts/dashboardhosting,paper-checkbox,paper-input">
<div id="dashboardHostingPage" data-role="page" class="page type-interior advancedConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Hosting%20Settings" data-require="scripts/dashboardhosting,paper-checkbox,paper-input,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="devicePage" data-role="page" class="page type-interior devicesPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Devices" data-require="scripts/device,paper-input">
<div id="devicePage" data-role="page" class="page type-interior devicesPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Devices" data-require="scripts/device,paper-input,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -106,14 +106,6 @@
color: #52B54B !important;
}
.channelTimeslotHeader {
border-right-color: #52B54B !important;
}
.channelTimeslotHeader, .timeslotHeader {
background: #52B54B !important;
}
.libraryViewNav, paper-tabs {
font-size: 12px;
}
@ -126,18 +118,6 @@ h1, h1 a {
font-weight: 400;
}
.channelList {
font-weight: 400;
}
.channelHeaderCellInner {
font-weight: 400;
}
.tvGuideHeader {
top: 86px !important;
}
.libraryMenuButtonText {
font-weight: 500 !important;
position: absolute;
@ -188,18 +168,6 @@ div.cardBox {
background: #1c1c1c;
}
@media (min-width: 600px) {
/* This needs a little extra space to account for the longer date format */
.channelHeaderCell, .channelTimeslotHeader {
width: 209px;
}
.programGrid, .timeslotHeaders {
margin-left: 210px;
}
}
.bottomFab {
bottom: 120px !important;
}

View file

@ -1,4 +1,4 @@
<div id="devicesUploadPage" data-role="page" class="page type-interior devicesPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Camera%20upload" data-require="scripts/devicesupload,paper-input,paper-checkbox">
<div id="devicesUploadPage" data-role="page" class="page type-interior devicesPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Camera%20upload" data-require="scripts/devicesupload,paper-input,paper-checkbox,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="dlnaProfilePage" data-role="page" class="page type-interior dlnaPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Dlna%20profiles" data-require="jqmcollapsible,jqmpopup,scripts/dlnaprofile,jqmcheckbox">
<div id="dlnaProfilePage" data-role="page" class="page type-interior dlnaPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Dlna%20profiles" data-require="jqmcollapsible,jqmpopup,scripts/dlnaprofile,jqmcheckbox,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="dlnaProfilesPage" data-role="page" class="page type-interior dlnaPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Dlna%20profiles" data-require="scripts/dlnaprofiles">
<div id="dlnaProfilesPage" data-role="page" class="page type-interior dlnaPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Dlna%20profiles" data-require="scripts/dlnaprofiles,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="dlnaSettingsPage" data-role="page" class="page type-interior withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Play%20to" data-require="scripts/dlnasettings,paper-input,paper-checkbox">
<div id="dlnaSettingsPage" data-role="page" class="page type-interior withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Play%20to" data-require="scripts/dlnasettings,paper-input,paper-checkbox,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="encodingSettingsPage" data-role="page" class="page type-interior playbackConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Transcoding" data-require="scripts/encodingsettings,paper-input,paper-checkbox">
<div id="encodingSettingsPage" data-role="page" class="page type-interior playbackConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Transcoding" data-require="scripts/encodingsettings,paper-input,paper-checkbox,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div data-role="page" id="forgotPasswordPage" class="page standalonePage forgotPasswordPage" data-theme="b" data-require="scripts/forgotpassword,paper-input">
<div data-role="page" id="forgotPasswordPage" class="page standalonePage forgotPasswordPage" data-theme="b" data-require="scripts/forgotpassword,paper-input,paper-button">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div data-role="page" class="page standalonePage forgotPasswordPinPage" data-theme="b" data-require="scripts/forgotpasswordpin,paper-input">
<div data-role="page" class="page standalonePage forgotPasswordPinPage" data-theme="b" data-require="scripts/forgotpasswordpin,paper-input,paper-button">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="itemDetailPage" data-role="page" class="page libraryPage itemDetailPage noSecondaryNavPage selfBackdropPage" data-theme="b" data-require="scripts/itemdetailpage,tileitemcss,scripts/livetvcomponents,paper-fab,paper-item-body,paper-icon-item">
<div id="itemDetailPage" data-role="page" class="page libraryPage itemDetailPage noSecondaryNavPage selfBackdropPage" data-theme="b" data-require="scripts/itemdetailpage,tileitemcss,scripts/livetvcomponents,paper-fab,paper-item-body,paper-icon-item,paper-button">
<div id="itemBackdrop" class="itemBackdrop noBackdrop">
<div class="itemBackdropContent">

View file

@ -1,4 +1,4 @@
<div id="librarySettingsPage" data-role="page" class="page type-interior librarySectionPage withTabs" data-require="emby-collapsible,scripts/librarysettings,paper-input,paper-checkbox">
<div id="librarySettingsPage" data-role="page" class="page type-interior librarySectionPage withTabs" data-require="emby-collapsible,scripts/librarysettings,paper-input,paper-checkbox,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="liveTvSuggestedPage" data-dom-cache="true" data-role="page" class="page libraryPage liveTvPage pageWithAbsoluteTabs" data-contextname="${HeaderLiveTv}" data-backdroptype="series,movie" data-require="scripts/livetvsuggested,livetvcss,scripts/livetvcomponents,paper-tabs,paper-checkbox">
<div id="liveTvSuggestedPage" data-dom-cache="true" data-role="page" class="page libraryPage liveTvPage pageWithAbsoluteTabs" data-contextname="${HeaderLiveTv}" data-backdroptype="series,movie" data-require="scripts/livetvsuggested,livetvcss,scripts/livetvcomponents,paper-tabs,paper-checkbox,paper-button">
<div class="libraryViewNav libraryViewNavWithMinHeight">
<paper-tabs hidescrollbuttons noink>
@ -56,7 +56,7 @@
<br />
</div>
</div>
<div class="pageTabContent guideTabContent hide" style="width: auto;" data-index="1">
<div class="pageTabContent absolutePageTabContent guideTabContent hide" style="width: auto; display: flex;padding-bottom: 0;" data-index="1">
</div>
<div class="pageTabContent channelsTabContent hide" data-index="2">
<div class="viewSettings">

View file

@ -1,4 +1,4 @@
<div id="liveTvSeriesTimerPage" data-role="page" class="page libraryPage liveTvPage noSecondaryNavPage" data-contextname="${HeaderLiveTv}" data-require="jqmcheckbox,jqmcontrolgroup,jqmcollapsible,scripts/livetvcomponents,scripts/livetvseriestimer,livetvcss,paper-checkbox,paper-input" data-backbutton="true" data-menubutton="false">
<div id="liveTvSeriesTimerPage" data-role="page" class="page libraryPage liveTvPage noSecondaryNavPage" data-contextname="${HeaderLiveTv}" data-require="jqmcheckbox,jqmcontrolgroup,paper-button,jqmcollapsible,scripts/livetvcomponents,scripts/livetvseriestimer,livetvcss,paper-checkbox,paper-input" data-backbutton="true" data-menubutton="false">
<div data-role="content">
<form class="liveTvSeriesTimerForm" style="margin: 0 auto; max-width: 720px;">

View file

@ -1,4 +1,4 @@
<div id="liveTvSettingsPage" data-role="page" class="page type-interior liveTvPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvsettings,paper-checkbox,paper-input,emby-collapsible">
<div id="liveTvSettingsPage" data-role="page" class="page type-interior liveTvPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvsettings,paper-checkbox,paper-input,emby-collapsible,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="liveTvStatusPage" data-role="page" class="page type-interior liveTvSettingsPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvstatus,scripts/taskbutton,paper-fab,paper-item-body,paper-icon-item,paper-checkbox">
<div id="liveTvStatusPage" data-role="page" class="page type-interior liveTvSettingsPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvstatus,scripts/taskbutton,paper-fab,paper-item-body,paper-icon-item,paper-checkbox,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="liveTvTimerPage" data-role="page" class="page libraryPage liveTvPage noSecondaryNavPage" data-contextname="${HeaderLiveTv}" data-require="jqmcollapsible,scripts/livetvcomponents,scripts/livetvtimer,livetvcss,paper-input" data-backbutton="true" data-menubutton="false">
<div id="liveTvTimerPage" data-role="page" class="page libraryPage liveTvPage noSecondaryNavPage" data-contextname="${HeaderLiveTv}" data-require="jqmcollapsible,scripts/livetvcomponents,scripts/livetvtimer,livetvcss,paper-input,paper-button" data-backbutton="true" data-menubutton="false">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="liveTvTunerProviderHdHomerunPage" data-role="page" class="page type-interior liveTvSettingsPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvtunerprovider-hdhomerun,paper-input,paper-checkbox">
<div id="liveTvTunerProviderHdHomerunPage" data-role="page" class="page type-interior liveTvSettingsPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvtunerprovider-hdhomerun,paper-input,paper-checkbox,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="liveTvTunerProviderM3UPage" data-role="page" class="page type-interior liveTvSettingsPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvtunerprovider-m3u,paper-input">
<div id="liveTvTunerProviderM3UPage" data-role="page" class="page type-interior liveTvSettingsPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Live%20TV" data-require="scripts/livetvtunerprovider-m3u,paper-input,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="loginPage" data-role="page" class="page standalonePage" data-theme="b" data-require="scripts/loginpage,humanedate,paper-input">
<div id="loginPage" data-role="page" class="page standalonePage" data-theme="b" data-require="scripts/loginpage,humanedate,paper-input,paper-button">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="metadataConfigurationPage" data-role="page" class="page type-interior metadataConfigurationPage withTabs" data-require="scripts/metadataconfigurationpage,paper-checkbox">
<div id="metadataConfigurationPage" data-role="page" class="page type-interior metadataConfigurationPage withTabs" data-require="scripts/metadataconfigurationpage,paper-checkbox,paper-button">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="metadataImagesConfigurationPage" data-role="page" class="page type-interior metadataConfigurationPage withTabs" data-require="emby-collapsible,scripts/metadataimagespage,paper-checkbox,paper-input,paper-fab,paper-icon-item,paper-item-body">
<div id="metadataImagesConfigurationPage" data-role="page" class="page type-interior metadataConfigurationPage withTabs" data-require="emby-collapsible,scripts/metadataimagespage,paper-checkbox,paper-input,paper-fab,paper-icon-item,paper-item-body,paper-button">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="metadataNfoPage" data-role="page" class="page type-interior metadataConfigurationPage withTabs" data-require="scripts/metadatanfo,paper-checkbox">
<div id="metadataNfoPage" data-role="page" class="page type-interior metadataConfigurationPage withTabs" data-require="scripts/metadatanfo,paper-checkbox,paper-button">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="metadataSubtitlesPage" data-role="page" class="page type-interior metadataConfigurationPage" data-require="scripts/metadatasubtitles,paper-input,paper-checkbox">
<div id="metadataSubtitlesPage" data-role="page" class="page type-interior metadataConfigurationPage" data-require="scripts/metadatasubtitles,paper-input,paper-checkbox,paper-button">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="displayPreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${HeaderDisplaySettings}" data-require="scripts/mypreferencesdisplay,paper-checkbox" data-backbutton="true" data-menubutton="false">
<div id="displayPreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${HeaderDisplaySettings}" data-require="scripts/mypreferencesdisplay,paper-checkbox,paper-button" data-backbutton="true" data-menubutton="false">
<div data-role="content">
<form class="displayPreferencesForm userProfileSettingsForm" style="margin: 0 auto;">
<div class="detailSection languageSection">

View file

@ -1,4 +1,4 @@
<div id="homeScreenPreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${HeaderHomeScreenSettings}" data-require="scripts/mypreferenceshome,paper-checkbox,paper-fab,paper-item-body,paper-icon-item" data-backbutton="true" data-menubutton="false">
<div id="homeScreenPreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${HeaderHomeScreenSettings}" data-require="scripts/mypreferenceshome,paper-checkbox,paper-fab,paper-item-body,paper-icon-item,paper-button" data-backbutton="true" data-menubutton="false">
<div data-role="content">
<form class="homeScreenPreferencesForm userProfileSettingsForm" style="margin: 0 auto;">

View file

@ -1,4 +1,4 @@
<div id="languagePreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${HeaderPlaybackSettings}" data-require="scripts/mypreferenceslanguages,paper-checkbox" data-backbutton="true" data-menubutton="false">
<div id="languagePreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${HeaderPlaybackSettings}" data-require="scripts/mypreferenceslanguages,paper-checkbox,paper-button" data-backbutton="true" data-menubutton="false">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="userImagePage" data-role="page" class="page libraryPage userPreferencesPage userPasswordPage noSecondaryNavPage" data-title="${HeaderProfile}" data-require="jqmcollapsible,scripts/myprofile,paper-checkbox,paper-input" data-backbutton="true" data-menubutton="false">
<div id="userImagePage" data-role="page" class="page libraryPage userPreferencesPage userPasswordPage noSecondaryNavPage" data-title="${HeaderProfile}" data-require="jqmcollapsible,scripts/myprofile,paper-checkbox,paper-input,paper-button" data-backbutton="true" data-menubutton="false">
<div data-role="content">
<br />

View file

@ -1,4 +1,4 @@
<div id="mySyncActivityPage" data-role="page" class="page libraryPage syncActivityPage mySyncPage noSecondaryNavPage" data-contextname="${TitleSync}" data-require="scripts/syncactivity,scripts/taskbutton,scripts/mysync,paper-spinner,paper-fab">
<div id="mySyncActivityPage" data-role="page" class="page libraryPage syncActivityPage mySyncPage noSecondaryNavPage" data-contextname="${TitleSync}" data-require="scripts/syncactivity,scripts/taskbutton,scripts/mysync,paper-spinner,paper-fab,paper-button">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="syncPreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${ButtonSyncSettings}" data-require="scripts/mysyncsettings,paper-checkbox,paper-input" data-backbutton="true" data-menubutton="false">
<div id="syncPreferencesPage" data-role="page" class="page libraryPage userPreferencesPage noSecondaryNavPage" data-title="${ButtonSyncSettings}" data-require="scripts/mysyncsettings,paper-checkbox,paper-input,paper-button" data-backbutton="true" data-menubutton="false">
<div data-role="content">
<form class="userProfileSettingsForm" style="margin: 0 auto;">

View file

@ -1,4 +1,4 @@
<div id="notificationSettingPage" data-role="page" class="page type-interior notificationConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Notifications" data-require="scripts/notificationsetting,paper-input,paper-checkbox">
<div id="notificationSettingPage" data-role="page" class="page type-interior notificationConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Notifications" data-require="scripts/notificationsetting,paper-input,paper-checkbox,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="nowPlayingPage" data-role="page" class="page libraryPage nowPlayingPage noSecondaryNavPage selfBackdropPage" data-contextname="${TitleRemoteControl}" data-theme="b" data-require="scripts/nowplayingpage,paper-tabs,paper-icon-button,paper-slider">
<div id="nowPlayingPage" data-role="page" class="page libraryPage nowPlayingPage noSecondaryNavPage selfBackdropPage" data-contextname="${TitleRemoteControl}" data-theme="b" data-require="scripts/nowplayingpage,paper-tabs,paper-icon-button,paper-slider,paper-button">
<div class="remoteControlContent">

View file

@ -1,42 +1,10 @@
<div id="photosPage" data-role="page" data-dom-cache="true" class="page libraryPage pageWithAbsoluteTabs" data-require="scripts/photos,paper-tabs">
<div class="libraryViewNav scopedLibraryViewNav libraryViewNavWithMinHeight">
<paper-tabs hidescrollbuttons noink>
<paper-tab>${TabAlbums}</paper-tab>
<paper-tab>${TabPhotos}</paper-tab>
<paper-tab>${TabVideos}</paper-tab>
</paper-tabs>
<div class="legacyTabs">
<a href="photos.html" class="lnkPhotoAlbums">${TabAlbums}</a>
<a href="photos.html?tab=1" class="lnkPhotos">${TabPhotos}</a>
<a href="photos.html?tab=2" class="lnkVideos">${TabVideos}</a>
</div>
</div>
<div class="pageTabsContainer">
<div class="pageTabContent albumTabContent hide">
<div class="viewSettings">
<div class="listTopPaging">
</div>
</div>
<div class="itemsContainer paddedItemsContainer" style="text-align:center;"></div>
</div>
<div class="pageTabContent photoTabContent hide">
<div class="viewSettings">
<div class="listTopPaging">
</div>
</div>
<div class="itemsContainer paddedItemsContainer" style="text-align:center;"></div>
</div>
<div class="pageTabContent videoTabContent hide">
<div class="viewSettings">
<div class="listTopPaging">
</div>
</div>
<div class="itemsContainer paddedItemsContainer" style="text-align:center;"></div>
</div>
</div>
<div id="photosPage" data-role="page" data-dom-cache="true" class="page libraryPage noSecondaryNavPage" data-require="scripts/photos,paper-tabs">
<div data-role="content">
<div class="viewSettings">
<div class="listTopPaging">
</div>
</div>
<div class="itemsContainer paddedItemsContainer" style="text-align:center;"></div>
</div>
</div>

View file

@ -1,4 +1,4 @@
<div id="playbackConfigurationPage" data-role="page" class="page type-interior playbackConfigurationPage withTabs" data-require="scripts/playbackconfiguration,paper-input">
<div id="playbackConfigurationPage" data-role="page" class="page type-interior playbackConfigurationPage withTabs" data-require="scripts/playbackconfiguration,paper-input,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1,4 +1,4 @@
<div id="scheduledTaskPage" data-role="page" class="page type-interior scheduledTasksConfigurationPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Scheduled%20tasks" data-require="jqmpopup,scripts/scheduledtaskpage,paper-input">
<div id="scheduledTaskPage" data-role="page" class="page type-interior scheduledTasksConfigurationPage" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Scheduled%20tasks" data-require="jqmpopup,scripts/scheduledtaskpage,paper-input,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -1483,6 +1483,10 @@
attributes.push(createAttribute(Globalize.translate('MediaInfoCodecTag'), stream.CodecTag));
}
if (stream.IsAVC != null) {
attributes.push(createAttribute('AVC', stream.IsAVC));
}
if (stream.Profile) {
attributes.push(createAttribute(Globalize.translate('MediaInfoProfile'), stream.Profile));
}

View file

@ -12,7 +12,7 @@
if (!pageData) {
pageData = data = {
query: {
SortBy: "SortName",
SortBy: "IsFolder,SortName",
SortOrder: "Ascending",
Fields: "DateCreated,PrimaryImageAspectRatio,MediaSourceCount,SyncInfo",
ImageTypeLimit: 1,
@ -40,7 +40,7 @@
function getSavedQueryKey() {
if (!view.savedQueryKey) {
view.savedQueryKey = libraryBrowser.getSavedQueryKey('items');
view.savedQueryKey = libraryBrowser.getSavedQueryKey('itemsv1');
}
return view.savedQueryKey;
}

View file

@ -1877,418 +1877,6 @@
options.squareSize = squareSize;
},
setPosterViewDataOnItems: function (options, items) {
LibraryBrowser.setPosterViewData(options);
options.shape = options.shape || "portrait";
var html = "";
var primaryImageAspectRatio;
var thumbWidth = options.thumbWidth;
var posterWidth = options.posterWidth;
var squareSize = options.squareSize;
var bannerWidth = options.bannerWidth;
var uiAspect = options.uiAspect;
for (var i = 0, length = items.length; i < length; i++) {
var item = items[i];
primaryImageAspectRatio = LibraryBrowser.getAveragePrimaryImageAspectRatio([item]);
LibraryBrowser.setPosterViewDataOnItem(item, i, options, primaryImageAspectRatio, thumbWidth, posterWidth, squareSize, bannerWidth, uiAspect);
}
return html;
},
setPosterViewDataOnItem: function (item, index, options, primaryImageAspectRatio, thumbWidth, posterWidth, squareSize, bannerWidth, uiAspect) {
var imgUrl = null;
var icon;
var width = null;
var height = null;
var forceName = false;
var enableImageEnhancers = options.enableImageEnhancers !== false;
var cssClass = "card";
if (options.fullWidthOnMobile) {
cssClass += " fullWidthCardOnMobile";
}
var showTitle = options.showTitle == 'auto' ? true : options.showTitle;
var coverImage = options.coverImage;
if (options.autoThumb && item.ImageTags && item.ImageTags.Primary && item.PrimaryImageAspectRatio && item.PrimaryImageAspectRatio >= 1.34) {
width = posterWidth;
height = primaryImageAspectRatio ? Math.round(posterWidth / primaryImageAspectRatio) : null;
imgUrl = ApiClient.getImageUrl(item.Id, {
type: "Primary",
maxHeight: height,
maxWidth: width,
tag: item.ImageTags.Primary,
enableImageEnhancers: enableImageEnhancers
});
if (primaryImageAspectRatio) {
if (uiAspect) {
if (Math.abs(primaryImageAspectRatio - uiAspect) <= .2) {
coverImage = true;
}
}
}
} else if (options.autoThumb && item.ImageTags && item.ImageTags.Thumb) {
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Thumb",
maxWidth: thumbWidth,
tag: item.ImageTags.Thumb,
enableImageEnhancers: enableImageEnhancers
});
} else if (options.preferBackdrop && item.BackdropImageTags && item.BackdropImageTags.length) {
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Backdrop",
maxWidth: thumbWidth,
tag: item.BackdropImageTags[0],
enableImageEnhancers: enableImageEnhancers
});
} else if (options.preferThumb && item.ImageTags && item.ImageTags.Thumb) {
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Thumb",
maxWidth: thumbWidth,
tag: item.ImageTags.Thumb,
enableImageEnhancers: enableImageEnhancers
});
} else if (options.preferBanner && item.ImageTags && item.ImageTags.Banner) {
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Banner",
maxWidth: bannerWidth,
tag: item.ImageTags.Banner,
enableImageEnhancers: enableImageEnhancers
});
} else if (options.preferThumb && item.SeriesThumbImageTag && options.inheritThumb !== false) {
imgUrl = ApiClient.getScaledImageUrl(item.SeriesId, {
type: "Thumb",
maxWidth: thumbWidth,
tag: item.SeriesThumbImageTag,
enableImageEnhancers: enableImageEnhancers
});
} else if (options.preferThumb && item.ParentThumbItemId && options.inheritThumb !== false) {
imgUrl = ApiClient.getThumbImageUrl(item.ParentThumbItemId, {
type: "Thumb",
maxWidth: thumbWidth,
enableImageEnhancers: enableImageEnhancers
});
} else if (options.preferThumb && item.BackdropImageTags && item.BackdropImageTags.length) {
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Backdrop",
maxWidth: thumbWidth,
tag: item.BackdropImageTags[0],
enableImageEnhancers: enableImageEnhancers
});
forceName = true;
} else if (item.ImageTags && item.ImageTags.Primary) {
width = posterWidth;
height = primaryImageAspectRatio ? Math.round(posterWidth / primaryImageAspectRatio) : null;
imgUrl = ApiClient.getImageUrl(item.Id, {
type: "Primary",
maxHeight: height,
maxWidth: width,
tag: item.ImageTags.Primary,
enableImageEnhancers: enableImageEnhancers
});
if (primaryImageAspectRatio) {
if (uiAspect) {
if (Math.abs(primaryImageAspectRatio - uiAspect) <= .2) {
coverImage = true;
}
}
}
}
else if (item.ParentPrimaryImageTag) {
imgUrl = ApiClient.getImageUrl(item.ParentPrimaryImageItemId, {
type: "Primary",
maxWidth: posterWidth,
tag: item.ParentPrimaryImageTag,
enableImageEnhancers: enableImageEnhancers
});
}
else if (item.AlbumId && item.AlbumPrimaryImageTag) {
height = squareSize;
width = primaryImageAspectRatio ? Math.round(height * primaryImageAspectRatio) : null;
imgUrl = ApiClient.getScaledImageUrl(item.AlbumId, {
type: "Primary",
maxHeight: height,
maxWidth: width,
tag: item.AlbumPrimaryImageTag,
enableImageEnhancers: enableImageEnhancers
});
if (primaryImageAspectRatio) {
if (uiAspect) {
if (Math.abs(primaryImageAspectRatio - uiAspect) <= .2) {
coverImage = true;
}
}
}
}
else if (item.Type == 'Season' && item.ImageTags && item.ImageTags.Thumb) {
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Thumb",
maxWidth: thumbWidth,
tag: item.ImageTags.Thumb,
enableImageEnhancers: enableImageEnhancers
});
}
else if (item.BackdropImageTags && item.BackdropImageTags.length) {
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Backdrop",
maxWidth: thumbWidth,
tag: item.BackdropImageTags[0],
enableImageEnhancers: enableImageEnhancers
});
} else if (item.ImageTags && item.ImageTags.Thumb) {
imgUrl = ApiClient.getScaledImageUrl(item.Id, {
type: "Thumb",
maxWidth: thumbWidth,
tag: item.ImageTags.Thumb,
enableImageEnhancers: enableImageEnhancers
});
} else if (item.SeriesThumbImageTag) {
imgUrl = ApiClient.getScaledImageUrl(item.SeriesId, {
type: "Thumb",
maxWidth: thumbWidth,
tag: item.SeriesThumbImageTag,
enableImageEnhancers: enableImageEnhancers
});
} else if (item.ParentThumbItemId) {
imgUrl = ApiClient.getThumbImageUrl(item, {
type: "Thumb",
maxWidth: thumbWidth,
enableImageEnhancers: enableImageEnhancers
});
} else if (item.MediaType == "Audio" || item.Type == "MusicAlbum" || item.Type == "MusicArtist") {
if (item.Name && showTitle) {
icon = 'library-music';
}
cssClass += " defaultBackground";
} else if (item.Type == "Recording" || item.Type == "Program" || item.Type == "TvChannel") {
if (item.Name && showTitle) {
icon = 'folder-open';
}
cssClass += " defaultBackground";
} else if (item.MediaType == "Video" || item.Type == "Season" || item.Type == "Series") {
if (item.Name && showTitle) {
icon = 'videocam';
}
cssClass += " defaultBackground";
} else if (item.Type == "Person") {
if (item.Name && showTitle) {
icon = 'person';
}
cssClass += " defaultBackground";
} else {
if (item.Name && showTitle) {
icon = 'folder-open';
}
cssClass += " defaultBackground";
}
icon = item.icon || icon;
cssClass += ' ' + options.shape + 'Card';
var mediaSourceCount = item.MediaSourceCount || 1;
var href = options.linkItem === false ? '#' : LibraryBrowser.getHref(item, options.context);
if (options.showChildCountIndicator && item.ChildCount && options.showLatestItemsPopup !== false) {
cssClass += ' groupedCard';
}
if ((showTitle || options.showItemCounts) && !options.overlayText) {
cssClass += ' bottomPaddedCard';
}
var dataAttributes = LibraryBrowser.getItemDataAttributesList(item, options, index);
for (var i = 0, length = dataAttributes.length; i < length; i++) {
var att = dataAttributes[i];
if (att.value) {
item['data-' + att.name] = att.value;
}
}
var defaultAction = options.defaultAction;
if (defaultAction == 'play' || defaultAction == 'playallfromhere') {
if (item.PlayAccess != 'Full') {
defaultAction = null;
}
}
// card
//html += '<div' + dataAttributes + ' class="' + cssClass + '">';
item.elemClass = cssClass;
item.defaultAction = defaultAction;
var style = "";
if (imgUrl && !options.lazy) {
style += 'background-image:url(\'' + imgUrl + '\');';
}
var imageCssClass = 'cardImage';
if (icon) {
imageCssClass += " iconCardImage";
}
if (coverImage) {
imageCssClass += " coveredCardImage";
if (item.MediaType == 'Photo' || item.Type == 'PhotoAlbum' || item.Type == 'Folder' || item.Type == 'Program' || item.Type == 'Recording') {
imageCssClass += " noScale";
}
}
if (options.centerImage) {
imageCssClass += " centeredCardImage";
}
var dataSrc = "";
if (options.lazy && imgUrl) {
imageCssClass += " lazy";
dataSrc = ' data-src="' + imgUrl + '"';
}
var cardboxCssClass = 'cardBox';
if (options.cardLayout) {
cardboxCssClass += ' visualCardBox';
}
item.cardBoxClass = cardboxCssClass;
var anchorCssClass = "cardContent";
anchorCssClass += ' mediaItem';
if (defaultAction) {
anchorCssClass += ' itemWithAction';
}
item.anchorClass = anchorCssClass;
item.href = href;
item.imgUrl = imgUrl;
item.imageClass = imageCssClass;
if (imgUrl) {
item.imageStyle = 'background-image:url("' + imgUrl + '");';
} else {
item.imageStyle = null;
}
var overlayHtml = '';
if (item.LocationType == "Virtual" || item.LocationType == "Offline") {
if (options.showLocationTypeIndicator !== false) {
overlayHtml += LibraryBrowser.getOfflineIndicatorHtml(item);
}
} else if (options.showUnplayedIndicator !== false) {
overlayHtml += LibraryBrowser.getPlayedIndicatorHtml(item);
} else if (options.showChildCountIndicator) {
overlayHtml += LibraryBrowser.getGroupCountIndicator(item);
}
overlayHtml += LibraryBrowser.getSyncIndicator(item);
if (mediaSourceCount > 1) {
overlayHtml += '<div class="mediaSourceIndicator">' + mediaSourceCount + '</div>';
}
var progressHtml = options.showProgress === false || item.IsFolder ? '' : LibraryBrowser.getItemProgressBarHtml((item.Type == 'Recording' ? item : item.UserData));
var footerOverlayed = false;
if (options.overlayText || (forceName && !showTitle)) {
var footerCssClass = progressHtml ? 'cardFooter fullCardFooter' : 'cardFooter';
overlayHtml += LibraryBrowser.getCardFooterText(item, options, showTitle, imgUrl, forceName, footerCssClass, progressHtml);
footerOverlayed = true;
}
else if (progressHtml) {
overlayHtml += '<div class="cardFooter fullCardFooter lightCardFooter">';
overlayHtml += "<div class='cardProgress cardText'>";
overlayHtml += progressHtml;
overlayHtml += "</div>";
//cardFooter
overlayHtml += "</div>";
progressHtml = '';
}
if (options.overlayPlayButton && !item.IsPlaceHolder && (item.LocationType != 'Virtual' || !item.MediaType || item.Type == 'Program') && item.Type != 'Person') {
overlayHtml += '<div class="cardOverlayButtonContainer"><paper-icon-button icon="play-arrow" class="cardOverlayPlayButton" onclick="return false;"></paper-icon-button></div>';
}
if (options.overlayMoreButton) {
overlayHtml += '<div class="cardOverlayButtonContainer"><paper-icon-button icon="' + AppInfo.moreIcon + '" class="cardOverlayMoreButton" onclick="return false;"></paper-icon-button></div>';
}
//// cardScalable
if (!options.overlayText && !footerOverlayed) {
item.footerHtml = LibraryBrowser.getCardFooterText(item, options, showTitle, imgUrl, forceName, 'cardFooter outerCardFooter', progressHtml);
} else {
item.footerHtml = '';
}
item.overlayHtml = overlayHtml;
},
getPosterViewHtml: function (options) {
LibraryBrowser.setPosterViewData(options);
@ -2370,6 +1958,10 @@
}
var showTitle = options.showTitle == 'auto' ? true : options.showTitle;
if (item.Type == 'PhotoAlbum') {
showTitle = true;
}
var coverImage = options.coverImage;
if (options.autoThumb && item.ImageTags && item.ImageTags.Primary && item.PrimaryImageAspectRatio && item.PrimaryImageAspectRatio >= 1.34) {
@ -3419,10 +3011,6 @@
html += '</paper-radio-group>';
html += '</div>';
//html += '<div class="buttons">';
//html += '<paper-button dialog-dismiss>' + Globalize.translate('ButtonClose') + '</paper-button>';
//html += '</div>';
dlg.innerHTML = html;
document.body.appendChild(dlg);
@ -3877,13 +3465,13 @@
if (item.IsSeries && !item.IsRepeat) {
require(['livetvcss']);
miscInfo.push('<span class="newTvProgram">' + Globalize.translate('LabelNewProgram') + '</span>');
miscInfo.push('<span class="newTvProgram">' + Globalize.translate('AttributeNew') + '</span>');
}
if (item.IsLive) {
miscInfo.push('<span class="liveTvProgram">' + Globalize.translate('LabelLiveProgram') + '</span>');
miscInfo.push('<span class="liveTvProgram">' + Globalize.translate('AttributeLive') + '</span>');
}

View file

@ -59,13 +59,13 @@
html += '<div class="tvProgramTime">';
if (program.IsLive) {
html += '<span class="liveTvProgram">' + Globalize.translate('LabelLiveProgram') + '&nbsp;&nbsp;</span>';
html += '<span class="liveTvProgram">' + Globalize.translate('AttributeLive') + '&nbsp;&nbsp;</span>';
}
else if (program.IsPremiere) {
html += '<span class="premiereTvProgram">' + Globalize.translate('LabelPremiereProgram') + '&nbsp;&nbsp;</span>';
html += '<span class="premiereTvProgram">' + Globalize.translate('AttributePremiere') + '&nbsp;&nbsp;</span>';
}
else if (program.IsSeries && !program.IsRepeat) {
html += '<span class="newTvProgram">' + Globalize.translate('LabelNewProgram') + '&nbsp;&nbsp;</span>';
html += '<span class="newTvProgram">' + Globalize.translate('AttributeNew') + '&nbsp;&nbsp;</span>';
}
var minutes = program.RunTimeTicks / 600000000;

View file

@ -1,4 +1,4 @@
define([], function () {
define(['tvguide'], function (tvguide) {
window.LiveTvPage.initGuideTab = function (page, tabContent) {
@ -6,17 +6,10 @@
window.LiveTvPage.renderGuideTab = function (page, tabContent) {
if (page.guideInstance) {
if (LibraryBrowser.needsRefresh(tabContent)) {
page.guideInstance.refresh();
}
} else {
require(['tvguide'], function (tvguide) {
if (!page.guideInstance) {
page.guideInstance = new tvguide({
element: tabContent,
enableHeadRoom: true
});
page.guideInstance = new tvguide({
element: tabContent
});
}
};

View file

@ -207,6 +207,22 @@
});
pageIdOn('viewshow', "liveTvSuggestedPage", function () {
var page = this;
// Needed on the guide tab
// Ideally this should be moved to the guide tab on show/hide
document.body.classList.add('autoScrollY');
});
pageIdOn('viewbeforehide', "liveTvSuggestedPage", function () {
var page = this;
document.body.classList.remove('autoScrollY');
});
window.LiveTvPage = {
renderSuggestedTab: renderSuggestedTab,
initSuggestedTab: initSuggestedTab

View file

@ -3,15 +3,15 @@
var view = 'Poster';
var data = {};
function getQuery(tab) {
function getQuery() {
var key = getSavedQueryKey(tab);
var key = getSavedQueryKey();
var pageData = data[key];
if (!pageData) {
pageData = data[key] = {
query: {
SortBy: "SortName",
SortBy: "IsFolder,SortName",
SortOrder: "Ascending",
Fields: "PrimaryImageAspectRatio,SortName,SyncInfo",
ImageTypeLimit: 1,
@ -20,24 +20,26 @@
Limit: LibraryBrowser.getDefaultPageSize()
}
};
setQueryPerTab(tab, pageData.query);
pageData.query.ParentId = LibraryMenu.getTopParentId();
pageData.query.Recursive = false;
pageData.query.MediaTypes = null;
pageData.query.ParentId = getParameterByName('parentId') || LibraryMenu.getTopParentId();
LibraryBrowser.loadSavedQueryValues(key, pageData.query);
}
return pageData.query;
}
function getSavedQueryKey(tab) {
function getSavedQueryKey() {
return LibraryBrowser.getSavedQueryKey('tab=' + tab);
return LibraryBrowser.getSavedQueryKey('v1');
}
function reloadItems(page, tabIndex) {
function reloadItems(page) {
Dashboard.showLoadingMsg();
var query = getQuery(tabIndex);
var query = getQuery();
ApiClient.getItems(Dashboard.getCurrentUserId(), query).then(function (result) {
// Scroll back up so they can see the results from the beginning
@ -63,7 +65,7 @@
overlayText: true,
lazy: true,
coverImage: true,
showTitle: tabIndex == 0,
showTitle: false,
centerText: true
});
}
@ -74,38 +76,20 @@
$('.btnNextPage', page).on('click', function () {
query.StartIndex += query.Limit;
reloadItems(page, tabIndex);
reloadItems(page);
});
$('.btnPreviousPage', page).on('click', function () {
query.StartIndex -= query.Limit;
reloadItems(page, tabIndex);
reloadItems(page);
});
LibraryBrowser.saveQueryValues(getSavedQueryKey(tabIndex), query);
LibraryBrowser.saveQueryValues(getSavedQueryKey(), query);
Dashboard.hideLoadingMsg();
});
}
function setQueryPerTab(tab, query) {
if (tab == 1) {
query.Recursive = true;
query.MediaTypes = 'Photo';
}
else if (tab == 2) {
query.Recursive = true;
query.MediaTypes = 'Video';
}
else if (tab == 0) {
query.Recursive = false;
query.MediaTypes = null;
}
query.ParentId = getParameterByName('parentId') || LibraryMenu.getTopParentId();
}
function startSlideshow(page, itemQuery, startItemId) {
var userId = Dashboard.getCurrentUserId();
@ -155,54 +139,18 @@
var info = LibraryBrowser.getListItemInfo(this);
if (info.mediaType == 'Photo') {
var query = getQuery(LibraryBrowser.selectedTab(page.querySelector('.pageTabsContainer')));
var query = getQuery();
Photos.startSlideshow(page, query, info.id);
return false;
}
}
function loadTab(page, index) {
switch (index) {
case 0:
{
reloadItems(page.querySelector('.albumTabContent'), 0);
}
break;
case 1:
{
reloadItems(page.querySelector('.photoTabContent'), 1);
}
break;
case 2:
{
reloadItems(page.querySelector('.videoTabContent'), 2);
}
break;
default:
break;
}
}
pageIdOn('pageinit', "photosPage", function () {
var page = this;
var tabs = page.querySelector('paper-tabs');
var baseUrl = 'photos.html';
var topParentId = LibraryMenu.getTopParentId();
if (topParentId) {
baseUrl += '?topParentId=' + topParentId;
}
LibraryBrowser.configurePaperLibraryTabs(page, tabs, page.querySelector('.pageTabsContainer'), baseUrl);
page.querySelector('.pageTabsContainer').addEventListener('tabchange', function (e) {
loadTab(page, parseInt(e.detail.selectedTabIndex));
});
reloadItems(page, 0);
$(page).on('click', '.mediaItem', onListItemClick);

View file

@ -97,7 +97,7 @@
function showPlaybackOverlay(resolve, reject) {
require(['dialogHelper', 'paper-fab', 'paper-item-body', 'paper-icon-item'], function (dialogHelper) {
require(['dialogHelper', 'paper-fab', 'paper-item-body', 'paper-icon-item', 'paper-button'], function (dialogHelper) {
var dlg = dialogHelper.createDialog({
size: 'fullscreen-border'
@ -297,4 +297,5 @@
}
};
return window.RegistrationServices;
});

View file

@ -1,4 +1,4 @@
define(['libraryBrowser', 'jQuery', 'appSettings', 'scrollStyles'], function (LibraryBrowser, $, appSettings) {
define(['libraryBrowser', 'jQuery', 'appSettings', 'scrollStyles', 'paper-button'], function (LibraryBrowser, $, appSettings) {
function getUserViews(userId) {

View file

@ -1481,7 +1481,7 @@ var AppInfo = {};
console.log('loaded ApiClient singleton');
resolve();
});
}
}
});
});
});
@ -1605,7 +1605,6 @@ var AppInfo = {};
var paths = {
velocity: bowerPath + "/velocity/velocity.min",
tvguide: 'components/tvguide/tvguide',
ironCardList: 'components/ironcardlist/ironcardlist',
scrollThreshold: 'components/scrollthreshold',
directorybrowser: 'components/directorybrowser/directorybrowser',
@ -1635,7 +1634,9 @@ var AppInfo = {};
layoutManager: embyWebComponentsBowerPath + "/layoutmanager",
pageJs: embyWebComponentsBowerPath + '/page.js/page',
focusManager: embyWebComponentsBowerPath + "/focusmanager",
datetime: embyWebComponentsBowerPath + "/datetime",
globalize: embyWebComponentsBowerPath + "/globalize",
itemShortcuts: embyWebComponentsBowerPath + "/shortcuts",
imageLoader: embyWebComponentsBowerPath + "/images/imagehelper"
};
@ -1667,6 +1668,11 @@ var AppInfo = {};
define("backdrop", [embyWebComponentsBowerPath + "/backdrop/backdrop"], returnFirstDependency);
define("fetchHelper", [embyWebComponentsBowerPath + "/fetchhelper"], returnFirstDependency);
define("tvguide", [embyWebComponentsBowerPath + "/guide/guide", 'embyRouter'], function (tvGuide, embyRouter) {
tvGuide.setBaseUrl(embyRouter.baseUrl() + '/bower_components/emby-webcomponents/guide');
return tvGuide;
});
define("viewManager", [embyWebComponentsBowerPath + "/viewmanager"], function (viewManager) {
viewManager.dispatchPageEvents(true);
return viewManager;
@ -1786,12 +1792,13 @@ var AppInfo = {};
define('webcomponentsjs', [bowerPath + '/webcomponentsjs/webcomponents-lite.min.js']);
define('native-promise-only', [bowerPath + '/native-promise-only/lib/npo.src']);
define("fingerprintjs2", [bowerPath + '/fingerprintjs2/fingerprint2'], returnFirstDependency);
define("clearButtonStyle", ['css!' + embyWebComponentsBowerPath + '/clearbutton']);
if (Dashboard.isRunningInCordova()) {
define('registrationservices', ['cordova/registrationservices']);
define('registrationservices', ['cordova/registrationservices'], returnFirstDependency);
} else {
define('registrationservices', ['scripts/registrationservices']);
define('registrationservices', ['scripts/registrationservices'], returnFirstDependency);
}
if (Dashboard.isRunningInCordova()) {
@ -1866,6 +1873,12 @@ var AppInfo = {};
};
});
// mock this for now. not used in this app
define("playbackManager", [], function () {
return {
};
});
// mock this for now. not used in this app
define("pluginManager", [], function () {
return {
@ -1884,7 +1897,7 @@ var AppInfo = {};
define('dialogText', ['globalize'], getDialogText());
define("router", [embyWebComponentsBowerPath + '/router'], function (embyRouter) {
define("embyRouter", [embyWebComponentsBowerPath + '/router'], function (embyRouter) {
embyRouter.showLocalLogin = function (apiClient, serverId, manualLogin) {
Dashboard.navigate('login.html?serverid=' + serverId);
@ -1907,6 +1920,17 @@ var AppInfo = {};
Dashboard.navigate('mypreferencesmenu.html?userId=' + ApiClient.getCurrentUserId());
};
embyRouter.showItem = function (item) {
if (typeof (item) === 'string') {
require(['connectionManager'], function (connectionManager) {
var apiClient = connectionManager.currentApiClient();
apiClient.getItem(apiClient.getCurrentUserId(), item).then(showItem);
});
} else {
Dashboard.navigate(LibraryBrowser.getHref(item));
}
};
return embyRouter;
});
}
@ -2521,7 +2545,7 @@ var AppInfo = {};
defineRoute({
path: '/movies.html',
dependencies: ['paper-tabs', 'paper-checkbox', 'paper-fab', 'scripts/alphapicker'],
dependencies: ['paper-tabs', 'paper-checkbox', 'paper-fab', 'scripts/alphapicker', 'paper-button'],
autoFocus: false,
controller: 'scripts/moviesrecommended'
});
@ -2873,7 +2897,7 @@ var AppInfo = {};
var deps = [];
deps.push('imageLoader');
deps.push('router');
deps.push('embyRouter');
deps.push('layoutManager');
if (!(AppInfo.isNativeApp && browserInfo.android)) {

View file

@ -1,4 +1,4 @@
define(['jQuery', 'paper-progress', 'paper-fab', 'paper-item-body', 'paper-icon-item', 'paper-icon-button'], function ($) {
define(['jQuery', 'paper-progress', 'paper-fab', 'paper-item-body', 'paper-icon-item', 'paper-icon-button', 'paper-button'], function ($) {
function renderJob(page, job, dialogOptions) {

View file

@ -1,4 +1,4 @@
define(['appStorage', 'jQuery'], function (appStorage, $) {
define(['appStorage', 'jQuery', 'paper-button'], function (appStorage, $) {
$.fn.taskButton = function (options) {

View file

@ -1,4 +1,4 @@
<div id="selectServerPage" data-role="page" class="page noSecondaryNavPage standalonePage" data-theme="b" data-require="scripts/selectserver,paper-fab,paper-item-body,paper-icon-item">
<div id="selectServerPage" data-role="page" class="page noSecondaryNavPage standalonePage" data-theme="b" data-require="scripts/selectserver,paper-fab,paper-item-body,paper-icon-item,paper-button">
<div data-role="content">

View file

@ -1,4 +1,4 @@
<div id="serverSecurityPage" data-role="page" class="page type-interior advancedConfigurationPage withTabs" data-require="jqmtable,scripts/serversecurity,detailtablecss">
<div id="serverSecurityPage" data-role="page" class="page type-interior advancedConfigurationPage withTabs" data-require="jqmtable,scripts/serversecurity,detailtablecss,paper-button">
<div data-role="content">
<div class="content-primary">
<div class="detailSectionHeader">

View file

@ -1,4 +1,4 @@
<div id="streamingSettingsPage" data-role="page" class="page type-interior playbackConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Streaming" data-require="scripts/streamingsettings,paper-input">
<div id="streamingSettingsPage" data-role="page" class="page type-interior playbackConfigurationPage withTabs" data-helpurl="https://github.com/MediaBrowser/Wiki/wiki/Streaming" data-require="scripts/streamingsettings,paper-input,paper-button">
<div data-role="content">
<div class="content-primary">

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuing",
"OptionEnded": "Ended",
"HeaderAirDays": "Air Days",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "\u0627\u0644\u0627\u062d\u062f",
"OptionMonday": "\u0627\u0644\u0627\u062b\u0646\u064a\u0646",
"OptionTuesday": "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Production Locations",
"OptionBirthLocation": "Birth Location",
"LabelAllChannels": "All channels",
"LabelLiveProgram": "LIVE",
"LabelNewProgram": "NEW",
"LabelPremiereProgram": "PREMIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "\u041f\u0440\u043e\u0434\u044a\u043b\u0436\u0430\u0432\u0430\u0449\u043e",
"OptionEnded": "\u041f\u0440\u0438\u043a\u043b\u044e\u0447\u0438\u043b\u043e",
"HeaderAirDays": "\u0414\u043d\u0438 \u043d\u0430 \u0438\u0437\u043b\u044a\u0447\u0432\u0430\u043d\u0435",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "\u041d\u0435\u0434\u0435\u043b\u044f",
"OptionMonday": "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a",
"OptionTuesday": "\u0412\u0442\u043e\u0440\u043d\u0438\u043a",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Production Locations",
"OptionBirthLocation": "Birth Location",
"LabelAllChannels": "All channels",
"LabelLiveProgram": "LIVE",
"LabelNewProgram": "NEW",
"LabelPremiereProgram": "PREMIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuant",
"OptionEnded": "Acabades",
"HeaderAirDays": "Dies d'Emissi\u00f3",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Diumenge",
"OptionMonday": "Dilluns",
"OptionTuesday": "Dimarts",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Production Locations",
"OptionBirthLocation": "Birth Location",
"LabelAllChannels": "All channels",
"LabelLiveProgram": "LIVE",
"LabelNewProgram": "NEW",
"LabelPremiereProgram": "PREMIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Pokra\u010dov\u00e1n\u00ed",
"OptionEnded": "Ukon\u010deno",
"HeaderAirDays": "Vys\u00edl\u00e1no ve dnech",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Ned\u011ble",
"OptionMonday": "Pond\u011bl\u00ed",
"OptionTuesday": "\u00dater\u00fd",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "M\u00edsto v\u00fdroby",
"OptionBirthLocation": "M\u00edsto narozen\u00ed",
"LabelAllChannels": "V\u0161echny kan\u00e1ly",
"LabelLiveProgram": "\u017dIV\u011a",
"LabelNewProgram": "NOVINKA",
"LabelPremiereProgram": "PREMI\u00c9RA",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Zm\u011bna typu obsahu",
"HeaderChangeFolderTypeHelp": "Chcete-li zm\u011bnit typ, vyjm\u011bte a znovu prohledejte knihovny s nov\u011b p\u0159i\u0159azen\u00fdm typem.",
@ -2335,12 +2342,12 @@
"ErrorAddingGuestAccount1": "Do\u0161lo k chyb\u011b p\u0159i p\u0159id\u00e1v\u00e1n\u00ed \u00fa\u010dtu Emby Connect. M\u00e1 v\u00e1\u0161 nov\u00fd u\u017eivatel vytvo\u0159en\u00fd \u00fa\u010det Emby? U\u017eivatel\u00e9 se mohou p\u0159ihl\u00e1sit na {0}.",
"ErrorAddingGuestAccount2": "Ujist\u011bte se pros\u00edm, \u017ee v\u00e1\u0161 nov\u00fd u\u017eivatel dokon\u010dil aktivaci dle pokyn\u016f z e-mailu zaslan\u00e9m po vytvo\u0159en\u00ed \u00fa\u010dtu. Jestli\u017ee nedostali takov\u00fd e-mail, pak pros\u00edm po\u0161lete email na {0}, a p\u0159ipojte svoj\u00ed e-mailovou adresu, stejn\u011b jako jejich.",
"GuestUserNotFound": "U\u017eivatel nenalezen. Pros\u00edm, ujist\u011bte se, \u017ee n\u00e1zev je spr\u00e1vn\u00fd a zkuste to znovu, nebo zkuste zadat jejich e-mailovou adresu.",
"MarkPlayed": "Mark played",
"MarkUnplayed": "Mark unplayed",
"Yesterday": "Yesterday",
"DownloadImagesInAdvanceWarning": "Downloading all images in advance will result in longer library scan times.",
"MetadataSettingChangeHelp": "Changing metadata settings will affect new content that is added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.",
"LabelTitle": "Title:",
"LabelOriginalTitle": "Original title:",
"LabelSortTitle": "Sort title:"
"MarkPlayed": "Ozna\u010dit p\u0159ehran\u00e9",
"MarkUnplayed": "Ozna\u010dit nep\u0159ehran\u00e9",
"Yesterday": "V\u010dera",
"DownloadImagesInAdvanceWarning": "St\u00e1hnut\u00ed v\u0161ech obr\u00e1zk\u016f p\u0159edem m\u016f\u017ee prodlou\u017eit skenov\u00e1n\u00ed knihovny.",
"MetadataSettingChangeHelp": "Zm\u011bna nastaven\u00ed metadat bude m\u00edt vliv na nov\u00fd obsah, kter\u00fd bude p\u0159id\u00e1v\u00e1n. Chcete-li aktualizovat st\u00e1vaj\u00edc\u00ed obsah, otev\u0159te obrazovku s detailem a klepn\u011bte na tla\u010d\u00edtko Aktualizovat, nebo prove\u010fte hromadnou aktualizaci pomoc\u00ed spr\u00e1vce metadat.",
"LabelTitle": "N\u00e1zev:",
"LabelOriginalTitle": "Origin\u00e1ln\u00ed n\u00e1zev:",
"LabelSortTitle": "T\u0159\u00eddit dle n\u00e1zvu:"
}

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Fors\u00e6ttes",
"OptionEnded": "F\u00e6rdig",
"HeaderAirDays": "Sendedage",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "S\u00f8ndag",
"OptionMonday": "Mandag",
"OptionTuesday": "Tirsdag",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Produktionslokationer",
"OptionBirthLocation": "F\u00f8dselssted",
"LabelAllChannels": "Alle kanaler",
"LabelLiveProgram": "DIREKTE",
"LabelNewProgram": "NY",
"LabelPremiereProgram": "PR\u00c6MIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "\u00c6ndre indholdstype",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Fortdauernd",
"OptionEnded": "Beendent",
"HeaderAirDays": "Ausstrahlungstage",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Sonntag",
"OptionMonday": "Montag",
"OptionTuesday": "Dienstag",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Produktionsst\u00e4tten",
"OptionBirthLocation": "Geburtsort",
"LabelAllChannels": "Alle Kan\u00e4le",
"LabelLiveProgram": "LIVE",
"LabelNewProgram": "NEU",
"LabelPremiereProgram": "PREMIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "\u00c4ndere Inhalte Typ",
"HeaderChangeFolderTypeHelp": "Um den Typ zu \u00e4ndern, bitte entferne die Bibliothek und erstelle sie mit dem neuen Medientyp erneut.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuing",
"OptionEnded": "Ended",
"HeaderAirDays": "Air Days",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Sunday",
"OptionMonday": "Monday",
"OptionTuesday": "Tuesday",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Production Locations",
"OptionBirthLocation": "Birth Location",
"LabelAllChannels": "All channels",
"LabelLiveProgram": "LIVE",
"LabelNewProgram": "NEW",
"LabelPremiereProgram": "PREMIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuing",
"OptionEnded": "Ended",
"HeaderAirDays": "Air Days",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Sunday",
"OptionMonday": "Monday",
"OptionTuesday": "Tuesday",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Production Locations",
"OptionBirthLocation": "Birth Location",
"LabelAllChannels": "All channels",
"LabelLiveProgram": "LIVE",
"LabelNewProgram": "NEW",
"LabelPremiereProgram": "PREMIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuing",
"OptionEnded": "Ended",
"HeaderAirDays": "Air Days",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Sunday",
"OptionMonday": "Monday",
"OptionTuesday": "Tuesday",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Production Locations",
"OptionBirthLocation": "Birth Location",
"LabelAllChannels": "All channels",
"LabelLiveProgram": "LIVE",
"LabelNewProgram": "NEW",
"LabelPremiereProgram": "PREMIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuing",
"OptionEnded": "Ended",
"HeaderAirDays": "Air Days",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Sunday",
"OptionMonday": "Monday",
"OptionTuesday": "Tuesday",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Production Locations",
"OptionBirthLocation": "Lugar de nacimiento",
"LabelAllChannels": "Todos los canales",
"LabelLiveProgram": "EN VIVO",
"LabelNewProgram": "NUEVO",
"LabelPremiereProgram": "ESTRENO",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuando",
"OptionEnded": "Finalizado",
"HeaderAirDays": "D\u00edas de Emisi\u00f3n",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Domingo",
"OptionMonday": "Lunes",
"OptionTuesday": "Martes",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Lugares de Producci\u00f3n",
"OptionBirthLocation": "Lugar de Nacimiento",
"LabelAllChannels": "Todos los canales",
"LabelLiveProgram": "EN VIVO",
"LabelNewProgram": "NUEVO",
"LabelPremiereProgram": "ESTRENO",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Cambiar Tipo de Contenido",
"HeaderChangeFolderTypeHelp": "Para cambiar el tipo, por favor elimine y reconstruya la biblioteca con el nuevo tipo.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuando",
"OptionEnded": "Finalizado",
"HeaderAirDays": "Dias al aire",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Domingo",
"OptionMonday": "Lunes",
"OptionTuesday": "Martes",
@ -1381,150 +1388,150 @@
"OptionEnableFullSpeedConversionHelp": "Por defecto, la conversi\u00f3n de las sinronizaciones se realiza a baja velocidad para minimizar el uso de recursos.",
"HeaderPlaylists": "Listas de reproducci\u00f3n",
"HeaderViewStyles": "Estilos de vistas",
"LabelSelectViewStyles": "Enable enhanced presentations for:",
"LabelSelectViewStylesHelp": "If enabled, views will be built with metadata to offer categories such as Suggestions, Latest, Genres, and more. If disabled, they'll be displayed with simple folders.",
"TabPhotos": "Photos",
"TabVideos": "Videos",
"HeaderWelcomeToEmby": "Welcome to Emby",
"EmbyIntroMessage": "With Emby you can easily stream videos, music and photos to smart phones, tablets and other devices from your Emby Server.",
"ButtonSkip": "Skip",
"TextConnectToServerManually": "Connect to server manually",
"ButtonSignInWithConnect": "Sign in with Emby Connect",
"ButtonConnect": "Connect",
"LabelSelectViewStyles": "Activar presentaciones mejoradas para:",
"LabelSelectViewStylesHelp": "Si est\u00e1 activado, las vistas se generar\u00e1n con los metadatos para ofrecer categor\u00edas cono Sugerencias, \u00daltimos, G\u00e9neros, y m\u00e1s. Si est\u00e1 desactivado, se mostrar\u00e1n como simples carpetas.",
"TabPhotos": "Fotos",
"TabVideos": "V\u00eddeos",
"HeaderWelcomeToEmby": "Bienvenido a Emby",
"EmbyIntroMessage": "Con Emby puedes transmitir v\u00eddeos, m\u00fasica y fotos a smartphones, tablets y otros dispositivos desde tu servidor Emby.",
"ButtonSkip": "Saltar",
"TextConnectToServerManually": "Conectar al servidor manualmente",
"ButtonSignInWithConnect": "Inicia sesi\u00f3n con Emby Connect",
"ButtonConnect": "Conectar",
"LabelServerHost": "Host:",
"LabelServerHostHelp": "192.168.1.100 or https:\/\/myserver.com",
"LabelServerPort": "Port:",
"HeaderNewServer": "New Server",
"ButtonChangeServer": "Change Server",
"HeaderConnectToServer": "Connect to Server",
"OptionReportList": "List View",
"OptionReportStatistics": "Statistics",
"OptionReportGrouping": "Grouping",
"HeaderExport": "Export",
"HeaderColumns": "Columns",
"ButtonReset": "Reset",
"OptionEnableExternalVideoPlayers": "Enable external video players",
"ButtonUnlockGuide": "Unlock Guide",
"LabelEnableFullScreen": "Enable fullscreen mode",
"LabelEnableChromecastAc3Passthrough": "Enable Chromecast AC3 Passthrough",
"OptionSyncToSDCard": "Synced to external SD card",
"LabelEmail": "Email:",
"LabelUsername": "Username:",
"HeaderSignUp": "Sign Up",
"LabelPasswordConfirm": "Password (confirm):",
"ButtonAddServer": "Add Server",
"TabHomeScreen": "Home Screen",
"HeaderDisplay": "Display",
"HeaderNavigation": "Navigation",
"LegendTheseSettingsShared": "These settings are shared on all devices",
"OptionEnableAutomaticServerUpdates": "Enable automatic server updates",
"OptionOtherTrailers": "Include trailers from older movies",
"HeaderOverview": "Overview",
"HeaderShortOverview": "Short Overview",
"HeaderType": "Type",
"HeaderSeverity": "Severity",
"OptionReportActivities": "Activities Log",
"HeaderTunerDevices": "Tuner Devices",
"ButtonAddDevice": "Add Device",
"HeaderAddDevice": "Add Device",
"HeaderExternalServices": "External Services",
"LabelTunerIpAddress": "Tuner IP Address:",
"TabExternalServices": "External Services",
"TabTuners": "Tuners",
"HeaderGuideProviders": "Guide Providers",
"AddGuideProviderHelp": "Add a source for TV Guide information",
"LabelZipCode": "Zip Code:",
"GuideProviderSelectListings": "Select Listings",
"LabelServerHostHelp": "192.168.1.100 o https:\/\/miservidor.com",
"LabelServerPort": "Puerto:",
"HeaderNewServer": "Nuevo servidor",
"ButtonChangeServer": "Cambiar servidor",
"HeaderConnectToServer": "Conectar al servidor",
"OptionReportList": "Vista de lista",
"OptionReportStatistics": "Estad\u00edsticas",
"OptionReportGrouping": "Agrupamientos",
"HeaderExport": "Exportar",
"HeaderColumns": "Columnas",
"ButtonReset": "Reestablecer",
"OptionEnableExternalVideoPlayers": "Activar reproductores externos",
"ButtonUnlockGuide": "Gu\u00eda de desbloqueo",
"LabelEnableFullScreen": "Activar modo pantalla completa",
"LabelEnableChromecastAc3Passthrough": "Activar el traspaso de AC3 al Chromecast",
"OptionSyncToSDCard": "Sincronizado a la tarjeta SD externa",
"LabelEmail": "Correo:",
"LabelUsername": "Nombre de usuario:",
"HeaderSignUp": "Registrarse",
"LabelPasswordConfirm": "Contrase\u00f1a (Confirmar):",
"ButtonAddServer": "A\u00f1adir servidor",
"TabHomeScreen": "Pantalla de inicio",
"HeaderDisplay": "Mostrar",
"HeaderNavigation": "Navegaci\u00f3n",
"LegendTheseSettingsShared": "Estos ajustes se comparten en todos los dispositivos",
"OptionEnableAutomaticServerUpdates": "Activar actualizaciones autom\u00e1ticas del servidor",
"OptionOtherTrailers": "Incluir tr\u00e1ilers de pel\u00edculas antiguas",
"HeaderOverview": "Resumen",
"HeaderShortOverview": "Resumen corto",
"HeaderType": "Tipo",
"HeaderSeverity": "Severidad",
"OptionReportActivities": "Registro de actividades",
"HeaderTunerDevices": "Sintonizadores",
"ButtonAddDevice": "A\u00f1adir dispositivo",
"HeaderAddDevice": "A\u00f1adir dispositivo",
"HeaderExternalServices": "Servicios externos",
"LabelTunerIpAddress": "IP del sintonizador:",
"TabExternalServices": "Servicios externos",
"TabTuners": "Sintonizadores",
"HeaderGuideProviders": "Proveedores de gu\u00edas",
"AddGuideProviderHelp": "A\u00f1adir una fuente para la gu\u00eda de TV",
"LabelZipCode": "C\u00f3digo Zip:",
"GuideProviderSelectListings": "Seleccionar listados",
"GuideProviderLogin": "Login",
"LabelLineup": "Lineup:",
"MessageTunerDeviceNotListed": "Is your tuner device not listed? Try installing an external service provider for more Live TV options.",
"LabelImportOnlyFavoriteChannels": "Restrict to channels marked as favorite",
"ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favorite on the tuner device will be imported.",
"ButtonRepeat": "Repeat",
"LabelEnableThisTuner": "Enable this tuner",
"LabelEnableThisTunerHelp": "Uncheck to prevent importing channels from this tuner.",
"HeaderLocked": "Locked",
"HeaderUnidentified": "Unidentified",
"HeaderImagePrimary": "Primary",
"HeaderImageBackdrop": "Backdrop",
"LabelLineup": "Reparto:",
"MessageTunerDeviceNotListed": "\u00bfNo ves tu sintonizador?, int\u00e9ntalo de nuevo a\u00f1adiendo un proveedor externo para tener m\u00e1s opciones de TV en vivo.",
"LabelImportOnlyFavoriteChannels": "Reestringir a los canales marcados como favoritos",
"ImportFavoriteChannelsHelp": "Si est\u00e1 activado, s\u00f3lo los canales guardados como favoritos en el sintonizador se importar\u00e1n.",
"ButtonRepeat": "Repetir",
"LabelEnableThisTuner": "Activar este sintonizador",
"LabelEnableThisTunerHelp": "Desmarca para evitar que se importen canales desde este sintonizador.",
"HeaderLocked": "Bloqueado",
"HeaderUnidentified": "Sin identificar",
"HeaderImagePrimary": "Principal",
"HeaderImageBackdrop": "Fondo",
"HeaderImageLogo": "Logo",
"HeaderUserPrimaryImage": "User Image",
"ButtonDisplaySettings": "Display settings",
"ButtonHomeScreenSettings": "Home screen settings",
"ButtonPlaybackSettings": "Playback settings",
"ButtonProfile": "Profile",
"ButtonDisplaySettingsHelp": "Your Emby display settings",
"ButtonHomeScreenSettingsHelp": "Configure the display of your home screen",
"ButtonPlaybackSettingsHelp": "Specify your audio and subtitle preferences, streaming quality, and more.",
"ButtonProfileHelp": "Set your profile image and password.",
"HeaderHomeScreenSettings": "Home Screen settings",
"HeaderProfile": "Profile",
"HeaderLanguage": "Language",
"ButtonSyncSettings": "Sync settings",
"ButtonSyncSettingsHelp": "Configure your sync settings",
"LabelTranscodingThreadCount": "Transcoding thread count:",
"LabelTranscodingThreadCountHelp": "Select the maximum number of threads to use when transcoding. Reducing the thread count will lower cpu usage but may not convert fast enough for a smooth playback experience.",
"OptionMax": "Max",
"HeaderEmbyGuide": "Emby Guide",
"LabelSyncPath": "Synced content path:",
"OptionSyncOnlyOnWifi": "Sync only on Wifi",
"OptionSyncLosslessAudioOriginal": "Sync lossless audio at original quality",
"HeaderMetadata": "Metadata",
"HeaderRecordingOptions": "Recording Options",
"HeaderUpcomingForKids": "Upcoming for Kids",
"HeaderSetupLiveTV": "Setup Live TV",
"LabelTunerType": "Tuner type:",
"HelpMoreTunersCanBeAdded": "Additional tuners can be added later within the Live TV section.",
"AdditionalLiveTvProvidersCanBeInstalledLater": "Additional Live TV providers can be added later within the Live TV section.",
"MessageActiveSubscriptionRequiredSeriesRecordings": "An active Emby Premiere subscription is required in order to create automated series recordings.",
"HeaderSetupTVGuide": "Setup TV Guide",
"LabelDataProvider": "Data provider:",
"OptionSendRecordingsToAutoOrganize": "Enable Auto-Organize for new recordings",
"OptionSendRecordingsToAutoOrganizeHelp": "New recordings will be sent to the Auto-Organize feature and imported into your media library.",
"HeaderDefaultPadding": "Default Padding",
"HeaderUserPrimaryImage": "Imagen de usuario",
"ButtonDisplaySettings": "Opciones de visualizaci\u00f3n",
"ButtonHomeScreenSettings": "Ajustes de la pantalla de inicio",
"ButtonPlaybackSettings": "Ajustes de reproducci\u00f3n",
"ButtonProfile": "Perfil",
"ButtonDisplaySettingsHelp": "Tus ajustes de visualizaci\u00f3n de Emby",
"ButtonHomeScreenSettingsHelp": "Configura la visualizaci\u00f3n de tu pantalla de inicio",
"ButtonPlaybackSettingsHelp": "Especifica los ajustes de audio, subt\u00edtulos, calidad del streaming y m\u00e1s.",
"ButtonProfileHelp": "Establece tu contrase\u00f1a e imagen de perfil",
"HeaderHomeScreenSettings": "Ajustes de la pantalla de inicio",
"HeaderProfile": "Perfil",
"HeaderLanguage": "Idioma",
"ButtonSyncSettings": "Ajustes de sincronizaci\u00f3n",
"ButtonSyncSettingsHelp": "Configura tus ajustes de sincronizaci\u00f3n",
"LabelTranscodingThreadCount": "Cantidad de instancias de transcodificaci\u00f3n:",
"LabelTranscodingThreadCountHelp": "Selecciona el n\u00famero m\u00e1ximo de instancias de transcodificaci\u00f3n. Reducirlas disminuir\u00e1 la carga del procesador pero no convertir\u00e1 lo suficientemente r\u00e1pido para una reproducci\u00f3n fluida.",
"OptionMax": "M\u00e1ximo",
"HeaderEmbyGuide": "Gu\u00eda Emby",
"LabelSyncPath": "Ruta de contenido sincronizado:",
"OptionSyncOnlyOnWifi": "Sincronizar s\u00f3lo con Wifi",
"OptionSyncLosslessAudioOriginal": "Sincronizar audio sin p\u00e9rdidas en calidad original",
"HeaderMetadata": "Metadatos",
"HeaderRecordingOptions": "Ajustes de grabaci\u00f3n",
"HeaderUpcomingForKids": "Pr\u00f3ximamente para ni\u00f1os",
"HeaderSetupLiveTV": "Configurar TV en vivo",
"LabelTunerType": "Tipo de sintonizador:",
"HelpMoreTunersCanBeAdded": "Se puede a\u00f1adir m\u00e1s sintonizadores desde la secci\u00f3n de TV en vivo.",
"AdditionalLiveTvProvidersCanBeInstalledLater": "Se pueden a\u00f1adir mas proveedores de TV en vivo desde la secci\u00f3n de TV en vivo.",
"MessageActiveSubscriptionRequiredSeriesRecordings": "Se necesita una suscripci\u00f3n a Emby Premiere para poder crear grabaciones autom\u00e1ticas.",
"HeaderSetupTVGuide": "Configurar gu\u00eda de TV",
"LabelDataProvider": "Proveedor de datos:",
"OptionSendRecordingsToAutoOrganize": "Activar organizaci\u00f3n autom\u00e1tica para las nuevas grabaciones",
"OptionSendRecordingsToAutoOrganizeHelp": "Las nuevas grabaciones se enviar\u00e1n al organizador autom\u00e1tico y se importar\u00e1n a tu biblioteca.",
"HeaderDefaultPadding": "Relleno por defecto",
"HeaderSubtitles": "Subt\u00edtulos",
"HeaderVideos": "Videos",
"OptionEnableVideoFrameAnalysis": "Enable frame by frame video analysis",
"OptionEnableVideoFrameAnalysisHelp": "Extract detailed information about videos that can be used to make transcoding as efficient as possible. This will cause library scans to take longer.",
"LabelVideoFrameAnalysisLimit": "Limit frame by frame analysis to videos less than:",
"LabelHardwareAccelerationType": "Hardware acceleration:",
"LabelHardwareAccelerationTypeHelp": "Available on supported systems only.",
"ButtonServerDashboard": "Server Dashboard",
"HeaderAdmin": "Admin",
"ButtonSignOut": "Sign out",
"HeaderCameraUpload": "Camera Upload",
"SelectCameraUploadServers": "Upload camera photos to the following servers:",
"ButtonClear": "Clear",
"LabelFolder": "Folder:",
"HeadersFolders": "Folders",
"LabelDisplayName": "Display name:",
"HeaderNewRecording": "New Recording",
"ButtonAdvanced": "Advanced",
"LabelCodecIntrosPath": "Codec intros path:",
"LabelCodecIntrosPathHelp": "A folder containing video files. If an intro video file name matches the video codec, audio codec, audio profile, or a tag, then it will be played prior to the main feature.",
"OptionConvertRecordingsToStreamingFormat": "Automatically convert recordings to a streaming friendly format",
"OptionConvertRecordingsToStreamingFormatHelp": "Recordings will be converted on the fly to MP4 for easy playback on your devices.",
"FeatureRequiresEmbyPremiere": "This feature requires an active Emby Premiere subscription.",
"FileExtension": "File extension",
"OptionReplaceExistingImages": "Replace existing images",
"OptionPlayNextEpisodeAutomatically": "Play next episode automatically",
"OptionDownloadImagesInAdvance": "Download all images in advance",
"HeaderVideos": "V\u00eddeos",
"OptionEnableVideoFrameAnalysis": "Activar an\u00e1lisis fotograma a fotograma",
"OptionEnableVideoFrameAnalysisHelp": "Extraer informaci\u00f3n detallada de los v\u00eddeos hace que la transcodificaci\u00f3n sea lo m\u00e1s eficiente posible. Los escaneos de la biblioteca tardar\u00e1n m\u00e1s.",
"LabelVideoFrameAnalysisLimit": "Limitar an\u00e1lisis fotograma a fotograma a menos de:",
"LabelHardwareAccelerationType": "Aceleraci\u00f3n por hardware:",
"LabelHardwareAccelerationTypeHelp": "Disponible s\u00f3lo en sistemas soportados.",
"ButtonServerDashboard": "Panel de control del servidor",
"HeaderAdmin": "Administrador",
"ButtonSignOut": "Desconectarse",
"HeaderCameraUpload": "Subidas de la c\u00e1mara",
"SelectCameraUploadServers": "Subir fotos de la c\u00e1mara a los siguientes servidores:",
"ButtonClear": "Limpiar",
"LabelFolder": "Carpeta:",
"HeadersFolders": "Carpetas:",
"LabelDisplayName": "Mostrar nombre:",
"HeaderNewRecording": "Nueva grabaci\u00f3n",
"ButtonAdvanced": "Avanzado",
"LabelCodecIntrosPath": "Ruta de las c\u00f3dec intros:",
"LabelCodecIntrosPathHelp": "Una carpeta que contenga v\u00eddeos. Si el nombre de un archivo de intro coincide con el c\u00f3dec de v\u00eddeo, audio, perfil de audio, o etiqueta, se reproducir\u00e1 antes que la caracter\u00edstica principal.",
"OptionConvertRecordingsToStreamingFormat": "Convertir grabaciones autom\u00e1ticamente a un formato amigable",
"OptionConvertRecordingsToStreamingFormatHelp": "Las grabaciones se convertir\u00e1n en tiempo real a MP4 para una reproducci\u00f3n sencilla desde tus dispositivos.",
"FeatureRequiresEmbyPremiere": "Esta caracter\u00edstica necesita una suscripci\u00f3n a Emby Premiere.",
"FileExtension": "Extensi\u00f3n del archivo",
"OptionReplaceExistingImages": "Reemplazar im\u00e1genes existentes",
"OptionPlayNextEpisodeAutomatically": "Reproducir siguiente episodio autom\u00e1ticamente",
"OptionDownloadImagesInAdvance": "Descargar todas las im\u00e1genes antes",
"SettingsSaved": "Configuraci\u00f3n guardada",
"OptionDownloadImagesInAdvanceHelp": "By default, most secondary images are only downloaded when requested by an Emby app. Enable this option to download all images in advance, as new media is imported.",
"OptionDownloadImagesInAdvanceHelp": "Por defecto las im\u00e1genes secundarias se descargan s\u00f3lo cuando una aplicaci\u00f3n de Emby las requiere. Activa esta opci\u00f3n para descargar todas las im\u00e1genes antes, conforme se a\u00f1aden medios.",
"Users": "Usuarios",
"Delete": "Borrar",
"Administrator": "Administrador",
"Password": "Contrase\u00f1a",
"DeleteImage": "Borrar Imagen",
"MessageThankYouForSupporting": "Thank you for supporting Emby.",
"MessagePleaseSupportProject": "Please support Emby.",
"MessageThankYouForSupporting": "Gracias por apoyar a Emby.",
"MessagePleaseSupportProject": "Por favor da tu apoyo a Emby.",
"DeleteImageConfirmation": "Est\u00e1 seguro que desea borrar esta imagen?",
"FileReadCancelled": "The file read has been canceled.",
"FileReadCancelled": "La lectura del archivo se ha cancelado.",
"FileNotFound": "Archivo no encontrado.",
"FileReadError": "Se encontr\u00f3 un error al leer el archivo.",
"DeleteUser": "Borrar Usuario",
"DeleteUserConfirmation": "Are you sure you wish to delete this user?",
"PasswordResetHeader": "Reset Password",
"DeleteUserConfirmation": "\u00bfEst\u00e1s seguro de que quieres borrar este usuario?",
"PasswordResetHeader": "Reestablecer contrase\u00f1a",
"PasswordResetComplete": "La contrase\u00f1a se ha restablecido.",
"PinCodeResetComplete": "El c\u00f3digo PIN se ha restablecido.",
"PasswordResetConfirmation": "Esta seguro que desea restablecer la contrase\u00f1a?",
@ -1540,45 +1547,45 @@
"HeaderNewApiKey": "Nueva Clave Api",
"LabelAppName": "Nombre de la app",
"LabelAppNameExample": "Ejemplo: Sickbeard, NzbDrone",
"HeaderNewApiKeyHelp": "Grant an application permission to communicate with Emby Server.",
"HeaderNewApiKeyHelp": "Permitir que una aplicaci\u00f3n se comunique con el servidor Emby.",
"MessageKeyEmailedTo": "Clave enviada por email a {0}.",
"MessageKeysLinked": "Claves vinculadas.",
"HeaderConfirmation": "Confirmaci\u00f3n",
"MessageKeyUpdated": "Thank you. Your Emby Premiere key has been updated.",
"MessageKeyRemoved": "Thank you. Your Emby Premiere key has been removed.",
"MessageKeyUpdated": "Gracias. Tu clave de Emby Premiere se ha actualizado.",
"MessageKeyRemoved": "Gracias. Tu clave de Emby Premiere se ha eliminado.",
"TextEnjoyBonusFeatures": "Disfrute los extras",
"ButtonCancelSyncJob": "Cancel sync",
"HeaderAddTag": "Add Tag",
"LabelTag": "Tag:",
"ButtonSelectView": "Select view",
"ButtonCancelSyncJob": "Cancelar sincronizaci\u00f3n",
"HeaderAddTag": "A\u00f1adir etiqueta",
"LabelTag": "Etiqueta:",
"ButtonSelectView": "Seleccionar vista",
"HeaderSelectDate": "Seleccionar Fecha",
"ServerUpdateNeeded": "This Emby Server needs to be updated. To download the latest version, please visit {0}",
"HeaderIdentifyItem": "Identify Item",
"ServerUpdateNeeded": "El servidor necesita actualizarse. Para descargar la \u00faltima versi\u00f3n visita {0}",
"HeaderIdentifyItem": "Identificar \u00edtem",
"LabelRecurringDonationCanBeCancelledHelp": "Donaciones recurrentes se pueden cancelar en cualquier momento desde su cuenta de PayPal.",
"LabelFromHelp": "Example: {0} (on the server)",
"HeaderMyMedia": "My Media",
"ButtonRemoveFromCollection": "Remove from Collection",
"LabelAutomaticUpdateLevel": "Automatic update level:",
"LabelAutomaticUpdateLevelForPlugins": "Automatic update level for plugins:",
"LabelFromHelp": "Ejemplo: {0} (en el servidor)",
"HeaderMyMedia": "Mis medios",
"ButtonRemoveFromCollection": "Quitar de la colecci\u00f3n",
"LabelAutomaticUpdateLevel": "Actualizar autom\u00e1ticamente nivel:",
"LabelAutomaticUpdateLevelForPlugins": "Actualizar autom\u00e1ticamente nivel para los plugins:",
"ErrorLaunchingChromecast": "Ha habido un error al lanzar chromecast. Asegurese que su dispositivo est\u00e1 conectado a su red inal\u00e1mbrica.",
"MessageErrorLoadingSupporterInfo": "There was an error loading Emby Premiere information. Please try again later.",
"MessageLinkYourSupporterKey": "Link your Emby Premiere key with up to {0} Emby Connect members to enjoy free access to the following apps:",
"HeaderConfirmRemoveUser": "Remove User",
"MessageConfirmRemoveConnectSupporter": "Are you sure you wish to remove additional Emby Premiere benefits from this user?",
"ValueTimeLimitSingleHour": "Time limit: 1 hour",
"ValueTimeLimitMultiHour": "Time limit: {0} hours",
"MessageErrorLoadingSupporterInfo": "Ha habido un error cargando la informaci\u00f3n de Emby Premiere. Por favor int\u00e9ntelo otra vez m\u00e1s tarde.",
"MessageLinkYourSupporterKey": "Conecta tu clave de Emby Premiere hasta con {0} miembros de Emby Connect para disfrutar del acceso gratuito a las siguientes aplicaciones:",
"HeaderConfirmRemoveUser": "Quitar usuario",
"MessageConfirmRemoveConnectSupporter": "\u00bfEst\u00e1s seguro de que quieres quitar los beneficios de Emby Premiere de este usuario?",
"ValueTimeLimitSingleHour": "Tiempo l\u00edmite: 1 hora",
"ValueTimeLimitMultiHour": "Tiempo l\u00edmite: {0} hora",
"PluginCategoryGeneral": "General",
"PluginCategoryContentProvider": "Content Providers",
"PluginCategoryScreenSaver": "Screen Savers",
"PluginCategoryTheme": "Themes",
"PluginCategorySync": "Sync",
"PluginCategorySocialIntegration": "Social Networks",
"PluginCategoryNotifications": "Notifications",
"PluginCategoryMetadata": "Metadata",
"PluginCategoryLiveTV": "Live TV",
"PluginCategoryChannel": "Channels",
"PluginCategoryContentProvider": "Preveedores de contenidos",
"PluginCategoryScreenSaver": "Salvapantallas",
"PluginCategoryTheme": "Temas",
"PluginCategorySync": "Sincronizar",
"PluginCategorySocialIntegration": "Redes sociales",
"PluginCategoryNotifications": "Notificaciones",
"PluginCategoryMetadata": "Metadatos",
"PluginCategoryLiveTV": "TV en vivo",
"PluginCategoryChannel": "Canales",
"HeaderSearch": "Buscar",
"ValueDateCreated": "Date created: {0}",
"ValueDateCreated": "Fecha de creaci\u00f3n: {0}",
"LabelArtist": "Artista",
"LabelMovie": "Pel\u00edcula",
"LabelMusicVideo": "Video Musical",
@ -1587,61 +1594,61 @@
"LabelStopping": "Deteniendo",
"LabelCancelled": "Cancelado",
"ButtonDownload": "Descargar",
"SyncJobStatusQueued": "Queued",
"SyncJobStatusConverting": "Converting",
"SyncJobStatusFailed": "Failed",
"SyncJobStatusCancelled": "Cancelled",
"SyncJobStatusCompleted": "Synced",
"SyncJobStatusReadyToTransfer": "Ready to Transfer",
"SyncJobStatusTransferring": "Transferring",
"SyncJobStatusCompletedWithError": "Synced with errors",
"SyncJobItemStatusReadyToTransfer": "Ready to Transfer",
"LabelCollection": "Collection",
"SyncJobStatusQueued": "En cola",
"SyncJobStatusConverting": "Convirtiendo",
"SyncJobStatusFailed": "Fallado",
"SyncJobStatusCancelled": "Cancelado",
"SyncJobStatusCompleted": "Sincronizado",
"SyncJobStatusReadyToTransfer": "Listo para transferir",
"SyncJobStatusTransferring": "Transfiriendo",
"SyncJobStatusCompletedWithError": "Sincronizado con errores",
"SyncJobItemStatusReadyToTransfer": "Listo para transferir",
"LabelCollection": "Colecci\u00f3n",
"HeaderAddToCollection": "A\u00f1adir a la colecci\u00f3n",
"NewCollectionNameExample": "Ejemplo: Colecci\u00f3n de Star Wars",
"OptionSearchForInternetMetadata": "Buscar en internet ilustraciones y metadatos",
"LabelSelectCollection": "Seleccionar colecci\u00f3n:",
"HeaderDevices": "Devices",
"ButtonScheduledTasks": "Scheduled tasks",
"MessageItemsAdded": "Items added",
"HeaderSelectCertificatePath": "Select Certificate Path",
"ConfirmMessageScheduledTaskButton": "This operation normally runs automatically as a scheduled task and does not require any manual effort. To configure the scheduled task, see:",
"HeaderSupporterBenefit": "An active Emby Premiere subscription provides additional benefits such as access to sync, premium plugins, internet channel content, and more. {0}Learn more{1}.",
"LabelSyncNoTargetsHelp": "It looks like you don't currently have any apps that support sync.",
"HeaderWelcomeToProjectServerDashboard": "Welcome to the Emby Server Dashboard",
"HeaderWelcomeToProjectWebClient": "Welcome to Emby",
"HeaderDevices": "Dispositivos",
"ButtonScheduledTasks": "Tareas programadas",
"MessageItemsAdded": "Items a\u00f1adidos",
"HeaderSelectCertificatePath": "Elige la ruta del certificado",
"ConfirmMessageScheduledTaskButton": "Esta operaci\u00f3n normalmente se ejecuta autom\u00e1ticamente como una tarea programada y no se necesita hacerlo manualmente. Para configurar la tarea programada ve a:",
"HeaderSupporterBenefit": "Una suscripci\u00f3n de Emby Premiere proporciona beneficios adicionales como la sincronizaci\u00f3n, plugins premium, contenido por internet de los canales, y m\u00e1s. {0}Aprende m\u00e1s{1}.",
"LabelSyncNoTargetsHelp": "Parece que no tienes aplicaciones que soporten la sincronizaci\u00f3n.",
"HeaderWelcomeToProjectServerDashboard": "Bienvenido al panel de control del servidor Emby",
"HeaderWelcomeToProjectWebClient": "Bienvenido a Emby",
"ButtonTakeTheTour": "Hacer un recorrido",
"HeaderWelcomeBack": "Welcome back!",
"ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new",
"MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.",
"HeaderSelectDevices": "Select Devices",
"ButtonCancelItem": "Cancel item",
"ButtonQueueForRetry": "Queue for retry",
"ButtonReenable": "Re-enable",
"SyncJobItemStatusSyncedMarkForRemoval": "Marked for removal",
"HeaderWelcomeBack": "\u00a1Bienvenido de nuevo!",
"ButtonTakeTheTourToSeeWhatsNew": "Da un paseo para ver que hay nuevo",
"MessageNoSyncJobsFound": "No se han encontrado trabajos de sincronizaci\u00f3n. Cr\u00e9alos usando los botones de sincronizaci\u00f3n que se encuentran a trav\u00e9s de la interfaz web.",
"HeaderSelectDevices": "Elegir dispositivos",
"ButtonCancelItem": "Cancelar \u00edtem",
"ButtonQueueForRetry": "En cola para reintentar",
"ButtonReenable": "Reactivar",
"SyncJobItemStatusSyncedMarkForRemoval": "Marcado para quitar",
"LabelAbortedByServerShutdown": "(Abortado por cierre del servidor)",
"LabelScheduledTaskLastRan": "\u00daltima ejecuci\u00f3n {0}, teniendo {1}.",
"HeaderDeleteTaskTrigger": "Eliminar tarea de activaci\u00f3n",
"MessageDeleteTaskTrigger": "\u00bfEst\u00e1 seguro que desea eliminar esta tarea de activaci\u00f3n?",
"MessageNoPluginsInstalled": "No tiene plugins instalados.",
"MessageNoPluginsDueToAppStore": "To manage plugins, please use the Emby web app.",
"MessageNoPluginsDueToAppStore": "Para administrar los plugins usa la interfaz web de Emby",
"LabelVersionInstalled": "{0} instalado",
"LabelNumberReviews": "{0} Revisiones",
"LabelFree": "Libre",
"HeaderPlaybackError": "Playback Error",
"MessagePlaybackErrorNotAllowed": "You're currently not authorized to play this content. Please contact your system administrator for details.",
"MessagePlaybackErrorNoCompatibleStream": "No compatible streams are currently available. Please try again later or contact your system administrator for details.",
"MessagePlaybackErrorRateLimitExceeded": "Your playback rate limit has been exceeded. Please contact your system administrator for details.",
"MessagePlaybackErrorPlaceHolder": "The content chosen is not playable from this device.",
"HeaderPlaybackError": "Error de reproducci\u00f3n",
"MessagePlaybackErrorNotAllowed": "No est\u00e1s autorizado a reproducir este contenido. Contacta con el administrador para m\u00e1s detalles.",
"MessagePlaybackErrorNoCompatibleStream": "No tienes disponible ninguna calidad por ahora. Int\u00e9ntalo m\u00e1s tarde o contacta con el administrador para m\u00e1s detalles.",
"MessagePlaybackErrorRateLimitExceeded": "Has sobrepasado el ratio l\u00edmite de reproducci\u00f3n. Contacta con el administrador para m\u00e1s detalles.",
"MessagePlaybackErrorPlaceHolder": "El contenido elegido no se puede reproducir desde este dispositivo.",
"HeaderSelectAudio": "Seleccionar Audio",
"HeaderSelectSubtitles": "Seleccionar Subt\u00edtulos",
"ButtonMarkForRemoval": "Remove from device",
"ButtonUnmarkForRemoval": "Cancel removal from device",
"ButtonMarkForRemoval": "Quitar del dispositivo",
"ButtonUnmarkForRemoval": "Cancelar quitar del dispositivo",
"LabelDefaultStream": "(Por defecto)",
"LabelForcedStream": "(Forzado)",
"LabelDefaultForcedStream": "(Por defecto\/Forzado)",
"LabelUnknownLanguage": "Idioma desconocido",
"MessageConfirmSyncJobItemCancellation": "Are you sure you wish to cancel this item?",
"MessageConfirmSyncJobItemCancellation": "\u00bfEst\u00e1s seguro de que quieres cancelar este \u00edtem?",
"ButtonMute": "Silencio",
"ButtonUnmute": "Activar audio",
"ButtonQueue": "En cola",
@ -1653,8 +1660,8 @@
"ButtonViewNotifications": "Ver notificaciones",
"ButtonMarkTheseRead": "Marcar como le\u00eddo",
"LabelAllPlaysSentToPlayer": "Todas las reproducciones se enviar\u00e1n al reproductor seleccionado.",
"MessageInvalidUser": "Invalid username or password. Please try again.",
"HeaderLoginFailure": "Login Failure",
"MessageInvalidUser": "Usuario o contrase\u00f1a inv\u00e1lidos. Por favor int\u00e9ntalo otra vez.",
"HeaderLoginFailure": "Fallo de inicio de sesi\u00f3n",
"RecommendationBecauseYouLike": "Como le gusta {0}",
"RecommendationBecauseYouWatched": "Ya que vi\u00f3 {0}",
"RecommendationDirectedBy": "Dirigida por {0}",
@ -1662,7 +1669,7 @@
"HeaderConfirmRecordingCancellation": "Confirmar la cancelaci\u00f3n de la grabaci\u00f3n",
"MessageConfirmRecordingCancellation": "\u00bfEst\u00e1 seguro que desea cancelar esta grabaci\u00f3n?",
"MessageRecordingCancelled": "Grabaci\u00f3n cancelada.",
"MessageRecordingScheduled": "Recording scheduled.",
"MessageRecordingScheduled": "Grabaci\u00f3n programada.",
"HeaderConfirmSeriesCancellation": "Confirmar cancelaci\u00f3n de serie",
"MessageConfirmSeriesCancellation": "\u00bfEst\u00e1 seguro que desea cancelar esta serie?",
"MessageSeriesCancelled": "Serie cancelada",
@ -1671,8 +1678,8 @@
"MessageRecordingDeleted": "Grabaci\u00f3n eliminada.",
"ButonCancelRecording": "Cancelar Grabaci\u00f3n",
"MessageRecordingSaved": "Grabaci\u00f3n guardada.",
"OptionWeekend": "Weekends",
"OptionWeekday": "Weekdays",
"OptionWeekend": "Fines de semana",
"OptionWeekday": "D\u00edas de semana",
"MessageConfirmPathSubstitutionDeletion": "\u00bfEst\u00e1 seguro que desea borrar esta ruta de sustituci\u00f3n?",
"LiveTvUpdateAvailable": "(Actualizaci\u00f3n disponible)",
"LabelVersionUpToDate": "\u00a1Actualizado!",
@ -1689,11 +1696,11 @@
"HeaderSplitMedia": "Divisi\u00f3n de medios",
"MessageConfirmSplitMedia": "\u00bfEst\u00e1 seguro que desea dividir los medios en partes separadas?",
"HeaderError": "Error",
"MessageChromecastConnectionError": "Your Chromecast receiver is unable to connect to your Emby Server. Please check their connections and try again.",
"MessageChromecastConnectionError": "Tu Chromecast no se puede conectar a tu servidor Emby. Comprueba las conexiones y prueba otra vez.",
"MessagePleaseSelectOneItem": "Seleccione al menos un elemento.",
"MessagePleaseSelectTwoItems": "Seleccione al menos dos elementos.",
"MessageTheSelectedItemsWillBeGrouped": "The selected videos will be grouped into one virtual item. Emby apps will automatically choose which version to play based on device and network performance. Are you sure you wish to continue?",
"HeaderLibraryFolders": "Media Folders",
"MessageTheSelectedItemsWillBeGrouped": "Los v\u00eddeos seleccionados se agrupar\u00e1n en uno s\u00f3lo virtual. Las aplicaciones de Emby elegir\u00e1n autom\u00e1ticamente qu\u00e9 versi\u00f3n reproducir en funci\u00f3n del dispositivo y la velocidad de internet. \u00bfQuieres continuar?",
"HeaderLibraryFolders": "Carpetas de medios",
"HeaderFavoriteMovies": "Pel\u00edculas favoritas",
"HeaderFavoriteShows": "Programas favoritos",
"HeaderFavoriteEpisodes": "Episodios favoritos",
@ -1705,7 +1712,7 @@
"HeaderSelectTranscodingPath": "Seleccione la ruta temporal del transcodificador",
"HeaderSelectImagesByNamePath": "Seleccione la ruta para im\u00e1genes",
"HeaderSelectMetadataPath": "Seleccione la ruta para Metadatos",
"HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable.",
"HeaderSelectServerCachePathHelp": "Navega o introduce la ruta para alojar los archivos cach\u00e9 del servidor. Tienes que tener permisos de escritura en esa carpeta.",
"HeaderSelectTranscodingPathHelp": "Busque o escriba la ruta de acceso que se utilizar\u00e1 para la transcodificaci\u00f3n de archivos temporales. La carpeta debe tener permiso de escritura.",
"HeaderSelectImagesByNamePathHelp": "Busque o escriba la ruta de sus elementos por nombre de carpeta. La carpeta debe tener permisos de escritura.",
"HeaderSelectMetadataPathHelp": "Busque o escriba la ruta donde desea almacenar los metadatos. La carpeta debe tener permiso de escritura.",
@ -1731,15 +1738,15 @@
"HeaderSelectWatchFolder": "Seleccionar carpeta para el reloj",
"HeaderSelectWatchFolderHelp": "Navegue o introduzca la ruta para la carpeta para el reloj. La carpeta debe tener permisos de escritura.",
"OrganizePatternResult": "Resultado: {0}",
"AutoOrganizeError": "Error Organizing File",
"FileOrganizeManually": "Organize File",
"ErrorOrganizingFileWithErrorCode": "There was an error organizing the file. Error code: {0}.",
"AutoOrganizeError": "Error al organizar el archivo",
"FileOrganizeManually": "Organizar el archivo",
"ErrorOrganizingFileWithErrorCode": "Ha habido un error al organizar el archivo. C\u00f3digo de error: {0}.",
"HeaderRestart": "Reiniciar",
"HeaderShutdown": "Apagar",
"MessageConfirmRestart": "Are you sure you wish to restart Emby Server?",
"MessageConfirmShutdown": "Are you sure you wish to shutdown Emby Server?",
"ValueItemCount": "{0} item",
"ValueItemCountPlural": "{0} items",
"MessageConfirmRestart": "\u00bfEst\u00e1s seguro de que quieres reiniciar el servidor?",
"MessageConfirmShutdown": "\u00bfEst\u00e1s seguro de que quieres apagar el servidor?",
"ValueItemCount": "\u00edtem {0}",
"ValueItemCountPlural": "\u00edtems {0}",
"NewVersionOfSomethingAvailable": "\u00a1Hay disponible una nueva versi\u00f3n de {0}!",
"VersionXIsAvailableForDownload": "La versi\u00f3n {0} est\u00e1 disponible para su descarga.",
"LabelVersionNumber": "Versi\u00f3n {0}",
@ -1748,10 +1755,10 @@
"LabelPlayMethodDirectPlay": "Reproducci\u00f3n directa",
"LabelAudioCodec": "Audio: {0}",
"LabelVideoCodec": "Video: {0}",
"LabelLocalAccessUrl": "Local access: {0}",
"LabelLocalAccessUrl": "Acceso local: {0}",
"LabelRemoteAccessUrl": "Acceso remoto: {0}",
"LabelRunningOnPort": "Running on http port {0}.",
"LabelRunningOnPorts": "Running on http port {0}, and https port {1}.",
"LabelRunningOnPort": "Ejecut\u00e1ndose en el puerto http {0}.",
"LabelRunningOnPorts": "Ejecut\u00e1ndose en el puerto http {0}, y puerto https {1}.",
"HeaderLatestFromChannel": "Lo \u00faltimo de {0}",
"LabelUnknownLanaguage": "Idioma desconocido",
"HeaderCurrentSubtitles": "Subt\u00edtulos actuales",
@ -1761,11 +1768,11 @@
"HeaderLatestTvRecordings": "\u00daltimas grabaciones",
"LabelCurrentPath": "Ruta actual:",
"HeaderSelectMediaPath": "Seleccionar la ruta para Medios",
"HeaderSelectPath": "Select Path",
"HeaderSelectPath": "Elige ruta",
"ButtonNetwork": "Red",
"MessageDirectoryPickerInstruction": "Rutas de red pueden ser introducidas manualmente en el caso de que el bot\u00f3n de la red no pueda localizar sus dispositivos. Por ejemplo, {0} o {1}.",
"MessageDirectoryPickerBSDInstruction": "For BSD, you may need to configure storage within your FreeNAS Jail in order to allow Emby to access it.",
"MessageDirectoryPickerLinuxInstruction": "For Linux on Arch Linux, CentOS, Debian, Fedora, OpenSuse, or Ubuntu, you must grant the Emby system user at least read access to your storage locations.",
"MessageDirectoryPickerBSDInstruction": "Para BSD, necesitar\u00e1s configurar el almacenamiento del \"FreeNAS Jail\" para poder permitir a Emby acceder a \u00e9l.",
"MessageDirectoryPickerLinuxInstruction": "Para Arch Linux, CentOS, Debian, Fedora, OpenSuse, o Ubuntu, tienes que permitir al usuario de Emby acceso de lectura a las ubicaciones de almacenamiento.",
"HeaderMenu": "Men\u00fa",
"ButtonOpen": "Abrir",
"ButtonOpenInNewTab": "Abrir en nueva pesta\u00f1a",
@ -1773,7 +1780,7 @@
"ButtonInstantMix": "Mix instant\u00e1neo",
"ButtonResume": "Continuar",
"HeaderAudioTracks": "Pistas de audio",
"HeaderLibraries": "Libraries",
"HeaderLibraries": "Blibliotecas",
"HeaderVideoQuality": "Calidad de video",
"MessageErrorPlayingVideo": "Ha habido un error reproduciendo el video.",
"MessageEnsureOpenTuner": "Aseg\u00farese que hay un sintonizador disponible.",
@ -1797,7 +1804,7 @@
"OptionBlockLiveTvChannels": "Canales de Tv en vivo",
"OptionBlockChannelContent": "Contenido de canales de Internet",
"ButtonRevoke": "Revocar",
"MessageConfirmRevokeApiKey": "Are you sure you wish to revoke this api key? The application's connection to Emby Server will be abruptly terminated.",
"MessageConfirmRevokeApiKey": "\u00bfEst\u00e1s seguro de que quieres revocar esta clave API? Las conexiones de aplicaciones que usen la API se terminar\u00e1n.",
"HeaderConfirmRevokeApiKey": "Revocar Clave Api",
"ValueContainer": "Contenedor: {0}",
"ValueAudioCodec": "Codec de audio: {0}",
@ -1814,18 +1821,18 @@
"ButtonMoveRight": "Mover derecha",
"ButtonBrowseOnlineImages": "Navegar im\u00e1genes online",
"HeaderDeleteItem": "Borrar elemento",
"ConfirmDeleteItem": "Deleting this item will delete it from both the file system and your media library. Are you sure you wish to continue?",
"HeaderDeleteItems": "Delete Items",
"ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?",
"ConfirmDeleteItem": "Al borrar este \u00edtem se borrar\u00e1 del sistema de archivos y de la biblioteca. \u00bfQuieres continuar?",
"HeaderDeleteItems": "Borrar \u00edtems",
"ConfirmDeleteItems": "Al borrar este \u00edtem se borrar\u00e1 del sistema de archivos y de la biblioteca. \u00bfQuieres continuar?",
"MessagePleaseEnterNameOrId": "Introduzca un nombre o un identificador externo.",
"MessageValueNotCorrect": "El valor introducido no es correcto. Intentelo de nuevo.",
"MessageItemSaved": "Elemento grabado.",
"MessagePleaseAcceptTermsOfServiceBeforeContinuing": "Please accept the terms of service before continuing.",
"MessagePleaseAcceptTermsOfServiceBeforeContinuing": "Por favor acepta los t\u00e9rminos del servicio antes de continuar.",
"OptionOff": "Apagado",
"OptionOn": "Encendido",
"ButtonUninstall": "Uninstall",
"HeaderEnabledFields": "Enabled Fields",
"HeaderEnabledFieldsHelp": "Uncheck a field to lock it and prevent it's data from being changed.",
"ButtonUninstall": "Desinstalar",
"HeaderEnabledFields": "Campos activados",
"HeaderEnabledFieldsHelp": "Desmarca un campo para bloquearlo y evitar que se cambie su contenido.",
"HeaderLiveTV": "Tv en vivo",
"MissingLocalTrailer": "Falta trailer local.",
"MissingPrimaryImage": "Falta imagen principal.",
@ -1845,18 +1852,18 @@
"OptionProductionLocations": "Localizaciones de producci\u00f3n",
"OptionBirthLocation": "Lugar de nacimiento",
"LabelAllChannels": "Todos los canales",
"LabelLiveProgram": "EN VIVO",
"LabelNewProgram": "NUEVO",
"LabelPremiereProgram": "ESTRENO",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",
"HeaderAlert": "Alert",
"MessagePleaseRestart": "Please restart to finish updating.",
"MessagePleaseRefreshPage": "Please refresh this page to receive new updates from Emby Server.",
"ButtonHide": "Hide",
"MessageSettingsSaved": "Settings saved.",
"ButtonMyProfile": "My Profile",
"HeaderChangeFolderType": "Cambiar tipo de contenido",
"HeaderChangeFolderTypeHelp": "Para cambiar el tipo de contenido por favor elimina y reconstruye la biblioteca con el nuevo tipo.",
"HeaderAlert": "Alerta",
"MessagePleaseRestart": "Por favor reinicie para terminar la actualizaci\u00f3n.",
"MessagePleaseRefreshPage": "Actualice la p\u00e1gina para ver las nuevas actualizaciones del servidor Emby.",
"ButtonHide": "Esconder",
"MessageSettingsSaved": "Ajustes guardados.",
"ButtonMyProfile": "Mi Perfil",
"ButtonMyPreferences": "My Preferences",
"MessageBrowserDoesNotSupportWebSockets": "This browser does not support web sockets. For a better experience, try a newer browser such as Chrome, Firefox, IE10+, Safari (iOS) or Opera.",
"LabelInstallingPackage": "Installing {0}",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuing",
"OptionEnded": "Ended",
"HeaderAirDays": "Air Days",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Sunday",
"OptionMonday": "Monday",
"OptionTuesday": "Tuesday",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Production Locations",
"OptionBirthLocation": "Birth Location",
"LabelAllChannels": "All channels",
"LabelLiveProgram": "LIVE",
"LabelNewProgram": "NEW",
"LabelPremiereProgram": "PREMIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

View file

@ -266,6 +266,13 @@
"OptionContinuing": "Continuing",
"OptionEnded": "Ended",
"HeaderAirDays": "Air Days",
"OptionSundayShort": "Sun",
"OptionMondayShort": "Mon",
"OptionTuesdayShort": "Tue",
"OptionWednesdayShort": "Wed",
"OptionThursdayShort": "Thu",
"OptionFridayShort": "Fri",
"OptionSaturdayShort": "Sat",
"OptionSunday": "Sunday",
"OptionMonday": "Monday",
"OptionTuesday": "Tuesday",
@ -1845,9 +1852,9 @@
"OptionProductionLocations": "Production Locations",
"OptionBirthLocation": "Birth Location",
"LabelAllChannels": "All channels",
"LabelLiveProgram": "LIVE",
"LabelNewProgram": "NEW",
"LabelPremiereProgram": "PREMIERE",
"AttributeNew": "New",
"AttributePremiere": "Premiere",
"AttributeLive": "Live",
"LabelHDProgram": "HD",
"HeaderChangeFolderType": "Change Content Type",
"HeaderChangeFolderTypeHelp": "To change the type, please remove and rebuild the library with the new type.",

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