diff --git a/package.json b/package.json
index 22fd43308a..43d806b8de 100644
--- a/package.json
+++ b/package.json
@@ -166,6 +166,8 @@
"src/components/syncPlay/playbackPermissionManager.js",
"src/components/syncPlay/syncPlayManager.js",
"src/components/syncPlay/timeSyncManager.js",
+ "src/components/tvproviders/schedulesdirect.js",
+ "src/components/tvproviders/xmltv.js",
"src/components/viewContainer.js",
"src/controllers/session/addServer/index.js",
"src/controllers/session/forgotPassword/index.js",
diff --git a/src/components/tvproviders/schedulesdirect.js b/src/components/tvproviders/schedulesdirect.js
index a0c29f48b8..9d60310e98 100644
--- a/src/components/tvproviders/schedulesdirect.js
+++ b/src/components/tvproviders/schedulesdirect.js
@@ -1,299 +1,304 @@
-define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emby-input', 'emby-select', 'emby-button', 'flexStyles'], function ($, loading, globalize) {
- 'use strict';
+import $ from 'jQuery';
+import loading from 'loading';
+import globalize from 'globalize';
+import 'emby-checkbox';
+import 'emby-input';
+import 'listViewStyle';
+import 'paper-icon-button-light';
+import 'emby-select';
+import 'emby-button';
+import 'flexStyles';
- loading = loading.default || loading;
+export default function (page, providerId, options) {
+ function reload() {
+ loading.show();
+ ApiClient.getNamedConfiguration('livetv').then(function (config) {
+ var info = config.ListingProviders.filter(function (i) {
+ return i.Id === providerId;
+ })[0] || {};
+ listingsId = info.ListingsId;
+ $('#selectListing', page).val(info.ListingsId || '');
+ page.querySelector('.txtUser').value = info.Username || '';
+ page.querySelector('.txtPass').value = '';
+ page.querySelector('.txtZipCode').value = info.ZipCode || '';
- return function (page, providerId, options) {
- function reload() {
- loading.show();
- ApiClient.getNamedConfiguration('livetv').then(function (config) {
- var info = config.ListingProviders.filter(function (i) {
- return i.Id === providerId;
- })[0] || {};
- listingsId = info.ListingsId;
- $('#selectListing', page).val(info.ListingsId || '');
- page.querySelector('.txtUser').value = info.Username || '';
- page.querySelector('.txtPass').value = '';
- page.querySelector('.txtZipCode').value = info.ZipCode || '';
-
- if (info.Username && info.Password) {
- page.querySelector('.listingsSection').classList.remove('hide');
- } else {
- page.querySelector('.listingsSection').classList.add('hide');
- }
-
- page.querySelector('.chkAllTuners').checked = info.EnableAllTuners;
-
- if (info.EnableAllTuners) {
- page.querySelector('.selectTunersSection').classList.add('hide');
- } else {
- page.querySelector('.selectTunersSection').classList.remove('hide');
- }
-
- setCountry(info);
- refreshTunerDevices(page, info, config.TunerHosts);
- });
- }
-
- function setCountry(info) {
- ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/SchedulesDirect/Countries')).then(function (result) {
- var i;
- var length;
- var countryList = [];
-
- for (var region in result) {
- var countries = result[region];
-
- if (countries.length && region !== 'ZZZ') {
- for (i = 0, length = countries.length; i < length; i++) {
- countryList.push({
- name: countries[i].fullName,
- value: countries[i].shortName
- });
- }
- }
- }
-
- countryList.sort(function (a, b) {
- if (a.name > b.name) {
- return 1;
- }
-
- if (a.name < b.name) {
- return -1;
- }
-
- return 0;
- });
- $('#selectCountry', page).html(countryList.map(function (c) {
- return '';
- }).join('')).val(info.Country || '');
- $(page.querySelector('.txtZipCode')).trigger('change');
- }, function () { // ApiClient.getJSON() error handler
- Dashboard.alert({
- message: globalize.translate('ErrorGettingTvLineups')
- });
- });
- loading.hide();
- }
-
- function sha256(str) {
- if (!self.TextEncoder) {
- return Promise.resolve('');
+ if (info.Username && info.Password) {
+ page.querySelector('.listingsSection').classList.remove('hide');
+ } else {
+ page.querySelector('.listingsSection').classList.add('hide');
}
- var buffer = new TextEncoder('utf-8').encode(str);
- return crypto.subtle.digest('SHA-256', buffer).then(function (hash) {
- return hex(hash);
- });
- }
+ page.querySelector('.chkAllTuners').checked = info.EnableAllTuners;
- function hex(buffer) {
- var hexCodes = [];
- var view = new DataView(buffer);
-
- for (var i = 0; i < view.byteLength; i += 4) {
- var value = view.getUint32(i);
- var stringValue = value.toString(16);
- var paddedValue = ('00000000' + stringValue).slice(-'00000000'.length);
- hexCodes.push(paddedValue);
+ if (info.EnableAllTuners) {
+ page.querySelector('.selectTunersSection').classList.add('hide');
+ } else {
+ page.querySelector('.selectTunersSection').classList.remove('hide');
}
- return hexCodes.join('');
- }
+ setCountry(info);
+ refreshTunerDevices(page, info, config.TunerHosts);
+ });
+ }
- function submitLoginForm() {
- loading.show();
- sha256(page.querySelector('.txtPass').value).then(function (passwordHash) {
- var info = {
- Type: 'SchedulesDirect',
- Username: page.querySelector('.txtUser').value,
- EnableAllTuners: true,
- Password: passwordHash,
- Pw: page.querySelector('.txtPass').value
- };
- var id = providerId;
+ function setCountry(info) {
+ ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/SchedulesDirect/Countries')).then(function (result) {
+ var i;
+ var length;
+ var countryList = [];
- if (id) {
- info.Id = id;
+ for (var region in result) {
+ var countries = result[region];
+
+ if (countries.length && region !== 'ZZZ') {
+ for (i = 0, length = countries.length; i < length; i++) {
+ countryList.push({
+ name: countries[i].fullName,
+ value: countries[i].shortName
+ });
+ }
+ }
+ }
+
+ countryList.sort(function (a, b) {
+ if (a.name > b.name) {
+ return 1;
}
- ApiClient.ajax({
- type: 'POST',
- url: ApiClient.getUrl('LiveTv/ListingProviders', {
- ValidateLogin: true
- }),
- data: JSON.stringify(info),
- contentType: 'application/json',
- dataType: 'json'
- }).then(function (result) {
- Dashboard.processServerConfigurationUpdateResult();
- providerId = result.Id;
- reload();
- }, function () {
- Dashboard.alert({ // ApiClient.ajax() error handler
- message: globalize.translate('ErrorSavingTvProvider')
- });
- });
+ if (a.name < b.name) {
+ return -1;
+ }
+
+ return 0;
});
+ $('#selectCountry', page).html(countryList.map(function (c) {
+ return '';
+ }).join('')).val(info.Country || '');
+ $(page.querySelector('.txtZipCode')).trigger('change');
+ }, function () { // ApiClient.getJSON() error handler
+ Dashboard.alert({
+ message: globalize.translate('ErrorGettingTvLineups')
+ });
+ });
+ loading.hide();
+ }
+
+ function sha256(str) {
+ if (!self.TextEncoder) {
+ return Promise.resolve('');
}
- function submitListingsForm() {
- var selectedListingsId = $('#selectListing', page).val();
+ var buffer = new TextEncoder('utf-8').encode(str);
+ return crypto.subtle.digest('SHA-256', buffer).then(function (hash) {
+ return hex(hash);
+ });
+ }
- if (!selectedListingsId) {
- return void Dashboard.alert({
- message: globalize.translate('ErrorPleaseSelectLineup')
- });
- }
+ function hex(buffer) {
+ var hexCodes = [];
+ var view = new DataView(buffer);
- loading.show();
+ for (var i = 0; i < view.byteLength; i += 4) {
+ var value = view.getUint32(i);
+ var stringValue = value.toString(16);
+ var paddedValue = ('00000000' + stringValue).slice(-'00000000'.length);
+ hexCodes.push(paddedValue);
+ }
+
+ return hexCodes.join('');
+ }
+
+ function submitLoginForm() {
+ loading.show();
+ sha256(page.querySelector('.txtPass').value).then(function (passwordHash) {
+ var info = {
+ Type: 'SchedulesDirect',
+ Username: page.querySelector('.txtUser').value,
+ EnableAllTuners: true,
+ Password: passwordHash,
+ Pw: page.querySelector('.txtPass').value
+ };
var id = providerId;
- ApiClient.getNamedConfiguration('livetv').then(function (config) {
- var info = config.ListingProviders.filter(function (i) {
- return i.Id === id;
- })[0];
- info.ZipCode = page.querySelector('.txtZipCode').value;
- info.Country = $('#selectCountry', page).val();
- info.ListingsId = selectedListingsId;
- info.EnableAllTuners = page.querySelector('.chkAllTuners').checked;
- info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (i) {
- return i.checked;
- }).map(function (i) {
- return i.getAttribute('data-id');
- });
- ApiClient.ajax({
- type: 'POST',
- url: ApiClient.getUrl('LiveTv/ListingProviders', {
- ValidateListings: true
- }),
- data: JSON.stringify(info),
- contentType: 'application/json'
- }).then(function (result) {
- loading.hide();
- if (options.showConfirmation) {
- Dashboard.processServerConfigurationUpdateResult();
- }
-
- Events.trigger(self, 'submitted');
- }, function () {
- loading.hide();
- Dashboard.alert({
- message: globalize.translate('ErrorAddingListingsToSchedulesDirect')
- });
- });
- });
- }
-
- function refreshListings(value) {
- if (!value) {
- return void $('#selectListing', page).html('');
+ if (id) {
+ info.Id = id;
}
- loading.show();
ApiClient.ajax({
- type: 'GET',
- url: ApiClient.getUrl('LiveTv/ListingProviders/Lineups', {
- Id: providerId,
- Location: value,
- Country: $('#selectCountry', page).val()
+ type: 'POST',
+ url: ApiClient.getUrl('LiveTv/ListingProviders', {
+ ValidateLogin: true
}),
+ data: JSON.stringify(info),
+ contentType: 'application/json',
dataType: 'json'
}).then(function (result) {
- $('#selectListing', page).html(result.map(function (o) {
- return '';
- }));
-
- if (listingsId) {
- $('#selectListing', page).val(listingsId);
- }
-
- loading.hide();
- }, function (result) {
- Dashboard.alert({
- message: globalize.translate('ErrorGettingTvLineups')
+ Dashboard.processServerConfigurationUpdateResult();
+ providerId = result.Id;
+ reload();
+ }, function () {
+ Dashboard.alert({ // ApiClient.ajax() error handler
+ message: globalize.translate('ErrorSavingTvProvider')
});
- refreshListings('');
+ });
+ });
+ }
+
+ function submitListingsForm() {
+ var selectedListingsId = $('#selectListing', page).val();
+
+ if (!selectedListingsId) {
+ return void Dashboard.alert({
+ message: globalize.translate('ErrorPleaseSelectLineup')
+ });
+ }
+
+ loading.show();
+ var id = providerId;
+ ApiClient.getNamedConfiguration('livetv').then(function (config) {
+ var info = config.ListingProviders.filter(function (i) {
+ return i.Id === id;
+ })[0];
+ info.ZipCode = page.querySelector('.txtZipCode').value;
+ info.Country = $('#selectCountry', page).val();
+ info.ListingsId = selectedListingsId;
+ info.EnableAllTuners = page.querySelector('.chkAllTuners').checked;
+ info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (i) {
+ return i.checked;
+ }).map(function (i) {
+ return i.getAttribute('data-id');
+ });
+ ApiClient.ajax({
+ type: 'POST',
+ url: ApiClient.getUrl('LiveTv/ListingProviders', {
+ ValidateListings: true
+ }),
+ data: JSON.stringify(info),
+ contentType: 'application/json'
+ }).then(function (result) {
loading.hide();
- });
- }
- function getTunerName(providerId) {
- switch (providerId = providerId.toLowerCase()) {
- case 'm3u':
- return 'M3U Playlist';
- case 'hdhomerun':
- return 'HDHomerun';
- case 'satip':
- return 'DVB';
- default:
- return 'Unknown';
- }
- }
-
- function refreshTunerDevices(page, providerInfo, devices) {
- var html = '';
-
- for (var i = 0, length = devices.length; i < length; i++) {
- var device = devices[i];
- html += '
';
- var enabledTuners = providerInfo.EnabledTuners || [];
- var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
- var checkedAttribute = isChecked ? ' checked' : '';
- html += '
';
- html += '
';
- html += '
';
- html += device.FriendlyName || getTunerName(device.Type);
- html += '
';
- html += '
';
- html += device.Url;
- html += '
';
- html += '
';
- html += '
';
- }
-
- page.querySelector('.tunerList').innerHTML = html;
- }
-
- var listingsId;
- var self = this;
-
- self.submit = function () {
- page.querySelector('.btnSubmitListingsContainer').click();
- };
-
- self.init = function () {
- options = options || {};
-
- // Only hide the buttons if explicitly set to false; default to showing if undefined or null
- // FIXME: rename this option to clarify logic
- var hideCancelButton = options.showCancelButton === false;
- page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
-
- var hideSubmitButton = options.showSubmitButton === false;
- page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
-
- $('.formLogin', page).on('submit', function () {
- submitLoginForm();
- return false;
- });
- $('.formListings', page).on('submit', function () {
- submitListingsForm();
- return false;
- });
- $('.txtZipCode', page).on('change', function () {
- refreshListings(this.value);
- });
- page.querySelector('.chkAllTuners').addEventListener('change', function (e) {
- if (e.target.checked) {
- page.querySelector('.selectTunersSection').classList.add('hide');
- } else {
- page.querySelector('.selectTunersSection').classList.remove('hide');
+ if (options.showConfirmation) {
+ Dashboard.processServerConfigurationUpdateResult();
}
+
+ Events.trigger(self, 'submitted');
+ }, function () {
+ loading.hide();
+ Dashboard.alert({
+ message: globalize.translate('ErrorAddingListingsToSchedulesDirect')
+ });
});
- $('.createAccountHelp', page).html(globalize.translate('MessageCreateAccountAt', 'http://www.schedulesdirect.org'));
- reload();
- };
+ });
+ }
+
+ function refreshListings(value) {
+ if (!value) {
+ return void $('#selectListing', page).html('');
+ }
+
+ loading.show();
+ ApiClient.ajax({
+ type: 'GET',
+ url: ApiClient.getUrl('LiveTv/ListingProviders/Lineups', {
+ Id: providerId,
+ Location: value,
+ Country: $('#selectCountry', page).val()
+ }),
+ dataType: 'json'
+ }).then(function (result) {
+ $('#selectListing', page).html(result.map(function (o) {
+ return '';
+ }));
+
+ if (listingsId) {
+ $('#selectListing', page).val(listingsId);
+ }
+
+ loading.hide();
+ }, function (result) {
+ Dashboard.alert({
+ message: globalize.translate('ErrorGettingTvLineups')
+ });
+ refreshListings('');
+ loading.hide();
+ });
+ }
+
+ function getTunerName(providerId) {
+ switch (providerId = providerId.toLowerCase()) {
+ case 'm3u':
+ return 'M3U Playlist';
+ case 'hdhomerun':
+ return 'HDHomerun';
+ case 'satip':
+ return 'DVB';
+ default:
+ return 'Unknown';
+ }
+ }
+
+ function refreshTunerDevices(page, providerInfo, devices) {
+ var html = '';
+
+ for (var i = 0, length = devices.length; i < length; i++) {
+ var device = devices[i];
+ html += '';
+ var enabledTuners = providerInfo.EnabledTuners || [];
+ var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
+ var checkedAttribute = isChecked ? ' checked' : '';
+ html += '
';
+ html += '
';
+ html += '
';
+ html += device.FriendlyName || getTunerName(device.Type);
+ html += '
';
+ html += '
';
+ html += device.Url;
+ html += '
';
+ html += '
';
+ html += '
';
+ }
+
+ page.querySelector('.tunerList').innerHTML = html;
+ }
+
+ var listingsId;
+ var self = this;
+
+ self.submit = function () {
+ page.querySelector('.btnSubmitListingsContainer').click();
};
-});
+
+ self.init = function () {
+ options = options || {};
+
+ // Only hide the buttons if explicitly set to false; default to showing if undefined or null
+ // FIXME: rename this option to clarify logic
+ var hideCancelButton = options.showCancelButton === false;
+ page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
+
+ var hideSubmitButton = options.showSubmitButton === false;
+ page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
+
+ $('.formLogin', page).on('submit', function () {
+ submitLoginForm();
+ return false;
+ });
+ $('.formListings', page).on('submit', function () {
+ submitListingsForm();
+ return false;
+ });
+ $('.txtZipCode', page).on('change', function () {
+ refreshListings(this.value);
+ });
+ page.querySelector('.chkAllTuners').addEventListener('change', function (e) {
+ if (e.target.checked) {
+ page.querySelector('.selectTunersSection').classList.add('hide');
+ } else {
+ page.querySelector('.selectTunersSection').classList.remove('hide');
+ }
+ });
+ $('.createAccountHelp', page).html(globalize.translate('MessageCreateAccountAt', 'http://www.schedulesdirect.org'));
+ reload();
+ };
+};
diff --git a/src/components/tvproviders/xmltv.js b/src/components/tvproviders/xmltv.js
index 2203bc1fea..84e222fe09 100644
--- a/src/components/tvproviders/xmltv.js
+++ b/src/components/tvproviders/xmltv.js
@@ -1,191 +1,193 @@
-define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listViewStyle', 'paper-icon-button-light'], function ($, loading, globalize) {
- 'use strict';
+import $ from 'jQuery';
+import loading from 'loading';
+import globalize from 'globalize';
+import 'emby-checkbox';
+import 'emby-input';
+import 'listViewStyle';
+import 'paper-icon-button-light';
- loading = loading.default || loading;
+export default function (page, providerId, options) {
+ function getListingProvider(config, id) {
+ if (config && id) {
+ var result = config.ListingProviders.filter(function (provider) {
+ return provider.Id === id;
+ })[0];
- return function (page, providerId, options) {
- function getListingProvider(config, id) {
- if (config && id) {
- var result = config.ListingProviders.filter(function (provider) {
- return provider.Id === id;
- })[0];
-
- if (result) {
- return Promise.resolve(result);
- }
-
- return getListingProvider();
+ if (result) {
+ return Promise.resolve(result);
}
- return ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/Default'));
+ return getListingProvider();
}
- function reload() {
- loading.show();
- ApiClient.getNamedConfiguration('livetv').then(function (config) {
- getListingProvider(config, providerId).then(function (info) {
- page.querySelector('.txtPath').value = info.Path || '';
- page.querySelector('.txtKids').value = (info.KidsCategories || []).join('|');
- page.querySelector('.txtNews').value = (info.NewsCategories || []).join('|');
- page.querySelector('.txtSports').value = (info.SportsCategories || []).join('|');
- page.querySelector('.txtMovies').value = (info.MovieCategories || []).join('|');
- page.querySelector('.txtMoviePrefix').value = info.MoviePrefix || '';
- page.querySelector('.txtUserAgent').value = info.UserAgent || '';
- page.querySelector('.chkAllTuners').checked = info.EnableAllTuners;
+ return ApiClient.getJSON(ApiClient.getUrl('LiveTv/ListingProviders/Default'));
+ }
- if (page.querySelector('.chkAllTuners').checked) {
- page.querySelector('.selectTunersSection').classList.add('hide');
- } else {
- page.querySelector('.selectTunersSection').classList.remove('hide');
- }
+ function reload() {
+ loading.show();
+ ApiClient.getNamedConfiguration('livetv').then(function (config) {
+ getListingProvider(config, providerId).then(function (info) {
+ page.querySelector('.txtPath').value = info.Path || '';
+ page.querySelector('.txtKids').value = (info.KidsCategories || []).join('|');
+ page.querySelector('.txtNews').value = (info.NewsCategories || []).join('|');
+ page.querySelector('.txtSports').value = (info.SportsCategories || []).join('|');
+ page.querySelector('.txtMovies').value = (info.MovieCategories || []).join('|');
+ page.querySelector('.txtMoviePrefix').value = info.MoviePrefix || '';
+ page.querySelector('.txtUserAgent').value = info.UserAgent || '';
+ page.querySelector('.chkAllTuners').checked = info.EnableAllTuners;
- refreshTunerDevices(page, info, config.TunerHosts);
- loading.hide();
- });
- });
- }
-
- function getCategories(txtInput) {
- var value = txtInput.value;
-
- if (value) {
- return value.split('|');
- }
-
- return [];
- }
-
- function submitListingsForm() {
- loading.show();
- var id = providerId;
- ApiClient.getNamedConfiguration('livetv').then(function (config) {
- var info = config.ListingProviders.filter(function (provider) {
- return provider.Id === id;
- })[0] || {};
- info.Type = 'xmltv';
- info.Path = page.querySelector('.txtPath').value;
- info.MoviePrefix = page.querySelector('.txtMoviePrefix').value || null;
- info.UserAgent = page.querySelector('.txtUserAgent').value || null;
- info.MovieCategories = getCategories(page.querySelector('.txtMovies'));
- info.KidsCategories = getCategories(page.querySelector('.txtKids'));
- info.NewsCategories = getCategories(page.querySelector('.txtNews'));
- info.SportsCategories = getCategories(page.querySelector('.txtSports'));
- info.EnableAllTuners = page.querySelector('.chkAllTuners').checked;
- info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (tuner) {
- return tuner.checked;
- }).map(function (tuner) {
- return tuner.getAttribute('data-id');
- });
- ApiClient.ajax({
- type: 'POST',
- url: ApiClient.getUrl('LiveTv/ListingProviders', {
- ValidateListings: true
- }),
- data: JSON.stringify(info),
- contentType: 'application/json'
- }).then(function (result) {
- loading.hide();
-
- if (options.showConfirmation !== false) {
- Dashboard.processServerConfigurationUpdateResult();
- }
-
- Events.trigger(self, 'submitted');
- }, function () {
- loading.hide();
- Dashboard.alert({
- message: globalize.translate('ErrorAddingXmlTvFile')
- });
- });
- });
- }
-
- function getTunerName(providerId) {
- switch (providerId = providerId.toLowerCase()) {
- case 'm3u':
- return 'M3U Playlist';
- case 'hdhomerun':
- return 'HDHomerun';
- case 'satip':
- return 'DVB';
- default:
- return 'Unknown';
- }
- }
-
- function refreshTunerDevices(page, providerInfo, devices) {
- var html = '';
-
- for (var i = 0, length = devices.length; i < length; i++) {
- var device = devices[i];
- html += '';
- var enabledTuners = providerInfo.EnabledTuners || [];
- var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
- var checkedAttribute = isChecked ? ' checked' : '';
- html += '
';
- html += '
';
- html += '
';
- html += device.FriendlyName || getTunerName(device.Type);
- html += '
';
- html += '
';
- html += device.Url;
- html += '
';
- html += '
';
- html += '
';
- }
-
- page.querySelector('.tunerList').innerHTML = html;
- }
-
- function onSelectPathClick(e) {
- var page = $(e.target).parents('.xmltvForm')[0];
-
- require(['directorybrowser'], function (directoryBrowser) {
- var picker = new directoryBrowser.default();
- picker.show({
- includeFiles: true,
- callback: function (path) {
- if (path) {
- var txtPath = page.querySelector('.txtPath');
- txtPath.value = path;
- txtPath.focus();
- }
- picker.close();
- }
- });
- });
- }
-
- var self = this;
-
- self.submit = function () {
- page.querySelector('.btnSubmitListings').click();
- };
-
- self.init = function () {
- options = options || {};
-
- // Only hide the buttons if explicitly set to false; default to showing if undefined or null
- // FIXME: rename this option to clarify logic
- var hideCancelButton = options.showCancelButton === false;
- page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
-
- var hideSubmitButton = options.showSubmitButton === false;
- page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
-
- $('form', page).on('submit', function () {
- submitListingsForm();
- return false;
- });
- page.querySelector('#btnSelectPath').addEventListener('click', onSelectPathClick);
- page.querySelector('.chkAllTuners').addEventListener('change', function (evt) {
- if (evt.target.checked) {
+ if (page.querySelector('.chkAllTuners').checked) {
page.querySelector('.selectTunersSection').classList.add('hide');
} else {
page.querySelector('.selectTunersSection').classList.remove('hide');
}
+
+ refreshTunerDevices(page, info, config.TunerHosts);
+ loading.hide();
});
- reload();
- };
+ });
+ }
+
+ function getCategories(txtInput) {
+ var value = txtInput.value;
+
+ if (value) {
+ return value.split('|');
+ }
+
+ return [];
+ }
+
+ function submitListingsForm() {
+ loading.show();
+ var id = providerId;
+ ApiClient.getNamedConfiguration('livetv').then(function (config) {
+ var info = config.ListingProviders.filter(function (provider) {
+ return provider.Id === id;
+ })[0] || {};
+ info.Type = 'xmltv';
+ info.Path = page.querySelector('.txtPath').value;
+ info.MoviePrefix = page.querySelector('.txtMoviePrefix').value || null;
+ info.UserAgent = page.querySelector('.txtUserAgent').value || null;
+ info.MovieCategories = getCategories(page.querySelector('.txtMovies'));
+ info.KidsCategories = getCategories(page.querySelector('.txtKids'));
+ info.NewsCategories = getCategories(page.querySelector('.txtNews'));
+ info.SportsCategories = getCategories(page.querySelector('.txtSports'));
+ info.EnableAllTuners = page.querySelector('.chkAllTuners').checked;
+ info.EnabledTuners = info.EnableAllTuners ? [] : $('.chkTuner', page).get().filter(function (tuner) {
+ return tuner.checked;
+ }).map(function (tuner) {
+ return tuner.getAttribute('data-id');
+ });
+ ApiClient.ajax({
+ type: 'POST',
+ url: ApiClient.getUrl('LiveTv/ListingProviders', {
+ ValidateListings: true
+ }),
+ data: JSON.stringify(info),
+ contentType: 'application/json'
+ }).then(function (result) {
+ loading.hide();
+
+ if (options.showConfirmation !== false) {
+ Dashboard.processServerConfigurationUpdateResult();
+ }
+
+ Events.trigger(self, 'submitted');
+ }, function () {
+ loading.hide();
+ Dashboard.alert({
+ message: globalize.translate('ErrorAddingXmlTvFile')
+ });
+ });
+ });
+ }
+
+ function getTunerName(providerId) {
+ switch (providerId = providerId.toLowerCase()) {
+ case 'm3u':
+ return 'M3U Playlist';
+ case 'hdhomerun':
+ return 'HDHomerun';
+ case 'satip':
+ return 'DVB';
+ default:
+ return 'Unknown';
+ }
+ }
+
+ function refreshTunerDevices(page, providerInfo, devices) {
+ var html = '';
+
+ for (var i = 0, length = devices.length; i < length; i++) {
+ var device = devices[i];
+ html += '';
+ var enabledTuners = providerInfo.EnabledTuners || [];
+ var isChecked = providerInfo.EnableAllTuners || enabledTuners.indexOf(device.Id) !== -1;
+ var checkedAttribute = isChecked ? ' checked' : '';
+ html += '
';
+ html += '
';
+ html += '
';
+ html += device.FriendlyName || getTunerName(device.Type);
+ html += '
';
+ html += '
';
+ html += device.Url;
+ html += '
';
+ html += '
';
+ html += '
';
+ }
+
+ page.querySelector('.tunerList').innerHTML = html;
+ }
+
+ function onSelectPathClick(e) {
+ var page = $(e.target).parents('.xmltvForm')[0];
+
+ import('directorybrowser').then(({default: directoryBrowser}) => {
+ var picker = new directoryBrowser();
+ picker.show({
+ includeFiles: true,
+ callback: function (path) {
+ if (path) {
+ var txtPath = page.querySelector('.txtPath');
+ txtPath.value = path;
+ txtPath.focus();
+ }
+ picker.close();
+ }
+ });
+ });
+ }
+
+ var self = this;
+
+ self.submit = function () {
+ page.querySelector('.btnSubmitListings').click();
};
-});
+
+ self.init = function () {
+ options = options || {};
+
+ // Only hide the buttons if explicitly set to false; default to showing if undefined or null
+ // FIXME: rename this option to clarify logic
+ var hideCancelButton = options.showCancelButton === false;
+ page.querySelector('.btnCancel').classList.toggle('hide', hideCancelButton);
+
+ var hideSubmitButton = options.showSubmitButton === false;
+ page.querySelector('.btnSubmitListings').classList.toggle('hide', hideSubmitButton);
+
+ $('form', page).on('submit', function () {
+ submitListingsForm();
+ return false;
+ });
+ page.querySelector('#btnSelectPath').addEventListener('click', onSelectPathClick);
+ page.querySelector('.chkAllTuners').addEventListener('change', function (evt) {
+ if (evt.target.checked) {
+ page.querySelector('.selectTunersSection').classList.add('hide');
+ } else {
+ page.querySelector('.selectTunersSection').classList.remove('hide');
+ }
+ });
+ reload();
+ };
+};
diff --git a/src/controllers/livetvguideprovider.js b/src/controllers/livetvguideprovider.js
index 3ec04fd2af..2948fd5be2 100644
--- a/src/controllers/livetvguideprovider.js
+++ b/src/controllers/livetvguideprovider.js
@@ -11,7 +11,7 @@ define(['events', 'loading', 'globalize'], function (events, loading, globalize)
var url = 'components/tvproviders/' + type + '.js';
require([url], function (factory) {
- var instance = new factory(page, providerId, {});
+ var instance = new factory.default(page, providerId, {});
events.on(instance, 'submitted', onListingsSubmitted);
instance.init();
});