define(["globalize", "loading", "libraryMenu", "dom", "emby-input", "emby-button", "emby-checkbox", "emby-select"], function(globalize, loading, libraryMenu, dom) { "use strict"; 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; 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 }; isM3uVariant(info.Type) && (info.Source = info.Type, info.Type = "m3u"); var id = getParameterByName("id"); id && (info.Id = id); info.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 getRequirePromise(deps) { return new Promise(function(resolve, reject) { require(deps, resolve) }) } function getDetectedDevice() { return getRequirePromise(["tunerPicker"]).then(function(tunerPicker) { return (new tunerPicker).show({ serverId: ApiClient.serverId() }) }) } function onTypeChange() { var value = this.value, view = dom.parentWithClass(this, "page"), mayIncludeUnsupportedDrmChannels = "hdhomerun" === value, supportsTranscoding = "hdhomerun" === value, supportsFavorites = "hdhomerun" === value, supportsTunerIpAddress = "hdhomerun" === value, supportsTunerFileOrUrl = "m3u" === value, supportsStreamLooping = "m3u" === value, supportsTunerCount = "m3u" === value, supportsUserAgent = "m3u" === value, suppportsSubmit = "other" !== value, supportsSelectablePath = supportsTunerFileOrUrl, txtDevicePath = view.querySelector(".txtDevicePath"); supportsTunerIpAddress ? (txtDevicePath.label(globalize.translate("LabelTunerIpAddress")), view.querySelector(".fldPath").classList.remove("hide")) : supportsTunerFileOrUrl ? (txtDevicePath.label(globalize.translate("LabelFileOrUrl")), view.querySelector(".fldPath").classList.remove("hide")) : view.querySelector(".fldPath").classList.add("hide"), supportsSelectablePath ? (view.querySelector(".btnSelectPath").classList.remove("hide"), view.querySelector(".txtDevicePath").setAttribute("required", "required")) : (view.querySelector(".btnSelectPath").classList.add("hide"), view.querySelector(".txtDevicePath").removeAttribute("required")), supportsUserAgent ? view.querySelector(".fldUserAgent").classList.remove("hide") : view.querySelector(".fldUserAgent").classList.add("hide"), supportsFavorites ? view.querySelector(".fldFavorites").classList.remove("hide") : view.querySelector(".fldFavorites").classList.add("hide"), supportsTranscoding ? view.querySelector(".fldTranscode").classList.remove("hide") : view.querySelector(".fldTranscode").classList.add("hide"), supportsStreamLooping ? view.querySelector(".fldStreamLoop").classList.remove("hide") : view.querySelector(".fldStreamLoop").classList.add("hide"), supportsTunerCount ? (view.querySelector(".fldTunerCount").classList.remove("hide"), view.querySelector(".txtTunerCount").setAttribute("required", "required")) : (view.querySelector(".fldTunerCount").classList.add("hide"), view.querySelector(".txtTunerCount").removeAttribute("required")), mayIncludeUnsupportedDrmChannels ? view.querySelector(".drmMessage").classList.remove("hide") : view.querySelector(".drmMessage").classList.add("hide"), suppportsSubmit ? view.querySelector(".button-submit").classList.remove("hide") : view.querySelector(".button-submit").classList.add("hide") } return function(view, params) { 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) { return submitForm(view), e.preventDefault(), e.stopPropagation(), !1 }), 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; picker.show({ includeFiles: !0, callback: function(path) { path && (view.querySelector(".txtDevicePath").value = path), picker.close() } }) }) }) } });