jellyfish-web/src/components/homesections/homesections.js

817 lines
32 KiB
JavaScript
Raw Normal View History

define(['connectionManager', 'cardBuilder', 'appSettings', 'dom', 'apphost', 'layoutManager', 'imageLoader', 'globalize', 'itemShortcuts', 'itemHelper', 'appRouter', 'scripts/imagehelper', 'paper-icon-button-light', 'emby-itemscontainer', 'emby-scroller', 'emby-button', 'css!./homesections'], function (connectionManager, cardBuilder, appSettings, dom, appHost, layoutManager, imageLoader, globalize, itemShortcuts, itemHelper, appRouter, imageHelper) {
'use strict';
2018-10-23 01:05:09 +03:00
function getDefaultSection(index) {
switch (index) {
case 0:
return 'smalllibrarytiles';
2018-10-23 01:05:09 +03:00
case 1:
return 'resume';
2018-10-23 01:05:09 +03:00
case 2:
return 'resumeaudio';
2018-10-23 01:05:09 +03:00
case 3:
return 'livetv';
2018-10-23 01:05:09 +03:00
case 4:
return 'nextup';
2018-10-23 01:05:09 +03:00
case 5:
return 'latestmedia';
2018-10-23 01:05:09 +03:00
case 6:
return 'none';
2018-10-23 01:05:09 +03:00
default:
return '';
2018-10-23 01:05:09 +03:00
}
}
function getAllSectionsToShow(userSettings, sectionCount) {
var sections = [];
for (var i = 0, length = sectionCount; i < length; i++) {
var section = userSettings.get('homesection' + i) || getDefaultSection(i);
if (section === 'folders') {
section = getDefaultSection(0);
}
sections.push(section);
2018-10-23 01:05:09 +03:00
}
return sections;
2018-10-23 01:05:09 +03:00
}
function loadSections(elem, apiClient, user, userSettings) {
return getUserViews(apiClient, user.Id).then(function (userViews) {
var html = '';
if (userViews.length) {
var sectionCount = 7;
for (var i = 0; i < sectionCount; i++) {
html += '<div class="verticalSection section' + i + '"></div>';
}
elem.innerHTML = html;
elem.classList.add('homeSectionsContainer');
var promises = [];
var sections = getAllSectionsToShow(userSettings, sectionCount);
for (var i = 0; i < sections.length; i++) {
promises.push(loadSection(elem, apiClient, user, userSettings, userViews, sections, i));
}
return Promise.all(promises).then(function () {
return resume(elem, {
refresh: true,
returnPromise: false
});
});
} else {
var noLibDescription;
if (user['Policy'] && user['Policy']['IsAdministrator']) {
2020-05-04 12:44:12 +02:00
noLibDescription = globalize.translate('NoCreatedLibraries', '<br><a id="button-createLibrary" class="button-link">', '</a>');
} else {
2020-05-04 12:44:12 +02:00
noLibDescription = globalize.translate('AskAdminToCreateLibrary');
}
html += '<div class="centerMessage padded-left padded-right">';
2020-05-04 12:44:12 +02:00
html += '<h2>' + globalize.translate('MessageNothingHere') + '</h2>';
html += '<p>' + noLibDescription + '</p>';
html += '</div>';
elem.innerHTML = html;
2020-05-04 12:44:12 +02:00
var createNowLink = elem.querySelector('#button-createLibrary');
if (createNowLink) {
2020-05-04 12:44:12 +02:00
createNowLink.addEventListener('click', function () {
Dashboard.navigate('library.html');
});
}
}
});
2018-10-23 01:05:09 +03:00
}
function destroySections(elem) {
var elems = elem.querySelectorAll('.itemsContainer');
for (var i = 0; i < elems.length; i++) {
elems[i].fetchData = null;
elems[i].parentContainer = null;
elems[i].getItemsHtml = null;
}
elem.innerHTML = '';
2018-10-23 01:05:09 +03:00
}
function pause(elem) {
var elems = elem.querySelectorAll('.itemsContainer');
for (var i = 0; i < elems.length; i++) {
elems[i].pause();
}
2018-10-23 01:05:09 +03:00
}
function resume(elem, options) {
var elems = elem.querySelectorAll('.itemsContainer');
var i;
var length;
var promises = [];
for (i = 0, length = elems.length; i < length; i++) {
promises.push(elems[i].resume(options));
}
var promise = Promise.all(promises);
if (!options || options.returnPromise !== false) {
return promise;
}
2018-10-23 01:05:09 +03:00
}
function loadSection(page, apiClient, user, userSettings, userViews, allSections, index) {
var section = allSections[index];
var userId = user.Id;
var elem = page.querySelector('.section' + index);
if (section === 'latestmedia') {
loadRecentlyAdded(elem, apiClient, user, userViews);
} else if (section === 'librarytiles' || section === 'smalllibrarytiles' || section === 'smalllibrarytiles-automobile' || section === 'librarytiles-automobile') {
loadLibraryTiles(elem, apiClient, user, userSettings, 'smallBackdrop', userViews, allSections);
} else if (section === 'librarybuttons') {
2020-04-06 22:03:09 +02:00
loadlibraryButtons(elem, apiClient, user, userSettings, userViews);
} else if (section === 'resume') {
loadResumeVideo(elem, apiClient, userId);
} else if (section === 'resumeaudio') {
loadResumeAudio(elem, apiClient, userId);
} else if (section === 'activerecordings') {
loadLatestLiveTvRecordings(elem, true, apiClient, userId);
} else if (section === 'nextup') {
loadNextUp(elem, apiClient, userId);
} else if (section === 'onnow' || section === 'livetv') {
return loadOnNow(elem, apiClient, user);
} else {
elem.innerHTML = '';
return Promise.resolve();
2018-10-23 01:05:09 +03:00
}
return Promise.resolve();
2018-10-23 01:05:09 +03:00
}
function getUserViews(apiClient, userId) {
return apiClient.getUserViews({}, userId || apiClient.getCurrentUserId()).then(function (result) {
return result.Items;
});
2018-10-23 01:05:09 +03:00
}
function enableScrollX() {
return true;
2018-10-23 01:05:09 +03:00
}
function getSquareShape() {
return enableScrollX() ? 'overflowSquare' : 'square';
2018-10-23 01:05:09 +03:00
}
function getThumbShape() {
return enableScrollX() ? 'overflowBackdrop' : 'backdrop';
2018-10-23 01:05:09 +03:00
}
function getPortraitShape() {
return enableScrollX() ? 'autooverflow' : 'auto';
2018-10-23 01:05:09 +03:00
}
function getLibraryButtonsHtml(items) {
2020-05-04 12:44:12 +02:00
var html = '';
html += '<div class="verticalSection verticalSection-extrabottompadding">';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize.translate('HeaderMyMedia') + '</h2>';
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x" data-multiselect="false">';
// library card background images
2018-10-23 01:05:09 +03:00
for (var i = 0, length = items.length; i < length; i++) {
var item = items[i];
var icon = imageHelper.getLibraryIcon(item.CollectionType);
2020-04-26 02:37:28 +03:00
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(item) + '" class="raised homeLibraryButton"><span class="material-icons homeLibraryIcon ' + icon + '"></span><span class="homeLibraryText">' + item.Name + '</span></a>';
2018-10-23 01:05:09 +03:00
}
html += '</div>';
html += '</div>';
return html;
2018-10-23 01:05:09 +03:00
}
function loadlibraryButtons(elem, apiClient, user, userSettings, userViews) {
elem.classList.remove('verticalSection');
var html = getLibraryButtonsHtml(userViews);
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
2018-10-23 01:05:09 +03:00
}
/**
* Returns a random integer between min (inclusive) and max (inclusive)
* Using Math.round() will give you a non-uniform distribution!
*/
2018-10-23 01:05:09 +03:00
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
2018-10-23 01:05:09 +03:00
}
function getFetchLatestItemsFn(serverId, parentId, collectionType) {
return function () {
var apiClient = connectionManager.getApiClient(serverId);
var limit = 16;
if (enableScrollX()) {
if (collectionType === 'music') {
limit = 30;
}
} else {
if (collectionType === 'tvshows') {
limit = 5;
} else if (collectionType === 'music') {
limit = 9;
} else {
limit = 8;
}
}
2018-10-23 01:05:09 +03:00
var options = {
Limit: limit,
2020-05-04 12:44:12 +02:00
Fields: 'PrimaryImageAspectRatio,BasicSyncInfo',
2018-10-23 01:05:09 +03:00
ImageTypeLimit: 1,
2020-05-04 12:44:12 +02:00
EnableImageTypes: 'Primary,Backdrop,Thumb',
2018-10-23 01:05:09 +03:00
ParentId: parentId
};
return apiClient.getLatestItems(options);
};
2018-10-23 01:05:09 +03:00
}
function getLatestItemsHtmlFn(itemType, viewType) {
return function (items) {
var cardLayout = false;
2019-08-22 15:23:05 -07:00
var shape;
2020-04-26 10:07:09 +02:00
if (itemType === 'Channel' || viewType === 'movies' || viewType === 'books' || viewType === 'tvshows') {
2019-08-22 15:23:05 -07:00
shape = getPortraitShape();
} else if (viewType === 'music' || viewType === 'homevideos') {
2019-08-22 15:23:05 -07:00
shape = getSquareShape();
} else {
shape = getThumbShape();
}
2018-10-23 01:05:09 +03:00
return cardBuilder.getCardsHtml({
items: items,
shape: shape,
preferThumb: viewType !== 'movies' && itemType !== 'Channel' && viewType !== 'music' ? 'auto' : null,
showUnplayedIndicator: false,
showChildCountIndicator: true,
context: 'home',
overlayText: false,
centerText: !cardLayout,
overlayPlayButton: viewType !== 'photos',
allowBottomPadding: !enableScrollX() && !cardLayout,
cardLayout: cardLayout,
showTitle: viewType !== 'photos',
showYear: viewType === 'movies' || viewType === 'tvshows' || !viewType,
showParentTitle: viewType === 'music' || viewType === 'tvshows' || !viewType || (cardLayout && (viewType === 'tvshows')),
2018-10-23 01:05:09 +03:00
lines: 2
});
};
2018-10-23 01:05:09 +03:00
}
function renderLatestSection(elem, apiClient, user, parent) {
var html = '';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
if (!layoutManager.tv) {
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl(parent, {
section: 'latest'
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton">';
html += '<h2 class="sectionTitle sectionTitle-cards">';
html += globalize.translate('LatestFromLibrary', parent.Name);
html += '</h2>';
2020-04-26 02:37:28 +03:00
html += '<span class="material-icons chevron_right"></span>';
html += '</a>';
} else {
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate('LatestFromLibrary', parent.Name) + '</h2>';
}
html += '</div>';
if (enableScrollX()) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">';
html += '<div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer focuscontainer-x padded-left padded-right vertical-wrap">';
}
if (enableScrollX()) {
html += '</div>';
}
html += '</div>';
elem.innerHTML = html;
var itemsContainer = elem.querySelector('.itemsContainer');
itemsContainer.fetchData = getFetchLatestItemsFn(apiClient.serverId(), parent.Id, parent.CollectionType);
itemsContainer.getItemsHtml = getLatestItemsHtmlFn(parent.Type, parent.CollectionType);
itemsContainer.parentContainer = elem;
2018-10-23 01:05:09 +03:00
}
function loadRecentlyAdded(elem, apiClient, user, userViews) {
elem.classList.remove('verticalSection');
var excludeViewTypes = ['playlists', 'livetv', 'boxsets', 'channels'];
for (var i = 0, length = userViews.length; i < length; i++) {
2018-10-23 01:05:09 +03:00
var item = userViews[i];
if (user.Configuration.LatestItemsExcludes.indexOf(item.Id) !== -1) {
continue;
2018-10-23 01:05:09 +03:00
}
if (excludeViewTypes.indexOf(item.CollectionType || []) !== -1) {
continue;
}
var frag = document.createElement('div');
frag.classList.add('verticalSection');
frag.classList.add('hide');
elem.appendChild(frag);
renderLatestSection(frag, apiClient, user, item);
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 loadLibraryTiles(elem, apiClient, user, userSettings, shape, userViews, allSections) {
var html = '';
if (userViews.length) {
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize.translate('HeaderMyMedia') + '</h2>';
if (enableScrollX()) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">';
html += '<div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right focuscontainer-x vertical-wrap">';
}
html += cardBuilder.getCardsHtml({
items: userViews,
shape: getThumbShape(),
showTitle: true,
centerText: true,
overlayText: false,
lazy: true,
transition: false,
allowBottomPadding: !enableScrollX()
});
if (enableScrollX()) {
html += '</div>';
}
html += '</div>';
}
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
2018-10-23 01:05:09 +03:00
}
function getContinueWatchingFetchFn(serverId) {
return function () {
var apiClient = connectionManager.getApiClient(serverId);
var screenWidth = dom.getWindowSize().innerWidth;
var limit;
if (enableScrollX()) {
limit = 12;
} else {
limit = screenWidth >= 1920 ? 8 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 9 : 6));
limit = Math.min(limit, 5);
}
2018-10-23 01:05:09 +03:00
var options = {
Limit: limit,
Recursive: true,
2020-05-04 12:44:12 +02:00
Fields: 'PrimaryImageAspectRatio,BasicSyncInfo',
2018-10-23 01:05:09 +03:00
ImageTypeLimit: 1,
2020-05-04 12:44:12 +02:00
EnableImageTypes: 'Primary,Backdrop,Thumb',
EnableTotalRecordCount: false,
MediaTypes: 'Video'
2018-10-23 01:05:09 +03:00
};
return apiClient.getResumableItems(apiClient.getCurrentUserId(), options);
};
2018-10-23 01:05:09 +03:00
}
function getContinueWatchingItemsHtml(items) {
var cardLayout = false;
2018-10-23 01:05:09 +03:00
return cardBuilder.getCardsHtml({
items: items,
preferThumb: true,
2018-10-23 01:05:09 +03:00
shape: getThumbShape(),
overlayText: false,
showTitle: true,
showParentTitle: true,
lazy: true,
showDetailsMenu: true,
overlayPlayButton: true,
context: 'home',
centerText: !cardLayout,
allowBottomPadding: false,
cardLayout: cardLayout,
showYear: true,
2018-10-23 01:05:09 +03:00
lines: 2
});
2018-10-23 01:05:09 +03:00
}
function loadResumeVideo(elem, apiClient, userId) {
var html = '';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize.translate('HeaderContinueWatching') + '</h2>';
if (enableScrollX()) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">';
html += '<div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x" data-monitor="videoplayback,markplayed">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x" data-monitor="videoplayback,markplayed">';
}
if (enableScrollX()) {
html += '</div>';
}
html += '</div>';
elem.classList.add('hide');
elem.innerHTML = html;
var itemsContainer = elem.querySelector('.itemsContainer');
itemsContainer.fetchData = getContinueWatchingFetchFn(apiClient.serverId());
itemsContainer.getItemsHtml = getContinueWatchingItemsHtml;
itemsContainer.parentContainer = elem;
2018-10-23 01:05:09 +03:00
}
function getContinueListeningFetchFn(serverId) {
return function () {
var apiClient = connectionManager.getApiClient(serverId);
var screenWidth = dom.getWindowSize().innerWidth;
var limit;
if (enableScrollX()) {
limit = 12;
} else {
limit = screenWidth >= 1920 ? 8 : (screenWidth >= 1600 ? 8 : (screenWidth >= 1200 ? 9 : 6));
limit = Math.min(limit, 5);
}
2018-10-23 01:05:09 +03:00
var options = {
Limit: limit,
Recursive: true,
2020-05-04 12:44:12 +02:00
Fields: 'PrimaryImageAspectRatio,BasicSyncInfo',
2018-10-23 01:05:09 +03:00
ImageTypeLimit: 1,
2020-05-04 12:44:12 +02:00
EnableImageTypes: 'Primary,Backdrop,Thumb',
EnableTotalRecordCount: false,
MediaTypes: 'Audio'
2018-10-23 01:05:09 +03:00
};
return apiClient.getResumableItems(apiClient.getCurrentUserId(), options);
};
2018-10-23 01:05:09 +03:00
}
function getContinueListeningItemsHtml(items) {
var cardLayout = false;
2018-10-23 01:05:09 +03:00
return cardBuilder.getCardsHtml({
items: items,
preferThumb: true,
2018-10-23 01:05:09 +03:00
shape: getThumbShape(),
overlayText: false,
showTitle: true,
showParentTitle: true,
lazy: true,
showDetailsMenu: true,
overlayPlayButton: true,
context: 'home',
centerText: !cardLayout,
allowBottomPadding: false,
cardLayout: cardLayout,
showYear: true,
2018-10-23 01:05:09 +03:00
lines: 2
});
2018-10-23 01:05:09 +03:00
}
function loadResumeAudio(elem, apiClient, userId) {
var html = '';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + globalize.translate('HeaderContinueWatching') + '</h2>';
if (enableScrollX()) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">';
html += '<div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x" data-monitor="audioplayback,markplayed">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x" data-monitor="audioplayback,markplayed">';
}
if (enableScrollX()) {
html += '</div>';
}
html += '</div>';
elem.classList.add('hide');
elem.innerHTML = html;
var itemsContainer = elem.querySelector('.itemsContainer');
itemsContainer.fetchData = getContinueListeningFetchFn(apiClient.serverId());
itemsContainer.getItemsHtml = getContinueListeningItemsHtml;
itemsContainer.parentContainer = elem;
2018-10-23 01:05:09 +03:00
}
function getOnNowFetchFn(serverId) {
return function () {
2018-10-23 01:05:09 +03:00
var apiClient = connectionManager.getApiClient(serverId);
return apiClient.getLiveTvRecommendedPrograms({
userId: apiClient.getCurrentUserId(),
IsAiring: true,
2018-10-23 01:05:09 +03:00
limit: 24,
ImageTypeLimit: 1,
2020-05-04 12:44:12 +02:00
EnableImageTypes: 'Primary,Thumb,Backdrop',
EnableTotalRecordCount: false,
2020-05-04 12:44:12 +02:00
Fields: 'ChannelInfo,PrimaryImageAspectRatio'
});
};
2018-10-23 01:05:09 +03:00
}
function getOnNowItemsHtml(items) {
var cardLayout = false;
2018-10-23 01:05:09 +03:00
return cardBuilder.getCardsHtml({
items: items,
preferThumb: 'auto',
inheritThumb: false,
shape: (enableScrollX() ? 'autooverflow' : 'auto'),
showParentTitleOrTitle: true,
showTitle: true,
centerText: true,
coverImage: true,
overlayText: false,
2018-10-23 01:05:09 +03:00
allowBottomPadding: !enableScrollX(),
showAirTime: true,
showChannelName: false,
showAirDateTime: false,
showAirEndTime: true,
2018-10-23 01:05:09 +03:00
defaultShape: getThumbShape(),
lines: 3,
overlayPlayButton: true
});
2018-10-23 01:05:09 +03:00
}
function loadOnNow(elem, apiClient, user) {
if (!user.Policy.EnableLiveTvAccess) {
return Promise.resolve();
}
var userId = user.Id;
return apiClient.getLiveTvRecommendedPrograms({
2018-10-23 01:05:09 +03:00
userId: apiClient.getCurrentUserId(),
IsAiring: true,
2018-10-23 01:05:09 +03:00
limit: 1,
ImageTypeLimit: 1,
2020-05-04 12:44:12 +02:00
EnableImageTypes: 'Primary,Thumb,Backdrop',
EnableTotalRecordCount: false,
2020-05-04 12:44:12 +02:00
Fields: 'ChannelInfo,PrimaryImageAspectRatio'
2019-03-19 17:03:11 -07:00
}).then(function (result) {
var html = '';
2019-03-19 17:03:11 -07:00
if (result.Items.length) {
elem.classList.remove('padded-left');
elem.classList.remove('padded-right');
elem.classList.remove('padded-bottom');
elem.classList.remove('verticalSection');
html += '<div class="verticalSection">';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate('LiveTV') + '</h2>';
html += '</div>';
if (enableScrollX()) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true" data-scrollbuttons="false">';
2019-10-13 21:33:07 +03:00
html += '<div class="padded-top padded-bottom scrollSlider focuscontainer-x">';
2019-03-19 17:03:11 -07:00
} else {
2019-10-13 21:33:07 +03:00
html += '<div class="padded-top padded-bottom focuscontainer-x">';
}
2019-10-13 21:33:07 +03:00
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
serverId: apiClient.serverId(),
section: 'programs'
}) + '" class="raised"><span>' + globalize.translate('Programs') + '</span></a>';
2019-10-13 21:33:07 +03:00
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
2018-10-23 01:05:09 +03:00
serverId: apiClient.serverId(),
section: 'guide'
}) + '" class="raised"><span>' + globalize.translate('Guide') + '</span></a>';
2019-10-13 21:33:07 +03:00
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('recordedtv', {
2018-10-23 01:05:09 +03:00
serverId: apiClient.serverId()
}) + '" class="raised"><span>' + globalize.translate('Recordings') + '</span></a>';
2019-10-13 21:33:07 +03:00
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
2018-10-23 01:05:09 +03:00
serverId: apiClient.serverId(),
section: 'dvrschedule'
}) + '" class="raised"><span>' + globalize.translate('Schedule') + '</span></a>';
2019-10-13 21:33:07 +03:00
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
serverId: apiClient.serverId(),
section: 'seriesrecording'
}) + '" class="raised"><span>' + globalize.translate('Series') + '</span></a>';
html += '</div>';
if (enableScrollX()) {
html += '</div>';
}
html += '</div>';
html += '</div>';
html += '<div class="verticalSection">';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
if (!layoutManager.tv) {
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('livetv', {
serverId: apiClient.serverId(),
section: 'onnow'
}) + '" class="more button-flat button-flat-mini sectionTitleTextButton">';
html += '<h2 class="sectionTitle sectionTitle-cards">';
html += globalize.translate('HeaderOnNow');
html += '</h2>';
2020-04-26 02:37:28 +03:00
html += '<span class="material-icons chevron_right"></span>';
html += '</a>';
} else {
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate('HeaderOnNow') + '</h2>';
}
html += '</div>';
if (enableScrollX()) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">';
html += '<div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x">';
}
if (enableScrollX()) {
html += '</div>';
}
html += '</div>';
html += '</div>';
elem.innerHTML = html;
var itemsContainer = elem.querySelector('.itemsContainer');
itemsContainer.parentContainer = elem;
itemsContainer.fetchData = getOnNowFetchFn(apiClient.serverId());
itemsContainer.getItemsHtml = getOnNowItemsHtml;
}
});
2018-10-23 01:05:09 +03:00
}
function getNextUpFetchFn(serverId) {
return function () {
2018-10-23 01:05:09 +03:00
var apiClient = connectionManager.getApiClient(serverId);
return apiClient.getNextUpEpisodes({
Limit: enableScrollX() ? 24 : 15,
2020-05-04 12:44:12 +02:00
Fields: 'PrimaryImageAspectRatio,SeriesInfo,DateCreated,BasicSyncInfo',
2018-10-23 01:05:09 +03:00
UserId: apiClient.getCurrentUserId(),
ImageTypeLimit: 1,
2020-05-04 12:44:12 +02:00
EnableImageTypes: 'Primary,Backdrop,Banner,Thumb',
EnableTotalRecordCount: false
});
};
2018-10-23 01:05:09 +03:00
}
function getNextUpItemsHtml(items) {
var cardLayout = false;
2018-10-23 01:05:09 +03:00
return cardBuilder.getCardsHtml({
items: items,
preferThumb: true,
2018-10-23 01:05:09 +03:00
shape: getThumbShape(),
overlayText: false,
showTitle: true,
showParentTitle: true,
lazy: true,
overlayPlayButton: true,
context: 'home',
centerText: !cardLayout,
2018-10-23 01:05:09 +03:00
allowBottomPadding: !enableScrollX(),
cardLayout: cardLayout
});
2018-10-23 01:05:09 +03:00
}
function loadNextUp(elem, apiClient, userId) {
var html = '';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">';
if (!layoutManager.tv) {
html += '<a is="emby-linkbutton" href="' + appRouter.getRouteUrl('nextup', {
serverId: apiClient.serverId()
}) + '" class="button-flat button-flat-mini sectionTitleTextButton">';
html += '<h2 class="sectionTitle sectionTitle-cards">';
html += globalize.translate('HeaderNextUp');
html += '</h2>';
2020-04-26 02:37:28 +03:00
html += '<span class="material-icons chevron_right"></span>';
html += '</a>';
} else {
html += '<h2 class="sectionTitle sectionTitle-cards">' + globalize.translate('HeaderNextUp') + '</h2>';
}
html += '</div>';
if (enableScrollX()) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">';
html += '<div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x" data-monitor="videoplayback,markplayed">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x" data-monitor="videoplayback,markplayed">';
}
if (enableScrollX()) {
html += '</div>';
}
html += '</div>';
elem.classList.add('hide');
elem.innerHTML = html;
var itemsContainer = elem.querySelector('.itemsContainer');
itemsContainer.fetchData = getNextUpFetchFn(apiClient.serverId());
itemsContainer.getItemsHtml = getNextUpItemsHtml;
itemsContainer.parentContainer = elem;
2018-10-23 01:05:09 +03:00
}
function getLatestRecordingsFetchFn(serverId, activeRecordingsOnly) {
return function () {
2018-10-23 01:05:09 +03:00
var apiClient = connectionManager.getApiClient(serverId);
return apiClient.getLiveTvRecordings({
userId: apiClient.getCurrentUserId(),
Limit: enableScrollX() ? 12 : 5,
2020-05-04 12:44:12 +02:00
Fields: 'PrimaryImageAspectRatio,BasicSyncInfo',
EnableTotalRecordCount: false,
IsLibraryItem: activeRecordingsOnly ? null : false,
IsInProgress: activeRecordingsOnly ? true : null
});
};
2018-10-23 01:05:09 +03:00
}
function getLatestRecordingItemsHtml(activeRecordingsOnly) {
return function (items) {
var cardLayout = false;
2018-10-23 01:05:09 +03:00
return cardBuilder.getCardsHtml({
items: items,
shape: enableScrollX() ? 'autooverflow' : 'auto',
showTitle: true,
showParentTitle: true,
coverImage: true,
lazy: true,
showDetailsMenu: true,
centerText: true,
overlayText: false,
showYear: true,
2018-10-23 01:05:09 +03:00
lines: 2,
overlayPlayButton: !activeRecordingsOnly,
allowBottomPadding: !enableScrollX(),
preferThumb: true,
cardLayout: false,
2018-10-23 01:05:09 +03:00
overlayMoreButton: activeRecordingsOnly,
action: activeRecordingsOnly ? 'none' : null,
2018-10-23 01:05:09 +03:00
centerPlayButton: activeRecordingsOnly
});
};
2018-10-23 01:05:09 +03:00
}
function loadLatestLiveTvRecordings(elem, activeRecordingsOnly, apiClient, userId) {
var title = activeRecordingsOnly ?
globalize.translate('HeaderActiveRecordings') :
globalize.translate('HeaderLatestRecordings');
var html = '';
html += '<div class="sectionTitleContainer sectionTitleContainer-cards">';
html += '<h2 class="sectionTitle sectionTitle-cards padded-left">' + title + '</h2>';
html += '</div>';
if (enableScrollX()) {
html += '<div is="emby-scroller" class="padded-top-focusscale padded-bottom-focusscale" data-centerfocus="true">';
html += '<div is="emby-itemscontainer" class="itemsContainer scrollSlider focuscontainer-x">';
} else {
html += '<div is="emby-itemscontainer" class="itemsContainer padded-left padded-right vertical-wrap focuscontainer-x">';
}
if (enableScrollX()) {
html += '</div>';
}
html += '</div>';
elem.classList.add('hide');
elem.innerHTML = html;
var itemsContainer = elem.querySelector('.itemsContainer');
itemsContainer.fetchData = getLatestRecordingsFetchFn(apiClient.serverId(), activeRecordingsOnly);
itemsContainer.getItemsHtml = getLatestRecordingItemsHtml(activeRecordingsOnly);
itemsContainer.parentContainer = elem;
2018-10-23 01:05:09 +03:00
}
2018-10-23 01:05:09 +03:00
return {
loadLibraryTiles: loadLibraryTiles,
getDefaultSection: getDefaultSection,
loadSections: loadSections,
destroySections: destroySections,
pause: pause,
resume: resume
};
2019-01-27 22:10:07 +01:00
});