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

304 lines
8.1 KiB
JavaScript
Raw Normal View History

define(['apphost', 'userSettings', 'browser', 'events', 'pluginManager', 'backdrop', 'globalize', 'require', 'appSettings'], function (appHost, userSettings, browser, events, pluginManager, backdrop, globalize, require, appSettings) {
'use strict';
var currentSkin;
2018-10-23 01:05:09 +03:00
function getCurrentSkin() {
return currentSkin;
2018-10-23 01:05:09 +03:00
}
function getRequirePromise(deps) {
return new Promise(function (resolve, reject) {
require(deps, resolve);
});
2018-10-23 01:05:09 +03:00
}
function loadSkin(id) {
var newSkin = pluginManager.plugins().filter(function (p) {
return p.id === id;
2018-10-23 01:05:09 +03:00
})[0];
if (!newSkin) {
newSkin = pluginManager.plugins().filter(function (p) {
return p.id === 'defaultskin';
})[0];
}
2018-10-23 01:05:09 +03:00
var unloadPromise;
2018-10-23 01:05:09 +03:00
if (currentSkin) {
if (currentSkin.id === newSkin.id) {
// Nothing to do, it's already the active skin
return Promise.resolve(currentSkin);
}
unloadPromise = unloadSkin(currentSkin);
} else {
unloadPromise = Promise.resolve();
}
return unloadPromise.then(function () {
2018-10-23 01:05:09 +03:00
var deps = newSkin.getDependencies();
console.log('Loading skin dependencies');
return getRequirePromise(deps).then(function () {
console.log('Skin dependencies loaded');
2018-10-23 01:05:09 +03:00
var strings = newSkin.getTranslations ? newSkin.getTranslations() : [];
2018-10-23 01:05:09 +03:00
return globalize.loadStrings({
2018-10-23 01:05:09 +03:00
name: newSkin.id,
strings: strings
}).then(function () {
globalize.defaultModule(newSkin.id);
return loadSkinHeader(newSkin);
});
});
});
2018-10-23 01:05:09 +03:00
}
function unloadSkin(skin) {
unloadTheme();
backdrop.clear();
console.log('Unloading skin: ' + skin.name);
// TODO: unload css
return skin.unload().then(function () {
2018-10-23 01:05:09 +03:00
document.dispatchEvent(new CustomEvent("skinunload", {
detail: {
name: skin.name
}
}));
});
2018-10-23 01:05:09 +03:00
}
function loadSkinHeader(skin) {
return getSkinHeader(skin).then(function (headerHtml) {
document.querySelector('.skinHeader').innerHTML = headerHtml;
currentSkin = skin;
skin.load();
return skin;
});
2018-10-23 01:05:09 +03:00
}
var cacheParam = new Date().getTime();
2018-10-23 01:05:09 +03:00
function getSkinHeader(skin) {
return new Promise(function (resolve, reject) {
if (!skin.getHeaderTemplate) {
resolve('');
return;
}
var xhr = new XMLHttpRequest();
var url = skin.getHeaderTemplate();
url += url.indexOf('?') === -1 ? '?' : '&';
url += 'v=' + cacheParam;
xhr.open('GET', url, true);
xhr.onload = function (e) {
if (this.status < 400) {
resolve(this.response);
} else {
resolve('');
}
};
xhr.send();
});
2018-10-23 01:05:09 +03:00
}
function loadUserSkin(options) {
var skin = userSettings.get('skin', false) || 'defaultskin';
loadSkin(skin).then(function (skin) {
options = options || {};
if (options.start) {
Emby.Page.invokeShortcut(options.start);
} else {
Emby.Page.goHome();
}
});
2018-10-23 01:05:09 +03:00
}
events.on(userSettings, 'change', function (e, name) {
if (name === 'skin' || name === 'language') {
loadUserSkin();
}
});
var themeStyleElement;
var currentThemeId;
2018-10-23 01:05:09 +03:00
function unloadTheme() {
var elem = themeStyleElement;
if (elem) {
elem.parentNode.removeChild(elem);
themeStyleElement = null;
currentThemeId = null;
}
2018-10-23 01:05:09 +03:00
}
function getThemes() {
if (currentSkin.getThemes) {
return currentSkin.getThemes();
}
return [];
2018-10-23 01:05:09 +03:00
}
var skinManager = {
getCurrentSkin: getCurrentSkin,
loadSkin: loadSkin,
loadUserSkin: loadUserSkin,
getThemes: getThemes
};
2018-10-23 01:05:09 +03:00
function getThemeStylesheetInfo(id, requiresRegistration, isDefaultProperty) {
var themes = skinManager.getThemes();
var defaultTheme;
var selectedTheme;
for (var i = 0, length = themes.length; i < length; i++) {
2018-10-23 01:05:09 +03:00
var theme = themes[i];
if (theme[isDefaultProperty]) {
defaultTheme = theme;
}
if (id === theme.id) {
selectedTheme = theme;
}
2018-10-23 01:05:09 +03:00
}
selectedTheme = selectedTheme || defaultTheme;
2018-10-23 01:05:09 +03:00
return {
stylesheetPath: require.toUrl('components/themes/' + selectedTheme.id + '/theme.css'),
2018-10-23 01:05:09 +03:00
themeId: selectedTheme.id
};
2018-10-23 01:05:09 +03:00
}
var themeResources = {};
var lastSound = 0;
var currentSound;
2018-10-23 01:05:09 +03:00
function loadThemeResources(id) {
lastSound = 0;
if (currentSound) {
currentSound.stop();
currentSound = null;
}
backdrop.clear();
2018-10-23 01:05:09 +03:00
}
function onThemeLoaded() {
document.documentElement.classList.remove('preload');
2018-10-23 01:05:09 +03:00
try {
var color = getComputedStyle(document.querySelector('.skinHeader')).getPropertyValue("background-color");
if (color) {
appHost.setThemeColor(color);
}
2019-03-19 17:03:11 -07:00
} catch (err) {
console.log('Error setting theme color: ' + err);
2018-10-23 01:05:09 +03:00
}
}
skinManager.setTheme = function (id, context) {
return new Promise(function (resolve, reject) {
var requiresRegistration = true;
if (currentThemeId && currentThemeId === id) {
resolve();
return;
}
var isDefaultProperty = context === 'serverdashboard' ? 'isDefaultServerDashboard' : 'isDefault';
var info = getThemeStylesheetInfo(id, requiresRegistration, isDefaultProperty);
if (currentThemeId && currentThemeId === info.themeId) {
resolve();
return;
}
var linkUrl = info.stylesheetPath;
unloadTheme();
var link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('type', 'text/css');
link.onload = function () {
onThemeLoaded();
resolve();
};
link.setAttribute('href', linkUrl);
document.head.appendChild(link);
themeStyleElement = link;
currentThemeId = info.themeId;
loadThemeResources(info.themeId);
onViewBeforeShow({});
});
};
2018-10-23 01:05:09 +03:00
function onViewBeforeShow(e) {
if (e.detail && e.detail.type === 'video-osd') {
return;
}
if (themeResources.backdrop) {
backdrop.setBackdrop(themeResources.backdrop);
}
if (!browser.mobile && userSettings.enableThemeSongs()) {
if (lastSound === 0) {
if (themeResources.themeSong) {
playSound(themeResources.themeSong);
}
} else if ((new Date().getTime() - lastSound) > 30000) {
if (themeResources.effect) {
playSound(themeResources.effect);
}
}
}
2018-10-23 01:05:09 +03:00
}
document.addEventListener('viewshow', onViewBeforeShow);
2018-10-23 01:05:09 +03:00
function playSound(path, volume) {
lastSound = new Date().getTime();
require(['howler'], function (howler) {
2018-10-23 01:05:09 +03:00
try {
var sound = new Howl({
src: [path],
volume: volume || 0.1
2018-10-23 01:05:09 +03:00
});
sound.play();
currentSound = sound;
2018-10-23 01:05:09 +03:00
}
catch (err) {
console.log('Error playing sound: ' + err);
2018-10-23 01:05:09 +03:00
}
});
}
return skinManager;
});