diff --git a/package.json b/package.json
index a7b683e8f7..38b7580ed9 100644
--- a/package.json
+++ b/package.json
@@ -200,6 +200,7 @@
"src/controllers/playback/queue/index.js",
"src/controllers/playback/video/index.js",
"src/controllers/searchpage.js",
+ "src/controllers/livetvtuner.js",
"src/controllers/shows/episodes.js",
"src/controllers/shows/tvgenres.js",
"src/controllers/shows/tvlatest.js",
diff --git a/src/controllers/livetvtuner.js b/src/controllers/livetvtuner.js
index 92f705c02f..9250c18432 100644
--- a/src/controllers/livetvtuner.js
+++ b/src/controllers/livetvtuner.js
@@ -1,232 +1,228 @@
-define(['globalize', 'loading', 'libraryMenu', 'dom', 'emby-input', 'emby-button', 'emby-checkbox', 'emby-select'], function (globalize, loading, libraryMenu, dom) {
- 'use strict';
+import globalize from 'globalize';
+import loading from 'loading';
+import dom from 'dom';
+import 'emby-input';
+import 'emby-button';
+import 'emby-checkbox';
+import 'emby-select';
- function isM3uVariant(type) {
- return ['nextpvr'].indexOf(type || '') !== -1;
- }
+function isM3uVariant(type) {
+ return ['nextpvr'].indexOf(type || '') !== -1;
+}
- function fillTypes(view, currentId) {
- return ApiClient.getJSON(ApiClient.getUrl('LiveTv/TunerHosts/Types')).then(function (types) {
- var selectType = view.querySelector('.selectType');
- var html = '';
- html += types.map(function (tuner) {
- return '';
- }).join('');
- html += '';
- selectType.innerHTML = html;
- selectType.disabled = null != currentId;
- selectType.value = '';
- onTypeChange.call(selectType);
- });
- }
-
- function reload(view, providerId) {
- view.querySelector('.txtDevicePath').value = '';
- view.querySelector('.chkFavorite').checked = false;
- view.querySelector('.txtDevicePath').value = '';
-
- if (providerId) {
- ApiClient.getNamedConfiguration('livetv').then(function (config) {
- var info = config.TunerHosts.filter(function (i) {
- return i.Id === providerId;
- })[0];
- fillTunerHostInfo(view, info);
- });
- }
- }
-
- function fillTunerHostInfo(view, info) {
- var selectType = view.querySelector('.selectType');
- var type = info.Type || '';
-
- if (info.Source && isM3uVariant(info.Source)) {
- type = info.Source;
- }
-
- selectType.value = type;
+function fillTypes(view, currentId) {
+ return ApiClient.getJSON(ApiClient.getUrl('LiveTv/TunerHosts/Types')).then(function (types) {
+ const selectType = view.querySelector('.selectType');
+ let html = '';
+ html += types.map(function (tuner) {
+ return '';
+ }).join('');
+ html += '';
+ selectType.innerHTML = html;
+ selectType.disabled = null != currentId;
+ selectType.value = '';
onTypeChange.call(selectType);
- view.querySelector('.txtDevicePath').value = info.Url || '';
- view.querySelector('.txtFriendlyName').value = info.FriendlyName || '';
- view.querySelector('.txtUserAgent').value = info.UserAgent || '';
- view.querySelector('.fldDeviceId').value = info.DeviceId || '';
- view.querySelector('.chkFavorite').checked = info.ImportFavoritesOnly;
- view.querySelector('.chkTranscode').checked = info.AllowHWTranscoding;
- view.querySelector('.chkStreamLoop').checked = info.EnableStreamLooping;
- view.querySelector('.txtTunerCount').value = info.TunerCount || '0';
- }
+ });
+}
- function submitForm(page) {
- loading.show();
- var info = {
- Type: page.querySelector('.selectType').value,
- Url: page.querySelector('.txtDevicePath').value || null,
- UserAgent: page.querySelector('.txtUserAgent').value || null,
- FriendlyName: page.querySelector('.txtFriendlyName').value || null,
- DeviceId: page.querySelector('.fldDeviceId').value || null,
- TunerCount: page.querySelector('.txtTunerCount').value || 0,
- ImportFavoritesOnly: page.querySelector('.chkFavorite').checked,
- AllowHWTranscoding: page.querySelector('.chkTranscode').checked,
- EnableStreamLooping: page.querySelector('.chkStreamLoop').checked
- };
+function reload(view, providerId) {
+ view.querySelector('.txtDevicePath').value = '';
+ view.querySelector('.chkFavorite').checked = false;
+ view.querySelector('.txtDevicePath').value = '';
- if (isM3uVariant(info.Type)) {
- info.Source = info.Type;
- info.Type = 'm3u';
- }
-
- var id = getParameterByName('id');
-
- if (id) {
- info.Id = id;
- }
-
- ApiClient.ajax({
- type: 'POST',
- url: ApiClient.getUrl('LiveTv/TunerHosts'),
- data: JSON.stringify(info),
- contentType: 'application/json'
- }).then(function (result) {
- Dashboard.processServerConfigurationUpdateResult();
- Dashboard.navigate('livetvstatus.html');
- }, function () {
- loading.hide();
- Dashboard.alert({
- message: globalize.translate('ErrorSavingTvProvider')
- });
+ if (providerId) {
+ ApiClient.getNamedConfiguration('livetv').then(function (config) {
+ const info = config.TunerHosts.filter(function (i) {
+ return i.Id === providerId;
+ })[0];
+ fillTunerHostInfo(view, info);
});
}
+}
- function getRequirePromise(deps) {
- return new Promise(function (resolve, reject) {
- require(deps, resolve);
- });
+function fillTunerHostInfo(view, info) {
+ const selectType = view.querySelector('.selectType');
+ let type = info.Type || '';
+
+ if (info.Source && isM3uVariant(info.Source)) {
+ type = info.Source;
}
- function getDetectedDevice() {
- return getRequirePromise(['tunerPicker']).then(function (tunerPicker) {
- return new tunerPicker().show({
- serverId: ApiClient.serverId()
- });
- });
- }
+ selectType.value = type;
+ onTypeChange.call(selectType);
+ view.querySelector('.txtDevicePath').value = info.Url || '';
+ view.querySelector('.txtFriendlyName').value = info.FriendlyName || '';
+ view.querySelector('.txtUserAgent').value = info.UserAgent || '';
+ view.querySelector('.fldDeviceId').value = info.DeviceId || '';
+ view.querySelector('.chkFavorite').checked = info.ImportFavoritesOnly;
+ view.querySelector('.chkTranscode').checked = info.AllowHWTranscoding;
+ view.querySelector('.chkStreamLoop').checked = info.EnableStreamLooping;
+ view.querySelector('.txtTunerCount').value = info.TunerCount || '0';
+}
- function onTypeChange() {
- var value = this.value;
- var view = dom.parentWithClass(this, 'page');
- var mayIncludeUnsupportedDrmChannels = 'hdhomerun' === value;
- var supportsTranscoding = 'hdhomerun' === value;
- var supportsFavorites = 'hdhomerun' === value;
- var supportsTunerIpAddress = 'hdhomerun' === value;
- var supportsTunerFileOrUrl = 'm3u' === value;
- var supportsStreamLooping = 'm3u' === value;
- var supportsTunerCount = 'm3u' === value;
- var supportsUserAgent = 'm3u' === value;
- var suppportsSubmit = 'other' !== value;
- var supportsSelectablePath = supportsTunerFileOrUrl;
- var txtDevicePath = view.querySelector('.txtDevicePath');
-
- if (supportsTunerIpAddress) {
- txtDevicePath.label(globalize.translate('LabelTunerIpAddress'));
- view.querySelector('.fldPath').classList.remove('hide');
- } else if (supportsTunerFileOrUrl) {
- txtDevicePath.label(globalize.translate('LabelFileOrUrl'));
- view.querySelector('.fldPath').classList.remove('hide');
- } else {
- view.querySelector('.fldPath').classList.add('hide');
- }
-
- if (supportsSelectablePath) {
- view.querySelector('.btnSelectPath').classList.remove('hide');
- view.querySelector('.txtDevicePath').setAttribute('required', 'required');
- } else {
- view.querySelector('.btnSelectPath').classList.add('hide');
- view.querySelector('.txtDevicePath').removeAttribute('required');
- }
-
- if (supportsUserAgent) {
- view.querySelector('.fldUserAgent').classList.remove('hide');
- } else {
- view.querySelector('.fldUserAgent').classList.add('hide');
- }
-
- if (supportsFavorites) {
- view.querySelector('.fldFavorites').classList.remove('hide');
- } else {
- view.querySelector('.fldFavorites').classList.add('hide');
- }
-
- if (supportsTranscoding) {
- view.querySelector('.fldTranscode').classList.remove('hide');
- } else {
- view.querySelector('.fldTranscode').classList.add('hide');
- }
-
- if (supportsStreamLooping) {
- view.querySelector('.fldStreamLoop').classList.remove('hide');
- } else {
- view.querySelector('.fldStreamLoop').classList.add('hide');
- }
-
- if (supportsTunerCount) {
- view.querySelector('.fldTunerCount').classList.remove('hide');
- view.querySelector('.txtTunerCount').setAttribute('required', 'required');
- } else {
- view.querySelector('.fldTunerCount').classList.add('hide');
- view.querySelector('.txtTunerCount').removeAttribute('required');
- }
-
- if (mayIncludeUnsupportedDrmChannels) {
- view.querySelector('.drmMessage').classList.remove('hide');
- } else {
- view.querySelector('.drmMessage').classList.add('hide');
- }
-
- if (suppportsSubmit) {
- view.querySelector('.button-submit').classList.remove('hide');
- } else {
- view.querySelector('.button-submit').classList.add('hide');
- }
- }
-
- return function (view, params) {
- if (!params.id) {
- view.querySelector('.btnDetect').classList.remove('hide');
- }
-
- view.addEventListener('viewshow', function () {
- var currentId = params.id;
- fillTypes(view, currentId).then(function () {
- reload(view, currentId);
- });
- });
- view.querySelector('form').addEventListener('submit', function (e) {
- submitForm(view);
- e.preventDefault();
- e.stopPropagation();
- return false;
- });
- view.querySelector('.selectType').addEventListener('change', onTypeChange);
- view.querySelector('.btnDetect').addEventListener('click', function () {
- getDetectedDevice().then(function (info) {
- fillTunerHostInfo(view, info);
- });
- });
- view.querySelector('.btnSelectPath').addEventListener('click', function () {
- require(['directorybrowser'], function (directoryBrowser) {
- var picker = new directoryBrowser.default();
- picker.show({
- includeFiles: true,
- callback: function (path) {
- if (path) {
- view.querySelector('.txtDevicePath').value = path;
- }
-
- picker.close();
- }
- });
- });
- });
+function submitForm(page) {
+ loading.show();
+ const info = {
+ Type: page.querySelector('.selectType').value,
+ Url: page.querySelector('.txtDevicePath').value || null,
+ UserAgent: page.querySelector('.txtUserAgent').value || null,
+ FriendlyName: page.querySelector('.txtFriendlyName').value || null,
+ DeviceId: page.querySelector('.fldDeviceId').value || null,
+ TunerCount: page.querySelector('.txtTunerCount').value || 0,
+ ImportFavoritesOnly: page.querySelector('.chkFavorite').checked,
+ AllowHWTranscoding: page.querySelector('.chkTranscode').checked,
+ EnableStreamLooping: page.querySelector('.chkStreamLoop').checked
};
-});
+
+ if (isM3uVariant(info.Type)) {
+ info.Source = info.Type;
+ info.Type = 'm3u';
+ }
+
+ if (getParameterByName('id')) {
+ info.Id = getParameterByName('id');
+ }
+
+ ApiClient.ajax({
+ type: 'POST',
+ url: ApiClient.getUrl('LiveTv/TunerHosts'),
+ data: JSON.stringify(info),
+ contentType: 'application/json'
+ }).then(function (result) {
+ Dashboard.processServerConfigurationUpdateResult();
+ Dashboard.navigate('livetvstatus.html');
+ }, function () {
+ loading.hide();
+ Dashboard.alert({
+ message: globalize.translate('ErrorSavingTvProvider')
+ });
+ });
+}
+
+function getDetectedDevice() {
+ return import('tunerPicker').then(({default: tunerPicker}) => {
+ return new tunerPicker().show({
+ serverId: ApiClient.serverId()
+ });
+ });
+}
+
+function onTypeChange() {
+ const value = this.value;
+ const view = dom.parentWithClass(this, 'page');
+ const mayIncludeUnsupportedDrmChannels = 'hdhomerun' === value;
+ const supportsTranscoding = 'hdhomerun' === value;
+ const supportsFavorites = 'hdhomerun' === value;
+ const supportsTunerIpAddress = 'hdhomerun' === value;
+ const supportsTunerFileOrUrl = 'm3u' === value;
+ const supportsStreamLooping = 'm3u' === value;
+ const supportsTunerCount = 'm3u' === value;
+ const supportsUserAgent = 'm3u' === value;
+ const suppportsSubmit = 'other' !== value;
+ const supportsSelectablePath = supportsTunerFileOrUrl;
+ const txtDevicePath = view.querySelector('.txtDevicePath');
+
+ if (supportsTunerIpAddress) {
+ txtDevicePath.label(globalize.translate('LabelTunerIpAddress'));
+ view.querySelector('.fldPath').classList.remove('hide');
+ } else if (supportsTunerFileOrUrl) {
+ txtDevicePath.label(globalize.translate('LabelFileOrUrl'));
+ view.querySelector('.fldPath').classList.remove('hide');
+ } else {
+ view.querySelector('.fldPath').classList.add('hide');
+ }
+
+ if (supportsSelectablePath) {
+ view.querySelector('.btnSelectPath').classList.remove('hide');
+ view.querySelector('.txtDevicePath').setAttribute('required', 'required');
+ } else {
+ view.querySelector('.btnSelectPath').classList.add('hide');
+ view.querySelector('.txtDevicePath').removeAttribute('required');
+ }
+
+ if (supportsUserAgent) {
+ view.querySelector('.fldUserAgent').classList.remove('hide');
+ } else {
+ view.querySelector('.fldUserAgent').classList.add('hide');
+ }
+
+ if (supportsFavorites) {
+ view.querySelector('.fldFavorites').classList.remove('hide');
+ } else {
+ view.querySelector('.fldFavorites').classList.add('hide');
+ }
+
+ if (supportsTranscoding) {
+ view.querySelector('.fldTranscode').classList.remove('hide');
+ } else {
+ view.querySelector('.fldTranscode').classList.add('hide');
+ }
+
+ if (supportsStreamLooping) {
+ view.querySelector('.fldStreamLoop').classList.remove('hide');
+ } else {
+ view.querySelector('.fldStreamLoop').classList.add('hide');
+ }
+
+ if (supportsTunerCount) {
+ view.querySelector('.fldTunerCount').classList.remove('hide');
+ view.querySelector('.txtTunerCount').setAttribute('required', 'required');
+ } else {
+ view.querySelector('.fldTunerCount').classList.add('hide');
+ view.querySelector('.txtTunerCount').removeAttribute('required');
+ }
+
+ if (mayIncludeUnsupportedDrmChannels) {
+ view.querySelector('.drmMessage').classList.remove('hide');
+ } else {
+ view.querySelector('.drmMessage').classList.add('hide');
+ }
+
+ if (suppportsSubmit) {
+ view.querySelector('.button-submit').classList.remove('hide');
+ } else {
+ view.querySelector('.button-submit').classList.add('hide');
+ }
+}
+
+export default function (view, params) {
+ if (!params.id) {
+ view.querySelector('.btnDetect').classList.remove('hide');
+ }
+
+ view.addEventListener('viewshow', function () {
+ const currentId = params.id;
+ fillTypes(view, currentId).then(function () {
+ reload(view, currentId);
+ });
+ });
+ view.querySelector('form').addEventListener('submit', function (e) {
+ submitForm(view);
+ e.preventDefault();
+ e.stopPropagation();
+ return false;
+ });
+ view.querySelector('.selectType').addEventListener('change', onTypeChange);
+ view.querySelector('.btnDetect').addEventListener('click', function () {
+ getDetectedDevice().then(function (info) {
+ fillTunerHostInfo(view, info);
+ });
+ });
+ view.querySelector('.btnSelectPath').addEventListener('click', function () {
+ import('directorybrowser').then(({default: directorybrowser}) => {
+ const picker = new directorybrowser();
+ picker.show({
+ includeFiles: true,
+ callback: function (path) {
+ if (path) {
+ view.querySelector('.txtDevicePath').value = path;
+ }
+
+ picker.close();
+ }
+ });
+ });
+ });
+}