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

update live streams

This commit is contained in:
Luke Pulverenti 2016-10-05 03:15:29 -04:00
parent 0d820807fa
commit f0eb199063
13 changed files with 194 additions and 36 deletions

View file

@ -1,3 +1,8 @@
button::-moz-focus-inner {
padding: 0;
border: 0
}
.card { .card {
border: 0; border: 0;
font-size: inherit !important; font-size: inherit !important;
@ -196,6 +201,20 @@
background-position: center bottom; background-position: center bottom;
} }
.cardImage-img {
max-height: 100%;
max-width: 100%;
align-self: flex-end;
position: static;
}
.coveredImage-img {
max-height: none;
max-width: none;
height: 100%;
width: 100%;
}
.coveredImage { .coveredImage {
background-size: 100% 100%; background-size: 100% 100%;
background-position: center center; background-position: center center;

View file

@ -712,18 +712,19 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
for (i = 0, length = lines.length; i < length; i++) { for (i = 0, length = lines.length; i < length; i++) {
var currentCssClass = cssClass;
var text = lines[i]; var text = lines[i];
if (i === 1 && isOuterFooter) { if (valid > 0 && isOuterFooter) {
cssClass += ' cardText-secondary'; currentCssClass += ' cardText-secondary';
} }
if (isOuterFooter && cardLayout) { if (isOuterFooter && cardLayout) {
cssClass += ' cardText-rightmargin'; currentCssClass += ' cardText-rightmargin';
} }
if (text) { if (text) {
html += "<div class='" + cssClass + "'>"; html += "<div class='" + currentCssClass + "'>";
html += text; html += text;
html += "</div>"; html += "</div>";
valid++; valid++;
@ -740,7 +741,8 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
return html; return html;
} }
function getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerClass, progressHtml, isOuterFooter) { var uniqueFooterIndex = 0;
function getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerClass, progressHtml, isOuterFooter, cardFooterId, vibrantSwatch) {
var html = ''; var html = '';
@ -982,7 +984,18 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
} }
if (html) { if (html) {
html = '<div class="' + footerClass + '">' + html;
var style = '';
if (options.vibrant && vibrantSwatch) {
var swatch = vibrantSwatch.split('|');
if (swatch.length) {
var index = 0;
style = ' style="color:' + swatch[index + 1] + ';background-color:' + swatch[index] + ';"';
}
}
html = '<div id="' + cardFooterId + '" class="' + footerClass + '"' + style + '>' + html;
//cardFooter //cardFooter
html += "</div>"; html += "</div>";
@ -1139,7 +1152,9 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
} }
var cardImageContainerClass = 'cardImageContainer'; var cardImageContainerClass = 'cardImageContainer';
if (options.coverImage || imgInfo.coverImage) { var coveredImage = options.coverImage || imgInfo.coverImage;
if (coveredImage) {
cardImageContainerClass += ' coveredImage'; cardImageContainerClass += ' coveredImage';
if (item.MediaType === 'Photo' || item.Type === 'PhotoAlbum' || item.Type === 'Folder' || item.ProgramInfo || item.Type === 'Program') { if (item.MediaType === 'Photo' || item.Type === 'PhotoAlbum' || item.Type === 'Folder' || item.ProgramInfo || item.Type === 'Program') {
@ -1167,10 +1182,13 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
var footerOverlayed = false; var footerOverlayed = false;
var cardFooterId = 'cardFooter' + uniqueFooterIndex;
uniqueFooterIndex++;
if (overlayText) { if (overlayText) {
footerCssClass = progressHtml ? 'innerCardFooter fullInnerCardFooter' : 'innerCardFooter'; footerCssClass = progressHtml ? 'innerCardFooter fullInnerCardFooter' : 'innerCardFooter';
innerCardFooter += getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, false); innerCardFooter += getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, false, cardFooterId);
footerOverlayed = true; footerOverlayed = true;
} }
else if (progressHtml) { else if (progressHtml) {
@ -1186,10 +1204,12 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
innerCardFooter += '<div class="mediaSourceIndicator">' + mediaSourceCount + '</div>'; innerCardFooter += '<div class="mediaSourceIndicator">' + mediaSourceCount + '</div>';
} }
var vibrantSwatch = options.vibrant && imgUrl ? imageLoader.getCachedVibrantInfo(imgUrl) : null;
var outerCardFooter = ''; var outerCardFooter = '';
if (!overlayText && !footerOverlayed) { if (!overlayText && !footerOverlayed) {
footerCssClass = options.cardLayout ? 'cardFooter visualCardBox-cardFooter' : 'cardFooter transparent'; footerCssClass = options.cardLayout ? 'cardFooter visualCardBox-cardFooter' : 'cardFooter transparent';
outerCardFooter = getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, true); outerCardFooter = getCardFooterText(item, apiClient, options, showTitle, forceName, overlayText, imgUrl, footerCssClass, progressHtml, true, cardFooterId, vibrantSwatch);
} }
if (outerCardFooter && !options.cardLayout && options.allowBottomPadding !== false) { if (outerCardFooter && !options.cardLayout && options.allowBottomPadding !== false) {
@ -1241,7 +1261,19 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
cardContentOpen = '<button type="button" class="clearButton cardContent itemAction" data-action="' + action + '">'; cardContentOpen = '<button type="button" class="clearButton cardContent itemAction" data-action="' + action + '">';
cardContentClose = '</button>'; cardContentClose = '</button>';
} }
if (options.vibrant && imgUrl && !vibrantSwatch) {
cardImageContainerOpen = imgUrl ? ('<div class="' + cardImageContainerClass + '">') : ('<div class="' + cardImageContainerClass + '">');
var imgClass = 'cardImage cardImage-img lazy';
if (coveredImage) {
imgClass += ' coveredImage-img';
}
cardImageContainerOpen += '<img class="' + imgClass + '" data-vibrant="' + cardFooterId + '" data-swatch="db" data-src="' + imgUrl + '" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" />';
} else {
cardImageContainerOpen = imgUrl ? ('<div class="' + cardImageContainerClass + ' lazy" data-src="' + imgUrl + '">') : ('<div class="' + cardImageContainerClass + '">'); cardImageContainerOpen = imgUrl ? ('<div class="' + cardImageContainerClass + ' lazy" data-src="' + imgUrl + '">') : ('<div class="' + cardImageContainerClass + '">');
}
var cardScalableClass = options.cardLayout ? 'cardScalable visualCardBox-cardScalable' : 'cardScalable'; var cardScalableClass = options.cardLayout ? 'cardScalable visualCardBox-cardScalable' : 'cardScalable';
cardImageContainerOpen = '<div class="' + cardBoxClass + '"><div class="' + cardScalableClass + '"><div class="cardPadder-' + options.shape + '"></div>' + cardContentOpen + cardImageContainerOpen; cardImageContainerOpen = '<div class="' + cardBoxClass + '"><div class="' + cardScalableClass + '"><div class="cardPadder-' + options.shape + '"></div>' + cardContentOpen + cardImageContainerOpen;
@ -1439,10 +1471,11 @@ define(['datetime', 'imageLoader', 'connectionManager', 'itemHelper', 'mediaInfo
playedIndicator = document.createElement('div'); playedIndicator = document.createElement('div');
playedIndicator.classList.add('playedIndicator'); playedIndicator.classList.add('playedIndicator');
playedIndicator.classList.add('indicator');
indicatorsElem = ensureIndicators(card, indicatorsElem); indicatorsElem = ensureIndicators(card, indicatorsElem);
indicatorsElem.appendChild(playedIndicator); indicatorsElem.appendChild(playedIndicator);
} }
playedIndicator.innerHTML = '<i class="md-icon">check</i>'; playedIndicator.innerHTML = '<i class="md-icon indicatorIcon">check</i>';
} else { } else {
playedIndicator = card.querySelector('.playedIndicator'); playedIndicator = card.querySelector('.playedIndicator');

View file

@ -1,16 +1,24 @@
define([], function () { define(['dom'], function (dom) {
function loadImage(elem, url) { function loadImage(elem, url) {
if (elem.tagName !== "IMG") { if (elem.tagName !== "IMG") {
elem.style.backgroundImage = "url('" + url + "')"; elem.style.backgroundImage = "url('" + url + "')";
return Promise.resolve(elem); return Promise.resolve();
} else {
elem.setAttribute("src", url);
return Promise.resolve(elem);
} }
return loadImageIntoImg(elem, url);
}
function loadImageIntoImg(elem, url) {
return new Promise(function (resolve, reject) {
dom.addEventListener(elem, 'load', resolve, {
once: true
});
elem.setAttribute("src", url);
});
} }
return { return {

View file

@ -1,4 +1,4 @@
define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser', 'dom'], function (visibleinviewport, imageFetcher, layoutManager, events, browser, dom) { define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser', 'dom', 'appSettings', 'vibrant'], function (visibleinviewport, imageFetcher, layoutManager, events, browser, dom, appSettings) {
var thresholdX; var thresholdX;
var thresholdY; var thresholdY;
@ -47,16 +47,105 @@ define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser
if (!source) { if (!source) {
source = elem.getAttribute('data-src'); source = elem.getAttribute('data-src');
} }
if (source) { if (source) {
imageFetcher.loadImage(elem, source).then(function () {
fillVibrant(elem, source);
if (enableFade && !layoutManager.tv && enableEffects !== false) { if (enableFade && !layoutManager.tv && enableEffects !== false) {
imageFetcher.loadImage(elem, source).then(fadeIn); fadeIn(elem);
} else {
imageFetcher.loadImage(elem, source);
} }
elem.removeAttribute("data-src"); elem.removeAttribute("data-src");
});
} }
} }
function fillVibrant(img, url) {
if (img.tagName != 'IMG') {
return;
}
var vibrantElement = img.getAttribute('data-vibrant');
if (!vibrantElement) {
return;
}
vibrantElement = document.getElementById(vibrantElement);
if (!vibrantElement) {
return;
}
var swatch = getVibrantInfo(img, url).split('|');
if (swatch.length) {
var index = 0;
vibrantElement.style['backgroundColor'] = swatch[index];
vibrantElement.style['color'] = swatch[index + 1];
}
/*
* Results into:
* Vibrant #7a4426
* Muted #7b9eae
* DarkVibrant #348945
* DarkMuted #141414
* LightVibrant #f3ccb4
*/
}
function getSettingsKey(url) {
return 'vibrant2-' + url.split('?')[0];
}
function getCachedVibrantInfo(url) {
return appSettings.get(getSettingsKey(url));
}
function getVibrantInfo(img, url) {
var value = getCachedVibrantInfo(url);
if (value) {
return value;
}
var vibrant = new Vibrant(img);
var swatches = vibrant.swatches();
value = '';
var swatch = swatches['DarkVibrant'];
if (swatch) {
value += swatch.getHex() + '|' + swatch.getBodyTextColor();
}
swatch = swatches['DarkMuted'];
if (swatch) {
value += '|' + swatch.getHex() + '|' + swatch.getBodyTextColor();
} else {
value += '||';
}
swatch = swatches['Vibrant'];
if (swatch) {
value += '|' + swatch.getHex() + '|' + swatch.getBodyTextColor();
} else {
value += '||';
}
swatch = swatches['Muted'];
if (swatch) {
value += '|' + swatch.getHex() + '|' + swatch.getBodyTextColor();
} else {
value += '||';
}
if (value) {
appSettings.set(getSettingsKey(url), value);
}
return value;
}
function fadeIn(elem) { function fadeIn(elem) {
var duration = layoutManager.tv ? 160 : 300; var duration = layoutManager.tv ? 160 : 300;
@ -268,6 +357,7 @@ define(['visibleinviewport', 'imageFetcher', 'layoutManager', 'events', 'browser
self.lazyImage = fillImage; self.lazyImage = fillImage;
self.lazyChildren = lazyChildren; self.lazyChildren = lazyChildren;
self.getPrimaryImageAspectRatio = getPrimaryImageAspectRatio; self.getPrimaryImageAspectRatio = getPrimaryImageAspectRatio;
self.getCachedVibrantInfo = getCachedVibrantInfo;
return self; return self;
}); });

View file

@ -420,6 +420,12 @@ div[data-role='page'] {
background-color: #fff; background-color: #fff;
} }
.ui-body-a .visualCardBox {
border: 0;
margin: 6px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.ui-body-a .cardFooter .cardText + .cardText { .ui-body-a .cardFooter .cardText + .cardText {
opacity: .8; opacity: .8;
} }

View file

@ -20,12 +20,6 @@
</div> </div>
<h1 style="margin-top:0;">${HeaderSchedule}</h1> <h1 style="margin-top:0;">${HeaderSchedule}</h1>
<div style="display:flex;align-items:center;margin:1em 0;justify-content:flex-end;">
<i class="md-icon" style="color:#cc3333;font-size:1.5em;">&#xE062;</i>
<div style="margin-left:.3em;">${WillRecord}</div>
<i class="md-icon" style="color:gray;font-size:1.5em;margin-left: 1em;">&#xE062;</i>
<div style="margin-left:.3em;">${NotScheduledToRecord}</div>
</div>
<div class="scheduleTab seriesTimerSchedule"> <div class="scheduleTab seriesTimerSchedule">
</div> </div>
</div> </div>

View file

@ -32,7 +32,7 @@
label: Globalize.translate('LabelFriendlyServerName'), label: Globalize.translate('LabelFriendlyServerName'),
description: Globalize.translate('LabelFriendlyServerNameHelp'), description: Globalize.translate('LabelFriendlyServerNameHelp'),
value: page.querySelector('.serverNameHeader').innerHTML, value: page.querySelector('.serverNameHeader').innerHTML,
submitText: Globalize.translate('ButtonSave') confirmText: Globalize.translate('ButtonSave')
}).then(function (value) { }).then(function (value) {

View file

@ -90,6 +90,7 @@
showChannelName: true, showChannelName: true,
lazy: true, lazy: true,
cardLayout: true, cardLayout: true,
vibrant: true,
action: 'edit', action: 'edit',
cardFooterAside: 'none', cardFooterAside: 'none',
preferThumb: true, preferThumb: true,

View file

@ -84,6 +84,7 @@
coverImage: true, coverImage: true,
lazy: true, lazy: true,
cardLayout: true, cardLayout: true,
vibrant: true,
allowBottomPadding: !enableScrollX(), allowBottomPadding: !enableScrollX(),
preferThumb: 'auto' preferThumb: 'auto'

View file

@ -35,6 +35,7 @@
shape: 'backdrop', shape: 'backdrop',
showTitle: true, showTitle: true,
cardLayout: true, cardLayout: true,
vibrant: true,
cardFooterAside: 'none', cardFooterAside: 'none',
preferThumb: true, preferThumb: true,
coverImage: true, coverImage: true,

View file

@ -75,7 +75,8 @@
require(['prompt'], function (prompt) { require(['prompt'], function (prompt) {
prompt({ prompt({
label: Globalize.translate('LabelNewName') label: Globalize.translate('LabelNewName'),
confirmText: Globalize.translate('ButtonRename')
}).then(function (newName) { }).then(function (newName) {
if (newName && newName != virtualFolder.Name) { if (newName && newName != virtualFolder.Name) {

View file

@ -113,7 +113,8 @@
lazy: true, lazy: true,
cardLayout: true, cardLayout: true,
showTitle: true, showTitle: true,
showYear: true showYear: true,
vibrant: true
}); });
} }
else if (viewStyle == "Banner") { else if (viewStyle == "Banner") {
@ -143,7 +144,8 @@
showTitle: true, showTitle: true,
showYear: true, showYear: true,
lazy: true, lazy: true,
cardLayout: true cardLayout: true,
vibrant: true
}); });
} }
else { else {

View file

@ -113,7 +113,8 @@
lazy: true, lazy: true,
cardLayout: true, cardLayout: true,
showTitle: true, showTitle: true,
showSeriesYear: true showSeriesYear: true,
vibrant: true
}); });
} }
else if (viewStyle == "Banner") { else if (viewStyle == "Banner") {
@ -143,7 +144,8 @@
showTitle: true, showTitle: true,
showYear: true, showYear: true,
lazy: true, lazy: true,
cardLayout: true cardLayout: true,
vibrant: true
}); });
} }
else { else {