jellyfish-web/src/controllers/livetvstatus.js

322 lines
11 KiB
JavaScript
Raw Normal View History

2020-05-04 12:44:12 +02:00
define(['jQuery', 'globalize', 'scripts/taskbutton', 'dom', 'libraryMenu', 'layoutManager', 'loading', 'browser', 'listViewStyle', 'flexStyles', 'emby-itemscontainer', 'cardStyle', 'material-icons', 'emby-button'], function ($, globalize, taskButton, dom, libraryMenu, layoutManager, loading, browser) {
'use strict';
2018-10-23 01:05:09 +03:00
var enableFocusTransform = !browser.slow && !browser.edge;
2018-10-23 01:05:09 +03:00
function getDeviceHtml(device) {
var padderClass;
2020-05-04 12:44:12 +02:00
var html = '';
var cssClass = 'card scalableCard';
var cardBoxCssClass = 'cardBox visualCardBox';
cssClass += ' backdropCard backdropCard-scalable';
padderClass = 'cardPadder-backdrop';
// TODO move card creation code to Card component
if (layoutManager.tv) {
2020-05-04 12:44:12 +02:00
cssClass += ' show-focus';
if (enableFocusTransform) {
2020-05-04 12:44:12 +02:00
cssClass += ' show-animation';
}
}
html += '<div type="button" class="' + cssClass + '" data-id="' + device.Id + '">';
html += '<div class="' + cardBoxCssClass + '">';
html += '<div class="cardScalable visualCardBox-cardScalable">';
html += '<div class="' + padderClass + '"></div>';
html += '<div class="cardContent searchImage">';
2020-04-26 02:37:28 +03:00
html += '<div class="cardImageContainer coveredImage"><span class="cardImageIcon material-icons dvr"></span></div>';
2020-05-04 12:44:12 +02:00
html += '</div>';
html += '</div>';
html += '<div class="cardFooter visualCardBox-cardFooter">';
2020-05-16 18:07:32 +02:00
html += '<button is="paper-icon-button-light" class="itemAction btnCardOptions autoSize" data-action="menu"><span class="material-icons more_vert"></span></button>';
2020-05-04 12:44:12 +02:00
html += '<div class="cardText">' + (device.FriendlyName || getTunerName(device.Type)) + '</div>';
html += '<div class="cardText cardText-secondary">';
2020-05-04 12:44:12 +02:00
html += device.Url || '&nbsp;';
html += '</div>';
html += '</div>';
html += '</div>';
return html += '</div>';
2018-10-23 01:05:09 +03:00
}
function renderDevices(page, devices) {
2020-05-04 12:44:12 +02:00
var html = devices.map(getDeviceHtml).join('');
page.querySelector('.devicesList').innerHTML = html;
2018-10-23 01:05:09 +03:00
}
function deleteDevice(page, id) {
2020-05-04 12:44:12 +02:00
var message = globalize.translate('MessageConfirmDeleteTunerDevice');
2020-05-04 12:44:12 +02:00
require(['confirm'], function (confirm) {
2020-06-18 22:41:43 +03:00
confirm.default(message, globalize.translate('HeaderDeleteDevice')).then(function () {
loading.show();
ApiClient.ajax({
2020-05-04 12:44:12 +02:00
type: 'DELETE',
url: ApiClient.getUrl('LiveTv/TunerHosts', {
2018-10-23 01:05:09 +03:00
Id: id
})
}).then(function () {
reload(page);
});
});
});
2018-10-23 01:05:09 +03:00
}
function reload(page) {
loading.show();
2020-05-04 12:44:12 +02:00
ApiClient.getNamedConfiguration('livetv').then(function (config) {
renderDevices(page, config.TunerHosts);
renderProviders(page, config.ListingProviders);
});
loading.hide();
2018-10-23 01:05:09 +03:00
}
function submitAddDeviceForm(page) {
2020-05-04 12:44:12 +02:00
page.querySelector('.dlgAddDevice').close();
loading.show();
ApiClient.ajax({
2020-05-04 12:44:12 +02:00
type: 'POST',
url: ApiClient.getUrl('LiveTv/TunerHosts'),
2018-10-23 01:05:09 +03:00
data: JSON.stringify({
2020-05-04 12:44:12 +02:00
Type: $('#selectTunerDeviceType', page).val(),
Url: $('#txtDevicePath', page).val()
2018-10-23 01:05:09 +03:00
}),
2020-05-04 12:44:12 +02:00
contentType: 'application/json'
}).then(function () {
reload(page);
}, function () {
2018-10-23 01:05:09 +03:00
Dashboard.alert({
2020-05-04 12:44:12 +02:00
message: globalize.translate('ErrorAddingTunerDevice')
});
});
2018-10-23 01:05:09 +03:00
}
function renderProviders(page, providers) {
2020-05-04 12:44:12 +02:00
var html = '';
2018-10-23 01:05:09 +03:00
if (providers.length) {
html += '<div class="paperList">';
2018-10-23 01:05:09 +03:00
for (var i = 0, length = providers.length; i < length; i++) {
var provider = providers[i];
html += '<div class="listItem">';
2020-04-26 02:37:28 +03:00
html += '<span class="listItemIcon material-icons dvr"></span>';
html += '<div class="listItemBody two-line">';
2020-05-04 12:44:12 +02:00
html += '<a is="emby-linkbutton" style="display:block;padding:0;margin:0;text-align:left;" class="clearLink" href="' + getProviderConfigurationUrl(provider.Type) + '&id=' + provider.Id + '">';
html += '<h3 class="listItemBodyText">';
html += getProviderName(provider.Type);
2020-05-04 12:44:12 +02:00
html += '</h3>';
html += '<div class="listItemBodyText secondary">';
2020-05-04 12:44:12 +02:00
html += provider.Path || provider.ListingsId || '';
html += '</div>';
html += '</a>';
html += '</div>';
2020-05-16 18:07:32 +02:00
html += '<button type="button" is="paper-icon-button-light" class="btnOptions" data-id="' + provider.Id + '"><span class="material-icons listItemAside more_vert"></span></button>';
2020-05-04 12:44:12 +02:00
html += '</div>';
2018-10-23 01:05:09 +03:00
}
2020-05-04 12:44:12 +02:00
html += '</div>';
2018-10-23 01:05:09 +03:00
}
2020-05-04 12:44:12 +02:00
var elem = $('.providerList', page).html(html);
$('.btnOptions', elem).on('click', function () {
var id = this.getAttribute('data-id');
showProviderOptions(page, id, this);
});
2018-10-23 01:05:09 +03:00
}
function showProviderOptions(page, providerId, button) {
var items = [];
items.push({
2020-05-04 12:44:12 +02:00
name: globalize.translate('ButtonDelete'),
id: 'delete'
});
items.push({
2020-05-04 12:44:12 +02:00
name: globalize.translate('MapChannels'),
id: 'map'
});
2020-05-04 12:44:12 +02:00
require(['actionsheet'], function (actionsheet) {
2018-10-23 01:05:09 +03:00
actionsheet.show({
items: items,
positionTo: button
}).then(function (id) {
2018-10-23 01:05:09 +03:00
switch (id) {
2020-05-04 12:44:12 +02:00
case 'delete':
2018-10-23 01:05:09 +03:00
deleteProvider(page, providerId);
break;
2020-05-04 12:44:12 +02:00
case 'map':
mapChannels(page, providerId);
2018-10-23 01:05:09 +03:00
}
});
});
2018-10-23 01:05:09 +03:00
}
function mapChannels(page, providerId) {
2020-06-09 22:57:27 +03:00
require(['components/channelMapper/channelMapper'], function (channelMapper) {
new channelMapper.default({
2018-10-23 01:05:09 +03:00
serverId: ApiClient.serverInfo().Id,
providerId: providerId
}).show();
});
2018-10-23 01:05:09 +03:00
}
function deleteProvider(page, id) {
2020-05-04 12:44:12 +02:00
var message = globalize.translate('MessageConfirmDeleteGuideProvider');
2020-05-04 12:44:12 +02:00
require(['confirm'], function (confirm) {
2020-06-18 22:41:43 +03:00
confirm.default(message, globalize.translate('HeaderDeleteProvider')).then(function () {
loading.show();
ApiClient.ajax({
2020-05-04 12:44:12 +02:00
type: 'DELETE',
url: ApiClient.getUrl('LiveTv/ListingProviders', {
2018-10-23 01:05:09 +03:00
Id: id
})
}).then(function () {
reload(page);
}, function () {
reload(page);
});
});
});
2018-10-23 01:05:09 +03:00
}
function getTunerName(providerId) {
switch (providerId = providerId.toLowerCase()) {
2020-05-04 12:44:12 +02:00
case 'm3u':
return 'M3U';
case 'hdhomerun':
return 'HDHomeRun';
case 'hauppauge':
return 'Hauppauge';
case 'satip':
return 'DVB';
2018-10-23 01:05:09 +03:00
default:
2020-05-04 12:44:12 +02:00
return 'Unknown';
2018-10-23 01:05:09 +03:00
}
}
function getProviderName(providerId) {
switch (providerId = providerId.toLowerCase()) {
2020-05-04 12:44:12 +02:00
case 'schedulesdirect':
return 'Schedules Direct';
case 'xmltv':
return 'XMLTV';
2018-10-23 01:05:09 +03:00
default:
2020-05-04 12:44:12 +02:00
return 'Unknown';
2018-10-23 01:05:09 +03:00
}
}
function getProviderConfigurationUrl(providerId) {
switch (providerId = providerId.toLowerCase()) {
2020-05-04 12:44:12 +02:00
case 'xmltv':
return 'livetvguideprovider.html?type=xmltv';
case 'schedulesdirect':
return 'livetvguideprovider.html?type=schedulesdirect';
2018-10-23 01:05:09 +03:00
}
}
function addProvider(button) {
var menuItems = [];
menuItems.push({
2020-05-04 12:44:12 +02:00
name: 'Schedules Direct',
id: 'SchedulesDirect'
});
menuItems.push({
2020-05-04 12:44:12 +02:00
name: 'XMLTV',
id: 'xmltv'
});
2020-05-04 12:44:12 +02:00
require(['actionsheet'], function (actionsheet) {
2018-10-23 01:05:09 +03:00
actionsheet.show({
items: menuItems,
positionTo: button,
callback: function (id) {
Dashboard.navigate(getProviderConfigurationUrl(id));
2018-10-23 01:05:09 +03:00
}
});
});
2018-10-23 01:05:09 +03:00
}
function addDevice(button) {
2020-05-04 12:44:12 +02:00
Dashboard.navigate('livetvtuner.html');
2018-10-23 01:05:09 +03:00
}
function showDeviceMenu(button, tunerDeviceId) {
var items = [];
items.push({
2020-05-04 12:44:12 +02:00
name: globalize.translate('ButtonDelete'),
id: 'delete'
});
items.push({
2020-05-04 12:44:12 +02:00
name: globalize.translate('ButtonEdit'),
id: 'edit'
});
2020-05-04 12:44:12 +02:00
require(['actionsheet'], function (actionsheet) {
2018-10-23 01:05:09 +03:00
actionsheet.show({
items: items,
positionTo: button
}).then(function (id) {
2018-10-23 01:05:09 +03:00
switch (id) {
2020-05-04 12:44:12 +02:00
case 'delete':
deleteDevice(dom.parentWithClass(button, 'page'), tunerDeviceId);
2018-10-23 01:05:09 +03:00
break;
2020-05-04 12:44:12 +02:00
case 'edit':
Dashboard.navigate('livetvtuner.html?id=' + tunerDeviceId);
2018-10-23 01:05:09 +03:00
}
});
});
2018-10-23 01:05:09 +03:00
}
function onDevicesListClick(e) {
2020-05-04 12:44:12 +02:00
var card = dom.parentWithClass(e.target, 'card');
2018-10-23 01:05:09 +03:00
if (card) {
2020-05-04 12:44:12 +02:00
var id = card.getAttribute('data-id');
var btnCardOptions = dom.parentWithClass(e.target, 'btnCardOptions');
if (btnCardOptions) {
showDeviceMenu(btnCardOptions, id);
} else {
2020-05-04 12:44:12 +02:00
Dashboard.navigate('livetvtuner.html?id=' + id);
}
2018-10-23 01:05:09 +03:00
}
}
2020-05-04 12:44:12 +02:00
$(document).on('pageinit', '#liveTvStatusPage', function () {
2018-10-23 01:05:09 +03:00
var page = this;
2020-05-04 12:44:12 +02:00
$('.btnAddDevice', page).on('click', function () {
addDevice(this);
});
2020-05-04 12:44:12 +02:00
$('.formAddDevice', page).on('submit', function () {
submitAddDeviceForm(page);
return false;
});
2020-05-04 12:44:12 +02:00
$('.btnAddProvider', page).on('click', function () {
addProvider(this);
});
2020-05-04 12:44:12 +02:00
page.querySelector('.devicesList').addEventListener('click', onDevicesListClick);
}).on('pageshow', '#liveTvStatusPage', function () {
2018-10-23 01:05:09 +03:00
var page = this;
reload(page);
taskButton.default({
2020-05-04 12:44:12 +02:00
mode: 'on',
progressElem: page.querySelector('.refreshGuideProgress'),
taskKey: 'RefreshGuide',
button: page.querySelector('.btnRefresh')
});
2020-05-04 12:44:12 +02:00
}).on('pagehide', '#liveTvStatusPage', function () {
2018-10-23 01:05:09 +03:00
var page = this;
taskButton.default({
2020-05-04 12:44:12 +02:00
mode: 'off',
progressElem: page.querySelector('.refreshGuideProgress'),
taskKey: 'RefreshGuide',
button: page.querySelector('.btnRefresh')
});
});
});