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

390 lines
13 KiB
JavaScript
Raw Normal View History

2020-05-04 12:44:12 +02:00
define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', 'libraryBrowser', 'mainTabsManager', 'cardBuilder', 'apphost', 'imageLoader', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) {
'use strict';
2018-10-23 01:05:09 +03:00
2020-07-28 23:08:27 +01:00
loading = loading.default || loading;
2018-10-23 01:05:09 +03:00
function enableScrollX() {
2019-01-10 21:37:02 +01:00
return !layoutManager.desktop;
2018-10-23 01:05:09 +03:00
}
function getBackdropShape() {
2019-01-10 21:37:02 +01:00
if (enableScrollX()) {
2020-05-04 12:44:12 +02:00
return 'overflowBackdrop';
2019-01-10 21:37:02 +01:00
}
2020-05-04 12:44:12 +02:00
return 'backdrop';
2018-10-23 01:05:09 +03:00
}
function getPortraitShape() {
2019-01-10 21:37:02 +01:00
if (enableScrollX()) {
2020-05-04 12:44:12 +02:00
return 'overflowPortrait';
2019-01-10 21:37:02 +01:00
}
2020-05-04 12:44:12 +02:00
return 'portrait';
2018-10-23 01:05:09 +03:00
}
function getLimit() {
2019-01-10 21:37:02 +01:00
if (enableScrollX()) {
return 12;
}
2019-01-10 21:37:02 +01:00
return 9;
2018-10-23 01:05:09 +03:00
}
function loadRecommendedPrograms(page) {
loading.show();
var limit = getLimit();
2019-01-10 21:37:02 +01:00
if (enableScrollX()) {
limit *= 2;
}
ApiClient.getLiveTvRecommendedPrograms({
2018-10-23 01:05:09 +03:00
userId: Dashboard.getCurrentUserId(),
2019-01-10 21:37:02 +01:00
IsAiring: true,
2018-10-23 01:05:09 +03:00
limit: limit,
ImageTypeLimit: 1,
2020-05-04 12:44:12 +02:00
EnableImageTypes: 'Primary,Thumb,Backdrop',
2019-01-10 21:37:02 +01:00
EnableTotalRecordCount: false,
2020-05-04 12:44:12 +02:00
Fields: 'ChannelInfo,PrimaryImageAspectRatio'
2019-01-10 21:37:02 +01:00
}).then(function (result) {
2020-05-04 12:44:12 +02:00
renderItems(page, result.Items, 'activeProgramItems', 'play', {
2019-01-10 21:37:02 +01:00
showAirDateTime: false,
showAirEndTime: true
});
loading.hide();
2019-11-14 20:30:59 +03:00
2020-05-04 12:44:12 +02:00
require(['autoFocuser'], function (autoFocuser) {
2019-11-14 20:30:59 +03:00
autoFocuser.autoFocus(page);
});
2019-01-10 21:37:02 +01:00
});
2018-10-23 01:05:09 +03:00
}
function reload(page, enableFullRender) {
2019-01-10 21:37:02 +01:00
if (enableFullRender) {
loadRecommendedPrograms(page);
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsMovie: false,
IsSports: false,
IsKids: false,
IsNews: false,
IsSeries: true,
EnableTotalRecordCount: false,
2020-05-04 12:44:12 +02:00
Fields: 'ChannelInfo,PrimaryImageAspectRatio',
EnableImageTypes: 'Primary,Thumb'
2019-01-10 21:37:02 +01:00
}).then(function (result) {
2020-05-04 12:44:12 +02:00
renderItems(page, result.Items, 'upcomingEpisodeItems');
2019-01-10 21:37:02 +01:00
});
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsMovie: true,
EnableTotalRecordCount: false,
2020-05-04 12:44:12 +02:00
Fields: 'ChannelInfo',
EnableImageTypes: 'Primary,Thumb'
2019-01-10 21:37:02 +01:00
}).then(function (result) {
2020-05-04 12:44:12 +02:00
renderItems(page, result.Items, 'upcomingTvMovieItems', null, {
2019-01-10 21:37:02 +01:00
shape: getPortraitShape(),
preferThumb: null,
showParentTitle: false
});
});
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsSports: true,
EnableTotalRecordCount: false,
2020-05-04 12:44:12 +02:00
Fields: 'ChannelInfo,PrimaryImageAspectRatio',
EnableImageTypes: 'Primary,Thumb'
2019-01-10 21:37:02 +01:00
}).then(function (result) {
2020-05-04 12:44:12 +02:00
renderItems(page, result.Items, 'upcomingSportsItems');
2019-01-10 21:37:02 +01:00
});
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsKids: true,
EnableTotalRecordCount: false,
2020-05-04 12:44:12 +02:00
Fields: 'ChannelInfo,PrimaryImageAspectRatio',
EnableImageTypes: 'Primary,Thumb'
2019-01-10 21:37:02 +01:00
}).then(function (result) {
2020-05-04 12:44:12 +02:00
renderItems(page, result.Items, 'upcomingKidsItems');
2019-01-10 21:37:02 +01:00
});
ApiClient.getLiveTvPrograms({
userId: Dashboard.getCurrentUserId(),
HasAired: false,
limit: getLimit(),
IsNews: true,
EnableTotalRecordCount: false,
2020-05-04 12:44:12 +02:00
Fields: 'ChannelInfo,PrimaryImageAspectRatio',
EnableImageTypes: 'Primary,Thumb'
2019-01-10 21:37:02 +01:00
}).then(function (result) {
2020-05-04 12:44:12 +02:00
renderItems(page, result.Items, 'upcomingNewsItems', null, {
2019-01-10 21:37:02 +01:00
showParentTitleOrTitle: true,
showTitle: false,
showParentTitle: false
});
});
}
2018-10-23 01:05:09 +03:00
}
function renderItems(page, items, sectionClass, overlayButton, cardOptions) {
var html = cardBuilder.getCardsHtml(Object.assign({
2019-01-10 21:37:02 +01:00
items: items,
2020-05-04 12:44:12 +02:00
preferThumb: 'auto',
2019-01-10 21:37:02 +01:00
inheritThumb: false,
2020-05-04 12:44:12 +02:00
shape: enableScrollX() ? 'autooverflow' : 'auto',
2019-01-10 21:37:02 +01:00
defaultShape: getBackdropShape(),
showParentTitle: true,
showTitle: true,
centerText: true,
coverImage: true,
overlayText: false,
lazy: true,
2020-07-30 16:07:13 +02:00
overlayPlayButton: overlayButton === 'play',
overlayMoreButton: overlayButton === 'more',
overlayInfoButton: overlayButton === 'info',
2019-01-10 21:37:02 +01:00
allowBottomPadding: !enableScrollX(),
showAirTime: true,
showAirDateTime: true
}, cardOptions || {}));
2020-05-04 12:44:12 +02:00
var elem = page.querySelector('.' + sectionClass);
2019-01-10 21:37:02 +01:00
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
2018-10-23 01:05:09 +03:00
}
function getTabs() {
return [{
2020-05-04 12:44:12 +02:00
name: globalize.translate('Programs')
}, {
2020-05-04 12:44:12 +02:00
name: globalize.translate('TabGuide')
}, {
2020-05-04 12:44:12 +02:00
name: globalize.translate('TabChannels')
}, {
2020-05-04 12:44:12 +02:00
name: globalize.translate('TabRecordings')
}, {
2020-05-04 12:44:12 +02:00
name: globalize.translate('HeaderSchedule')
}, {
2020-05-04 12:44:12 +02:00
name: globalize.translate('TabSeries')
}];
2018-10-23 01:05:09 +03:00
}
function setScrollClasses(elem, scrollX) {
2019-01-10 21:37:02 +01:00
if (scrollX) {
2020-05-04 12:44:12 +02:00
elem.classList.add('hiddenScrollX');
2019-01-10 21:37:02 +01:00
if (layoutManager.tv) {
2020-05-04 12:44:12 +02:00
elem.classList.add('smoothScrollX');
2019-01-10 21:37:02 +01:00
}
2020-05-04 12:44:12 +02:00
elem.classList.add('scrollX');
elem.classList.remove('vertical-wrap');
2019-01-10 21:37:02 +01:00
} else {
2020-05-04 12:44:12 +02:00
elem.classList.remove('hiddenScrollX');
elem.classList.remove('smoothScrollX');
elem.classList.remove('scrollX');
elem.classList.add('vertical-wrap');
2019-01-10 21:37:02 +01:00
}
2018-10-23 01:05:09 +03:00
}
function getDefaultTabIndex(folderId) {
2020-05-04 12:44:12 +02:00
if (userSettings.get('landing-' + folderId) === 'guide') {
2019-01-10 22:10:45 +01:00
return 1;
2018-10-23 01:05:09 +03:00
}
2019-01-10 22:10:45 +01:00
return 0;
2018-10-23 01:05:09 +03:00
}
2019-01-10 21:37:02 +01:00
return function (view, params) {
2018-10-23 01:05:09 +03:00
function enableFullRender() {
2019-01-10 21:37:02 +01:00
return new Date().getTime() - lastFullRender > 3e5;
2018-10-23 01:05:09 +03:00
}
2019-01-10 22:10:45 +01:00
function onBeforeTabChange(evt) {
preLoadTab(view, parseInt(evt.detail.selectedTabIndex));
2018-10-23 01:05:09 +03:00
}
2019-01-10 22:10:45 +01:00
function onTabChange(evt) {
var previousTabController = tabControllers[parseInt(evt.detail.previousIndex)];
2019-01-10 21:37:02 +01:00
if (previousTabController && previousTabController.onHide) {
previousTabController.onHide();
}
2019-01-10 22:10:45 +01:00
loadTab(view, parseInt(evt.detail.selectedTabIndex));
2018-10-23 01:05:09 +03:00
}
function getTabContainers() {
2020-05-04 12:44:12 +02:00
return view.querySelectorAll('.pageTabContent');
2018-10-23 01:05:09 +03:00
}
function initTabs() {
2019-01-10 21:37:02 +01:00
mainTabsManager.setTabs(view, currentTabIndex, getTabs, getTabContainers, onBeforeTabChange, onTabChange);
2018-10-23 01:05:09 +03:00
}
function getTabController(page, index, callback) {
var depends = [];
2019-01-10 21:37:02 +01:00
2019-01-10 22:10:45 +01:00
// TODO int is a little hard to read
2018-10-23 01:05:09 +03:00
switch (index) {
case 0:
break;
2018-10-23 01:05:09 +03:00
case 1:
2020-05-04 12:44:12 +02:00
depends.push('controllers/livetv/livetvguide');
2018-10-23 01:05:09 +03:00
break;
2018-10-23 01:05:09 +03:00
case 2:
2020-05-04 12:44:12 +02:00
depends.push('controllers/livetv/livetvchannels');
2018-10-23 01:05:09 +03:00
break;
2018-10-23 01:05:09 +03:00
case 3:
2020-05-04 12:44:12 +02:00
depends.push('controllers/livetv/livetvrecordings');
2018-10-23 01:05:09 +03:00
break;
2018-10-23 01:05:09 +03:00
case 4:
2020-05-04 12:44:12 +02:00
depends.push('controllers/livetv/livetvschedule');
2018-10-23 01:05:09 +03:00
break;
2018-10-23 01:05:09 +03:00
case 5:
2020-05-04 12:44:12 +02:00
depends.push('controllers/livetv/livetvseriestimers');
2018-10-23 01:05:09 +03:00
break;
}
2019-01-10 21:37:02 +01:00
require(depends, function (controllerFactory) {
2018-10-23 01:05:09 +03:00
var tabContent;
2019-01-10 21:37:02 +01:00
2020-07-30 16:07:13 +02:00
if (index == 0) {
2019-01-10 21:37:02 +01:00
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
self.tabContent = tabContent;
}
2018-10-23 01:05:09 +03:00
var controller = tabControllers[index];
2019-01-10 21:37:02 +01:00
if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
2020-07-30 16:07:13 +02:00
if (index === 0) {
2019-01-10 22:10:45 +01:00
controller = self;
2020-07-30 16:07:13 +02:00
} else if (index === 6) {
2019-01-10 22:10:45 +01:00
controller = new controllerFactory(view, tabContent, {
2020-05-04 12:44:12 +02:00
collectionType: 'livetv'
2019-01-10 22:10:45 +01:00
});
} else {
controller = new controllerFactory(view, params, tabContent);
}
2019-01-10 21:37:02 +01:00
tabControllers[index] = controller;
if (controller.initTab) {
controller.initTab();
}
}
callback(controller);
});
2018-10-23 01:05:09 +03:00
}
function preLoadTab(page, index) {
2019-01-10 21:37:02 +01:00
getTabController(page, index, function (controller) {
2019-01-10 22:10:45 +01:00
if (renderedTabs.indexOf(index) === -1 && controller.preRender) {
2019-01-10 21:37:02 +01:00
controller.preRender();
}
});
2018-10-23 01:05:09 +03:00
}
function loadTab(page, index) {
2019-01-10 21:37:02 +01:00
currentTabIndex = index;
getTabController(page, index, function (controller) {
initialTabIndex = null;
2020-07-30 16:07:13 +02:00
if (renderedTabs.indexOf(index) == -1) {
if (index === 1) {
2019-01-10 21:37:02 +01:00
renderedTabs.push(index);
}
controller.renderTab();
2019-01-10 22:10:45 +01:00
} else if (controller.onShow) {
controller.onShow();
2019-01-10 21:37:02 +01:00
}
currentTabController = controller;
});
2018-10-23 01:05:09 +03:00
}
2019-01-10 22:10:45 +01:00
function onInputCommand(evt) {
2020-05-04 12:44:12 +02:00
if (evt.detail.command === 'search') {
2019-01-10 22:10:45 +01:00
evt.preventDefault();
2020-05-04 12:44:12 +02:00
Dashboard.navigate('search.html?collectionType=livetv');
2018-10-23 01:05:09 +03:00
}
}
2019-01-10 21:37:02 +01:00
var isViewRestored;
var self = this;
2020-05-04 12:44:12 +02:00
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex('livetv'));
2019-01-10 21:37:02 +01:00
var initialTabIndex = currentTabIndex;
var lastFullRender = 0;
2020-05-04 12:44:12 +02:00
[].forEach.call(view.querySelectorAll('.sectionTitleTextButton-programs'), function (link) {
2018-10-23 01:05:09 +03:00
var href = link.href;
2019-01-10 21:37:02 +01:00
if (href) {
2020-05-04 12:44:12 +02:00
link.href = href + '&serverId=' + ApiClient.serverId();
2019-01-10 21:37:02 +01:00
}
});
self.initTab = function () {
2018-10-23 01:05:09 +03:00
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
2020-05-04 12:44:12 +02:00
var containers = tabContent.querySelectorAll('.itemsContainer');
2019-01-10 21:37:02 +01:00
2019-01-10 22:10:45 +01:00
for (var i = 0, length = containers.length; i < length; i++) {
setScrollClasses(containers[i], enableScrollX());
2019-01-10 21:37:02 +01:00
}
2018-10-23 01:05:09 +03:00
};
2019-01-10 21:37:02 +01:00
self.renderTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
if (enableFullRender()) {
reload(tabContent, true);
lastFullRender = new Date().getTime();
} else {
reload(tabContent);
}
};
var currentTabController;
var tabControllers = [];
var renderedTabs = [];
2020-05-04 12:44:12 +02:00
view.addEventListener('viewbeforeshow', function (evt) {
2019-01-10 22:10:45 +01:00
isViewRestored = evt.detail.isRestored;
2019-01-10 21:37:02 +01:00
initTabs();
});
2020-05-04 12:44:12 +02:00
view.addEventListener('viewshow', function (evt) {
2019-01-10 22:10:45 +01:00
isViewRestored = evt.detail.isRestored;
2019-01-10 21:37:02 +01:00
if (!isViewRestored) {
mainTabsManager.selectedTabIndex(initialTabIndex);
}
2019-01-10 21:37:02 +01:00
inputManager.on(window, onInputCommand);
});
2020-05-04 12:44:12 +02:00
view.addEventListener('viewbeforehide', function (e) {
2019-01-10 21:37:02 +01:00
if (currentTabController && currentTabController.onHide) {
currentTabController.onHide();
}
2019-01-10 21:37:02 +01:00
inputManager.off(window, onInputCommand);
});
2020-05-04 12:44:12 +02:00
view.addEventListener('viewdestroy', function (evt) {
2019-01-10 22:10:45 +01:00
tabControllers.forEach(function (tabController) {
if (tabController.destroy) {
tabController.destroy();
2019-01-10 21:37:02 +01:00
}
});
});
};
});