2019-01-10 15:39:37 +03:00
|
|
|
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() {
|
2019-01-10 15:39:37 +03:00
|
|
|
return currentSkin;
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
function getRequirePromise(deps) {
|
2019-01-10 15:39:37 +03:00
|
|
|
return new Promise(function (resolve, reject) {
|
|
|
|
require(deps, resolve);
|
|
|
|
});
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
function loadSkin(id) {
|
2019-01-10 15:39:37 +03:00
|
|
|
var newSkin = pluginManager.plugins().filter(function (p) {
|
|
|
|
return p.id === id;
|
2018-10-23 01:05:09 +03:00
|
|
|
})[0];
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
if (!newSkin) {
|
|
|
|
newSkin = pluginManager.plugins().filter(function (p) {
|
|
|
|
return p.id === 'defaultskin';
|
|
|
|
})[0];
|
|
|
|
}
|
|
|
|
|
2018-10-23 01:05:09 +03:00
|
|
|
var unloadPromise;
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2018-10-23 01:05:09 +03:00
|
|
|
if (currentSkin) {
|
2019-01-10 15:39:37 +03:00
|
|
|
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();
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
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() : [];
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2018-10-23 01:05:09 +03:00
|
|
|
return globalize.loadStrings({
|
2019-01-10 15:39:37 +03:00
|
|
|
|
2018-10-23 01:05:09 +03:00
|
|
|
name: newSkin.id,
|
|
|
|
strings: strings
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
}).then(function () {
|
|
|
|
|
|
|
|
globalize.defaultModule(newSkin.id);
|
|
|
|
return loadSkinHeader(newSkin);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
function unloadSkin(skin) {
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
}));
|
|
|
|
});
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
function loadSkinHeader(skin) {
|
2019-01-10 15:39:37 +03:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2019-01-10 15:39:37 +03:00
|
|
|
var cacheParam = new Date().getTime();
|
|
|
|
|
2018-10-23 01:05:09 +03:00
|
|
|
function getSkinHeader(skin) {
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
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) {
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
2019-01-10 15:39:37 +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;
|
2019-01-10 15:39:37 +03:00
|
|
|
if (elem) {
|
|
|
|
|
|
|
|
elem.parentNode.removeChild(elem);
|
|
|
|
themeStyleElement = null;
|
|
|
|
currentThemeId = null;
|
|
|
|
}
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
function getThemes() {
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
if (currentSkin.getThemes) {
|
|
|
|
return currentSkin.getThemes();
|
|
|
|
}
|
|
|
|
|
|
|
|
return [];
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
2019-01-10 15:39:37 +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) {
|
2019-01-10 15:39:37 +03:00
|
|
|
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];
|
2019-01-10 15:39:37 +03:00
|
|
|
if (theme[isDefaultProperty]) {
|
|
|
|
defaultTheme = theme;
|
|
|
|
}
|
|
|
|
if (id === theme.id) {
|
|
|
|
selectedTheme = theme;
|
|
|
|
}
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
selectedTheme = selectedTheme || defaultTheme;
|
2018-10-23 01:05:09 +03:00
|
|
|
return {
|
2019-03-12 23:28:26 +00:00
|
|
|
stylesheetPath: require.toUrl('components/themes/' + selectedTheme.id + '/theme.css'),
|
2018-10-23 01:05:09 +03:00
|
|
|
themeId: selectedTheme.id
|
2019-01-10 15:39:37 +03:00
|
|
|
};
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
2019-01-10 15:39:37 +03:00
|
|
|
var themeResources = {};
|
|
|
|
var lastSound = 0;
|
|
|
|
var currentSound;
|
|
|
|
|
2018-10-23 01:05:09 +03:00
|
|
|
function loadThemeResources(id) {
|
2019-01-10 15:39:37 +03:00
|
|
|
lastSound = 0;
|
|
|
|
if (currentSound) {
|
|
|
|
currentSound.stop();
|
|
|
|
currentSound = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
backdrop.clear();
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
function onThemeLoaded() {
|
2019-01-10 15:39:37 +03:00
|
|
|
document.documentElement.classList.remove('preload');
|
2018-10-23 01:05:09 +03:00
|
|
|
try {
|
2019-01-10 15:39:37 +03:00
|
|
|
var color = getComputedStyle(document.querySelector('.skinHeader')).getPropertyValue("background-color");
|
|
|
|
if (color) {
|
|
|
|
appHost.setThemeColor(color);
|
|
|
|
}
|
2019-03-19 17:03:11 -07:00
|
|
|
} catch (err) {
|
2019-01-10 15:39:37 +03:00
|
|
|
console.log('Error setting theme color: ' + err);
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-01-10 15:39:37 +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) {
|
2019-01-10 15:39:37 +03:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2019-01-10 15:39:37 +03:00
|
|
|
document.addEventListener('viewshow', onViewBeforeShow);
|
|
|
|
|
2018-10-23 01:05:09 +03:00
|
|
|
function playSound(path, volume) {
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
lastSound = new Date().getTime();
|
|
|
|
|
|
|
|
require(['howler'], function (howler) {
|
|
|
|
|
2018-10-23 01:05:09 +03:00
|
|
|
try {
|
|
|
|
var sound = new Howl({
|
|
|
|
src: [path],
|
2019-01-10 15:39:37 +03:00
|
|
|
volume: volume || 0.1
|
2018-10-23 01:05:09 +03:00
|
|
|
});
|
2019-01-10 15:39:37 +03:00
|
|
|
|
|
|
|
sound.play();
|
|
|
|
currentSound = sound;
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
catch (err) {
|
|
|
|
console.log('Error playing sound: ' + err);
|
2018-10-23 01:05:09 +03:00
|
|
|
}
|
2019-01-10 15:39:37 +03:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return skinManager;
|
2019-02-02 09:35:56 -05:00
|
|
|
});
|