1 line
No EOL
20 KiB
JavaScript
1 line
No EOL
20 KiB
JavaScript
import connectionManager from"./../emby-apiclient/connectionmanager.js";import globalize from"./../common/globalize.js";import layoutManager from"./../layoutmanager.js";import dialogHelper from"./../dialoghelper/dialoghelper.js";import"./../emby-elements/emby-scroller/emby-scroller.js";import"./../emby-elements/emby-select/emby-select.js";import"./../emby-elements/emby-input/emby-input.js";import"./../emby-elements/emby-button/paper-icon-button-light.js";import"./../emby-elements/emby-dialogclosebutton/emby-dialogclosebutton.js";import{appHost}from"./../common/servicelocator.js";import focusManager from"./../focusmanager.js";import appSettings from"./../common/appsettings.js";import registrationServices from"./../registrationservices/registrationservices.js";import appRouter from"./../approuter.js";function showDialog(options){return Emby.importModule("./modules/dialog/dialog.js").then(function(dialog){return dialog(options)})}require(["formDialogStyle"]);let currentDialogOptions;function showToast(options){return Emby.importModule("./modules/toast/toast.js").then(function(toast){return toast(options)})}function showAlert(options){return Emby.importModule("./modules/common/dialogs/alert.js").then(function(alert){return alert(options)})}function submitJob(dlg,apiClient,userId,syncOptions,form){if(!userId)throw new Error("userId cannot be null");if(!syncOptions)throw new Error("syncOptions cannot be null");if(!form)throw new Error("form cannot be null");var selectSyncTarget=form.querySelector(".selectSyncTarget");let target=selectSyncTarget?.value;if(!target)return showAlert(globalize.translate("PleaseSelectDeviceToSyncTo")),!1;var selectedIndex=selectSyncTarget.selectedIndex;if(-1!==selectedIndex&&((selectSyncTarget.options[selectedIndex]?.innerHTML)?.toLowerCase().includes("windows")&&!apiClient.isMinServerVersion("4.8.4")))return showAlert("To use the download feature, please update Emby Server to at least 4.8.4 or greater."),!0;selectSyncTarget={userId:userId,TargetId:target,ParentId:syncOptions.ParentId,Category:syncOptions.Category};return setJobValues(selectSyncTarget,form),syncOptions.items&&syncOptions.items.length&&(selectSyncTarget.ItemIds=(syncOptions.items||[]).map(function(i){return i.Id||i}).join(",")),apiClient.createSyncJob(selectSyncTarget).then(function(){dialogHelper.close(dlg),showSubmissionToast(syncOptions.mode,target,apiClient),"download"===syncOptions.mode&&syncNow()}),!0}function showSubmissionToast(mode,targetId,apiClient){showToast("convert"===mode?globalize.translate("ConvertingDots"):globalize.translate("DownloadingDots"))}function syncNow(){require(["localsync"],function(localSync){localSync.sync()})}function submitQuickSyncJob(apiClient,userId,targetId,syncOptions){if(!userId)throw new Error("userId cannot be null");if(!syncOptions)throw new Error("syncOptions cannot be null");if(targetId)return userId={userId:userId,TargetId:targetId,ParentId:syncOptions.ParentId,Category:syncOptions.Category,Quality:syncOptions.Quality,Bitrate:syncOptions.Bitrate},syncOptions.items&&syncOptions.items.length&&(userId.ItemIds=(syncOptions.items||[]).map(function(i){return i.Id||i}).join(",")),apiClient.createSyncJob(userId).then(function(){showSubmissionToast(syncOptions.mode,targetId,apiClient),"download"===syncOptions.mode&&syncNow()});throw new Error("targetId cannot be null")}function setJobValues(job,form){var txtBitrate=form.querySelector(".txtBitrate");let bitrate=txtBitrate?txtBitrate.value:null;bitrate=bitrate&&1e6*parseFloat(bitrate),job.Bitrate=bitrate;txtBitrate=form.querySelector(".selectQuality"),txtBitrate&&(job.Quality=txtBitrate.value,appSettings.set("sync-lastquality",job.Quality||"")),txtBitrate=form.querySelector(".selectProfile"),txtBitrate&&(job.Profile=txtBitrate.value),txtBitrate=form.querySelector(".selectJobContainer"),txtBitrate&&(job.Container=txtBitrate.value),txtBitrate=form.querySelector(".selectVideoCodec"),txtBitrate&&(job.VideoCodec=txtBitrate.value),txtBitrate=form.querySelector(".selectAudioCodec"),txtBitrate&&(job.AudioCodec=txtBitrate.value),txtBitrate=form.querySelector(".txtItemLimit"),txtBitrate&&(job.ItemLimit=txtBitrate.value||null),txtBitrate=form.querySelector(".chkSyncNewContent"),txtBitrate&&(job.SyncNewContent=txtBitrate.checked),txtBitrate=form.querySelector(".chkUnwatchedOnly");txtBitrate&&(job.UnwatchedOnly=txtBitrate.checked)}function renderForm(options){return new Promise(function(resolve,reject){require(["emby-checkbox","emby-input","emby-select"],function(){renderFormInternal(options,connectionManager.deviceId(),resolve)})})}function renderFormInternal(options,defaultTargetId,resolve){let elem=options.elem;var dialogOptions=options.dialogOptions;let targets=dialogOptions.Targets,html="";var mode=options.mode,targetContainerClass="download"===mode?" hide":"",syncTargetLabel="convert"===mode?globalize.translate("LabelConvertTo"):globalize.translate("LabelDownloadTo");"download"===mode&&(targets=targets.filter(function(t){return defaultTargetId===t.Id})),options.readOnlySyncTarget?html=(html+='<div class="inputContainer'+targetContainerClass+'">')+'<input is="emby-input" type="text" class="selectSyncTarget" readonly label="'+syncTargetLabel+'"/></div>':(html+='<div class="selectContainer'+targetContainerClass+'">',targetContainerClass=targets.length?"":" required",html=(html+='<select is="emby-select" class="selectSyncTarget"'+targetContainerClass+' label="'+syncTargetLabel+'">')+targets.map(function(t){return"<option"+(defaultTargetId===t.Id?" selected":"")+' value="'+t.Id+'">'+t.Name+"</option>"}).join("")+"</select>",targets.length||(html+='<div class="fieldDescription">'+globalize.translate("LabelSyncNoTargetsHelp")+"</div>"),appHost.supports("externallinks")&&(html+='<div class="fieldDescription"><a is="emby-linkbutton" class="button-link lnkLearnMore" href="'+("convert"===mode?"https://support.emby.media/support/solutions/articles/44001849018-convert-media":"https://support.emby.media/support/solutions/articles/44001162174-sync")+'" target="_blank">'+globalize.translate("LearnMore")+"</a></div>"),html+="</div>");let settingsDisabled=!1;options.readOnlySyncTarget&&-1===dialogOptions.Options.indexOf("UnwatchedOnly")&&-1===dialogOptions.Options.indexOf("SyncNewContent")&&-1===dialogOptions.Options.indexOf("ItemLimit")&&(settingsDisabled=!0);html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html=(html+='<div class="fldProfile selectContainer hide">')+'<select is="emby-select" class="selectProfile" '+(settingsDisabled?"disabled":"")+' label="'+globalize.translate("Profile")+'"></select>')+'<div class="fieldDescription profileDescription"></div></div>')+'<div class="customProfileOptions hide"><div class="selectContainer">')+'<select is="emby-select" class="selectJobContainer" required '+(settingsDisabled?"disabled":"")+' label="'+globalize.translate("Container")+'"><option value="mkv">mkv</option>')+'<option value="mp4">mp4</option><option value="ts">ts</option>')+'</select><div class="fieldDescription containerDescription"></div>')+'</div><div class="selectContainer">')+'<select is="emby-select" class="selectVideoCodec" required '+(settingsDisabled?"disabled":"")+' label="'+globalize.translate("LabelVideoCodec")+'"><option value="h264">h264</option>')+'<option value="hevc">hevc</option><option value="h264,hevc">h264, hevc</option><option value="hevc,h264">hevc, h264</option>')+'</select><div class="fieldDescription videoCodecDescription"></div>')+'</div><div class="selectContainer">')+'<select is="emby-select" class="selectAudioCodec" required '+(settingsDisabled?"disabled":"")+' label="'+globalize.translate("LabelAudioCodec")+'">')+'<option value="aac">aac</option><option value="mp3">mp3</option>')+'<option value="aac,mp3">aac, mp3</option><option value="aac,mp3,ac3">aac, mp3, ac3</option></select>')+'<div class="fieldDescription audioCodecDescription"></div></div>')+'</div><div class="fldQuality selectContainer hide">')+'<select is="emby-select" class="selectQuality" required '+(settingsDisabled?"disabled":"")+' label="'+globalize.translate("Quality")+'">')+'</select><div class="fieldDescription qualityDescription"></div>')+'</div><div class="fldBitrate inputContainer hide">')+'<input is="emby-input" type="number" inputmode="decimal" step=".1" min=".1" '+(settingsDisabled?"readonly":"")+' class="txtBitrate" label="'+globalize.translate("LabelBitrateMbps")+'"/></div>',-1!==dialogOptions.Options.indexOf("UnwatchedOnly")&&(html=(html=(html=(html+='<div class="checkboxContainer checkboxContainer-withDescription">')+'<label><input is="emby-checkbox" type="checkbox" class="chkUnwatchedOnly"/>')+("convert"===mode?"<span>"+globalize.translate("ConvertUnwatchedVideosOnly")+"</span>":"<span>"+globalize.translate("SyncUnwatchedVideosOnly")+"</span>")+"</label>")+("convert"===mode?'<div class="fieldDescription checkboxFieldDescription">'+globalize.translate("ConvertUnwatchedVideosOnlyHelp")+"</div>":'<div class="fieldDescription checkboxFieldDescription">'+globalize.translate("SyncUnwatchedVideosOnlyHelp")+"</div>")+"</div>"),-1!==dialogOptions.Options.indexOf("SyncNewContent")&&(html=(html=(html=(html+='<div class="checkboxContainer checkboxContainer-withDescription">')+'<label><input is="emby-checkbox" type="checkbox" class="chkSyncNewContent"/>')+("convert"===mode?"<span>"+globalize.translate("AutomaticallyConvertNewContent")+"</span>":"<span>"+globalize.translate("AutomaticallySyncNewContent")+"</span>")+"</label>")+("convert"===mode?'<div class="fieldDescription checkboxFieldDescription">'+globalize.translate("AutomaticallyConvertNewContentHelp")+"</div>":'<div class="fieldDescription checkboxFieldDescription">'+globalize.translate("AutomaticallySyncNewContentHelp")+"</div>")+"</div>"),-1!==dialogOptions.Options.indexOf("ItemLimit")&&(html=(html=(html+='<div class="inputContainer">')+'<input is="emby-input" type="number" inputmode="numeric" step="1" min="1" class="txtItemLimit" label="'+globalize.translate("LabelItemLimit")+'"/>')+("convert"===mode?'<div class="fieldDescription">'+globalize.translate("ConvertItemLimitHelp")+"</div>":'<div class="fieldDescription">'+globalize.translate("DownloadItemLimitHelp")+"</div>")+"</div>"),elem.innerHTML=html;targetContainerClass=elem.querySelector(".selectSyncTarget"),targetContainerClass&&(targetContainerClass.addEventListener("change",function(){loadQualityOptions(elem,this.value,options.dialogOptionsFn).then(resolve)}),targetContainerClass.dispatchEvent(new CustomEvent("change",{bubbles:!0}))),syncTargetLabel=elem.querySelector(".selectProfile"),syncTargetLabel&&(syncTargetLabel.addEventListener("change",function(){onProfileChange(elem,this.value)}),dialogOptions.ProfileOptions.length)&&syncTargetLabel.dispatchEvent(new CustomEvent("change",{bubbles:!0})),mode=elem.querySelector(".selectQuality"),mode&&(mode.addEventListener("change",function(){onQualityChange(elem,this.value)}),mode.dispatchEvent(new CustomEvent("change",{bubbles:!0}))),targetContainerClass=elem.querySelector(".selectJobContainer"),targetContainerClass&&(targetContainerClass.addEventListener("change",onContainerChange),targetContainerClass.dispatchEvent(new CustomEvent("change",{bubbles:!0}))),dialogOptions=elem.querySelector(".selectVideoCodec"),dialogOptions&&(dialogOptions.addEventListener("change",onVideoCodecChange),dialogOptions.dispatchEvent(new CustomEvent("change",{bubbles:!0}))),syncTargetLabel=elem.querySelector(".selectAudioCodec");syncTargetLabel&&(syncTargetLabel.addEventListener("change",onAudioCodecChange),syncTargetLabel.dispatchEvent(new CustomEvent("change",{bubbles:!0}))),setTimeout(function(){focusManager.autoFocus(elem)},100)}function showWifiMessage(){var options={title:globalize.translate("HeaderWaitingForWifi"),text:globalize.translate("WifiRequiredToDownload")},items=[];items.push({name:options.confirmText||globalize.translate("ButtonOk"),id:"ok",type:"submit"}),items.push({name:options.cancelText||globalize.translate("HeaderDownloadSettings"),id:"downloadsettings",type:"cancel"}),options.buttons=items,showDialog(options).then(function(result){return"ok"===result?Promise.resolve():"downloadsettings"===result?(appRouter.show(appRouter.getRouteUrl("downloadsettings")),Promise.resolve()):Promise.reject()})}function validateNetwork(){switch(navigator.connection?navigator.connection.type:null){case"cellular":case"bluetooth":return showWifiMessage(),!1;default:return!0}}function showSyncMenu(options){return"download"===options.mode&&appSettings.syncOnlyOnWifi()&&!validateNetwork()?Promise.reject():registrationServices.validateFeature("sync").then(function(){return showSyncMenuInternal(options)})}function enableAutoSync(options){return"download"===options.mode&&("Audio"===(options=(options.items||[])[0]||{}).Type||"Photo"===options.Type||"MusicAlbum"===options.Type||"MusicArtist"===options.Type||"MusicGenre"===options.Type||"Playlist"===options.Type&&"Audio"===options.MediaType)}function showSyncMenuInternal(options){let apiClient=connectionManager.getApiClient(options.items[0]),userId=apiClient.getCurrentUserId();if(enableAutoSync(options))return submitQuickSyncJob(apiClient,userId,apiClient.deviceId(),{items:options.items,Quality:"custom",Bitrate:appSettings.maxStaticMusicBitrate()});let dialogOptionsFn=getTargetDialogOptionsFn(apiClient,{UserId:userId,ItemIds:(options.items||[]).map(function(i){return i.Id||i}).join(","),ParentId:options.ParentId,Category:options.Category,IncludeProviders:"convert"===options.mode?"ConvertSyncProvider":null,ExcludeProviders:"convert"===options.mode?null:"ConvertSyncProvider"});return dialogOptionsFn().then(function(dialogOptions){currentDialogOptions=dialogOptions;var dlgElementOptions={removeOnClose:!0,scrollY:!1,autoFocus:!1};layoutManager.tv?dlgElementOptions.size="fullscreen":dlgElementOptions.size="small";let dlg=dialogHelper.createDialog(dlgElementOptions),html=(dlg.classList.add("formDialog"),"");html=(html+='<div class="formDialogHeader">')+'<button type="button" is="emby-dialogclosebutton"></button><h3 class="formDialogHeaderTitle">';dlgElementOptions="convert"===options.mode?globalize.translate("Convert"):globalize.translate("Download");html=html+dlgElementOptions+"</h3>",appHost.supports("externallinks")&&(helpUrl="convert"===options.mode?"https://support.emby.media/support/solutions/articles/44001849018-convert-media":"https://support.emby.media/support/solutions/articles/44001162174-sync",html+='<a is="emby-linkbutton" href="'+helpUrl+'" target="_blank" class="paper-icon-button-light noautofocus btnHelp flex align-items-center dialogHeaderButton button-help"><i class="md-icon"></i></a>'),html=(html=(html=(html=(html=(html+="</div>")+'<div is="emby-scroller" data-horizontal="false" data-forcescrollbar="true" data-focusscroll="true" class="formDialogContent"><div class="scrollSlider">')+'<form class="dialogContentInner dialog-content-centered formSubmitSyncRequest padded-left padded-right"><div class="formFields"></div>')+'<div class="formDialogFooter"><button is="emby-button" type="submit" class="raised button-submit block formDialogFooterItem"><span>'+dlgElementOptions+"</span></button>")+"</div></form>")+"</div></div>",dlg.innerHTML=html;let submitted=!1;dlg.querySelector("form").addEventListener("submit",function(e){return submitted=submitJob(dlg,apiClient,userId,options,this),e.preventDefault(),!1});var helpUrl=dialogHelper.open(dlg);return renderForm({elem:dlg.querySelector(".formFields"),dialogOptions:dialogOptions,dialogOptionsFn:dialogOptionsFn,mode:options.mode}),helpUrl.then(function(){return submitted?Promise.resolve():Promise.reject()})})}function getTargetDialogOptionsFn(apiClient,query){return function(targetId){return query.TargetId=targetId,apiClient.getJSON(apiClient.getUrl("Sync/Options",query))}}function setQualityFieldVisible(form,visible){var fldQuality=form.querySelector(".fldQuality"),selectQuality=form.querySelector(".selectQuality");visible?(fldQuality&&fldQuality.classList.remove("hide"),selectQuality&&(selectQuality.removeAttribute("required"),onQualityChange(form,selectQuality.value))):(fldQuality&&fldQuality.classList.add("hide"),selectQuality&&selectQuality.removeAttribute("required"),onQualityChange(form,""))}function onContainerChange(){this.closest(".selectContainer").querySelector(".fieldDescription").innerHTML=globalize.translate("VideoFilesWillBeConvertedTo",this.value)}function onVideoCodecChange(){var description=this.closest(".selectContainer").querySelector(".fieldDescription"),value=this.value,values=value.split(",");1<values.length?description.innerHTML=globalize.translate("VideoWillBeConvertedToOrCopied",values[0],value):description.innerHTML=globalize.translate("VideoWillBeConvertedTo",value)}function onAudioCodecChange(){var description=this.closest(".selectContainer").querySelector(".fieldDescription"),value=this.value,values=value.split(",");1<values.length?description.innerHTML=globalize.translate("AudioWillBeConvertedToOrCopied",values[0],value):description.innerHTML=globalize.translate("AudioWillBeConvertedTo",value)}function onProfileChange(form,profileId){var options=currentDialogOptions||{},option=(options.ProfileOptions||[]).filter(function(o){return o.Id===profileId})[0],qualityOptions=options.QualityOptions||[],option=(option?(form.querySelector(".profileDescription").innerHTML=option.Description||"",setQualityFieldVisible(form,0<qualityOptions.length&&option.EnableQualityOptions&&-1!==options.Options.indexOf("Quality"))):(form.querySelector(".profileDescription").innerHTML="",setQualityFieldVisible(form,0<qualityOptions.length&&-1!==options.Options.indexOf("Quality"))),form.querySelector(".customProfileOptions")),customProfileSelects=option.querySelectorAll("select");let customProfileSelectsRequired=!1;"custom"===profileId?(option.classList.remove("hide"),customProfileSelectsRequired=!0):option.classList.add("hide");for(let i=0,length=customProfileSelects.length;i<length;i++)customProfileSelectsRequired?customProfileSelects[i].setAttribute("required","required"):customProfileSelects[i].removeAttribute("required")}function onQualityChange(form,qualityId){var option=((currentDialogOptions||{}).QualityOptions||[]).filter(function(o){return o.Id===qualityId})[0],qualityDescription=form.querySelector(".qualityDescription"),qualityDescription=(qualityDescription.innerHTML=option&&option.Description||"",form.querySelector(".fldBitrate")),option=form.querySelector(".txtBitrate");"custom"===qualityId?(qualityDescription&&qualityDescription.classList.remove("hide"),option&&option.setAttribute("required","required")):(qualityDescription&&qualityDescription.classList.add("hide"),option&&option.removeAttribute("required"))}function renderTargetDialogOptions(form,options){currentDialogOptions=options;var fldProfile=form.querySelector(".fldProfile"),selectProfile=form.querySelector(".selectProfile"),fldProfile=(options.ProfileOptions.length&&-1!==options.Options.indexOf("Profile")?(fldProfile&&fldProfile.classList.remove("hide"),selectProfile&&selectProfile.setAttribute("required","required")):(fldProfile&&fldProfile.classList.add("hide"),selectProfile&&selectProfile.removeAttribute("required")),setQualityFieldVisible(form,0<options.QualityOptions.length),selectProfile&&(selectProfile.innerHTML=options.ProfileOptions.map(function(o){var selectedAttribute=o.IsDefault?" selected":"";return'<option value="'+o.Id+'"'+selectedAttribute+">"+o.Name+"</option>"}).join(""),selectProfile.dispatchEvent(new CustomEvent("change",{bubbles:!0}))),form.querySelector(".selectQuality"));if(fldProfile){fldProfile.innerHTML=options.QualityOptions.map(function(o){var selectedAttribute=o.IsDefault?" selected":"";return'<option value="'+o.Id+'"'+selectedAttribute+">"+o.Name+"</option>"}).join("");let lastQuality=appSettings.get("sync-lastquality");lastQuality&&options.QualityOptions.filter(function(i){return i.Id===lastQuality}).length&&(fldProfile.value=lastQuality),fldProfile.dispatchEvent(new CustomEvent("change",{bubbles:!0}))}}function loadQualityOptions(form,targetId,dialogOptionsFn){return dialogOptionsFn(targetId).then(function(options){return renderTargetDialogOptions(form,options)})}export default{showMenu:showSyncMenu,renderForm:renderForm,setJobValues:setJobValues}; |