mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-18 11:28:23 -07:00
236 lines
6.6 KiB
JavaScript
236 lines
6.6 KiB
JavaScript
define(['browser', 'css!./style'], function (browser) {
|
|
|
|
function enableAnimation(elem) {
|
|
|
|
if (browser.mobile) {
|
|
return false;
|
|
}
|
|
|
|
return elem.animate;
|
|
}
|
|
|
|
function backdrop() {
|
|
|
|
var self = this;
|
|
var isDestroyed;
|
|
|
|
self.load = function (url, parent, existingBackdropImage) {
|
|
|
|
var img = new Image();
|
|
img.onload = function () {
|
|
|
|
if (isDestroyed) {
|
|
return;
|
|
}
|
|
|
|
var backdropImage = document.createElement('div');
|
|
backdropImage.classList.add('backdropImage');
|
|
backdropImage.classList.add('displayingBackdropImage');
|
|
backdropImage.style.backgroundImage = "url('" + url + "')";
|
|
backdropImage.setAttribute('data-url', url);
|
|
|
|
parent.appendChild(backdropImage);
|
|
|
|
if (!enableAnimation(backdropImage)) {
|
|
if (existingBackdropImage && existingBackdropImage.parentNode) {
|
|
existingBackdropImage.parentNode.removeChild(existingBackdropImage);
|
|
}
|
|
internalBackdrop(true);
|
|
return;
|
|
}
|
|
|
|
var animation = fadeIn(backdropImage, 1);
|
|
currentAnimation = animation;
|
|
animation.onfinish = function () {
|
|
|
|
if (animation == currentAnimation) {
|
|
currentAnimation = null;
|
|
}
|
|
if (existingBackdropImage && existingBackdropImage.parentNode) {
|
|
existingBackdropImage.parentNode.removeChild(existingBackdropImage);
|
|
}
|
|
};
|
|
|
|
internalBackdrop(true);
|
|
};
|
|
img.src = url;
|
|
};
|
|
|
|
var currentAnimation;
|
|
function fadeIn(elem, iterations) {
|
|
var keyframes = [
|
|
{ opacity: '0', offset: 0 },
|
|
{ opacity: '1', offset: 1 }];
|
|
var timing = { duration: 800, iterations: iterations, easing: 'ease-in' };
|
|
return elem.animate(keyframes, timing);
|
|
}
|
|
|
|
function cancelAnimation() {
|
|
var animation = currentAnimation;
|
|
if (animation) {
|
|
console.log('Cancelling backdrop animation');
|
|
animation.cancel();
|
|
currentAnimation = null;
|
|
}
|
|
}
|
|
|
|
self.destroy = function () {
|
|
|
|
isDestroyed = true;
|
|
cancelAnimation();
|
|
};
|
|
}
|
|
|
|
var backdropContainer;
|
|
function getBackdropContainer() {
|
|
|
|
if (!backdropContainer) {
|
|
backdropContainer = document.querySelector('.backdropContainer');
|
|
}
|
|
|
|
if (!backdropContainer) {
|
|
backdropContainer = document.createElement('div');
|
|
backdropContainer.classList.add('backdropContainer');
|
|
document.body.insertBefore(backdropContainer, document.body.firstChild);
|
|
}
|
|
|
|
return backdropContainer;
|
|
}
|
|
|
|
function clearBackdrop(clearAll) {
|
|
|
|
if (currentLoadingBackdrop) {
|
|
currentLoadingBackdrop.destroy();
|
|
currentLoadingBackdrop = null;
|
|
}
|
|
|
|
var elem = getBackdropContainer();
|
|
elem.innerHTML = '';
|
|
|
|
if (clearAll) {
|
|
hasExternalBackdrop = false;
|
|
}
|
|
internalBackdrop(false);
|
|
}
|
|
|
|
var skinContainer;
|
|
function setSkinContainerBackgroundEnabled() {
|
|
|
|
if (!skinContainer) {
|
|
skinContainer = document.querySelector('.skinContainer');
|
|
}
|
|
|
|
if (hasInternalBackdrop || hasExternalBackdrop) {
|
|
skinContainer.classList.add('withBackdrop');
|
|
} else {
|
|
skinContainer.classList.remove('withBackdrop');
|
|
}
|
|
}
|
|
|
|
var hasInternalBackdrop;
|
|
function internalBackdrop(enabled) {
|
|
hasInternalBackdrop = enabled;
|
|
setSkinContainerBackgroundEnabled();
|
|
}
|
|
|
|
var hasExternalBackdrop;
|
|
function externalBackdrop(enabled) {
|
|
hasExternalBackdrop = enabled;
|
|
setSkinContainerBackgroundEnabled();
|
|
}
|
|
|
|
function getRandom(min, max) {
|
|
return Math.floor(Math.random() * (max - min) + min);
|
|
}
|
|
|
|
var currentLoadingBackdrop;
|
|
function setBackdropImage(url) {
|
|
|
|
if (currentLoadingBackdrop) {
|
|
currentLoadingBackdrop.destroy();
|
|
currentLoadingBackdrop = null;
|
|
}
|
|
|
|
var elem = getBackdropContainer();
|
|
var existingBackdropImage = elem.querySelector('.displayingBackdropImage');
|
|
|
|
if (existingBackdropImage && existingBackdropImage.getAttribute('data-url') == url) {
|
|
if (existingBackdropImage.getAttribute('data-url') == url) {
|
|
return;
|
|
}
|
|
existingBackdropImage.classList.remove('displayingBackdropImage');
|
|
}
|
|
|
|
var instance = new backdrop();
|
|
instance.load(url, elem, existingBackdropImage);
|
|
currentLoadingBackdrop = instance;
|
|
}
|
|
|
|
function setBackdrops(items) {
|
|
|
|
var images = items.map(function (i) {
|
|
|
|
if (i.BackdropImageTags && i.BackdropImageTags.length > 0) {
|
|
return {
|
|
id: i.Id,
|
|
tag: i.BackdropImageTags[0],
|
|
serverId: i.ServerId
|
|
};
|
|
}
|
|
|
|
if (i.ParentBackdropItemId && i.ParentBackdropImageTags && i.ParentBackdropImageTags.length) {
|
|
|
|
return {
|
|
id: i.ParentBackdropItemId,
|
|
tag: i.ParentBackdropImageTags[0],
|
|
serverId: i.ServerId
|
|
};
|
|
}
|
|
return null;
|
|
|
|
}).filter(function (i) {
|
|
return i != null;
|
|
});
|
|
|
|
if (images.length) {
|
|
|
|
var index = getRandom(0, images.length - 1);
|
|
var item = images[index];
|
|
|
|
require(['connectionManager'], function (connectionManager) {
|
|
|
|
var apiClient = connectionManager.getApiClient(item.serverId);
|
|
var imgUrl = apiClient.getScaledImageUrl(item.id, {
|
|
type: "Backdrop",
|
|
tag: item.tag,
|
|
//maxWidth: window.innerWidth,
|
|
quality: 100
|
|
});
|
|
|
|
setBackdrop(imgUrl);
|
|
});
|
|
|
|
} else {
|
|
clearBackdrop();
|
|
}
|
|
}
|
|
|
|
function setBackdrop(url) {
|
|
|
|
if (url) {
|
|
setBackdropImage(url);
|
|
|
|
} else {
|
|
clearBackdrop();
|
|
}
|
|
}
|
|
|
|
return {
|
|
|
|
setBackdrops: setBackdrops,
|
|
setBackdrop: setBackdrop,
|
|
clear: clearBackdrop,
|
|
externalBackdrop: externalBackdrop
|
|
};
|
|
|
|
}); |