1 line
8.8 KiB
JavaScript
1 line
8.8 KiB
JavaScript
class DownloadManager{constructor(e){this.downloadFolder=e,this.currentMode="torrent",this.refs={downloadForm:document.getElementById("downloadForm"),torrentMode:document.getElementById("torrentMode"),nzbMode:document.getElementById("nzbMode"),magnetURI:document.getElementById("magnetURI"),torrentFiles:document.getElementById("torrentFiles"),torrentInputs:document.getElementById("torrentInputs"),nzbURLs:document.getElementById("nzbURLs"),nzbFiles:document.getElementById("nzbFiles"),nzbInputs:document.getElementById("nzbInputs"),arr:document.getElementById("arr"),downloadAction:document.getElementById("downloadAction"),downloadUncached:document.getElementById("downloadUncached"),downloadFolder:document.getElementById("downloadFolder"),downloadFolderHint:document.getElementById("downloadFolderHint"),debrid:document.getElementById("debrid"),submitBtn:document.getElementById("submitDownload"),submitButtonText:document.getElementById("submitButtonText"),activeCount:document.getElementById("activeCount"),completedCount:document.getElementById("completedCount"),totalSize:document.getElementById("totalSize")},this.init()}init(){this.loadSavedOptions(),this.bindEvents(),this.handleMagnetFromURL(),this.loadModeFromURL()}bindEvents(){this.refs.downloadForm.addEventListener("submit",e=>this.handleSubmit(e)),this.refs.torrentMode.addEventListener("click",()=>this.switchMode("torrent")),this.refs.nzbMode.addEventListener("click",()=>this.switchMode("nzb")),this.refs.arr.addEventListener("change",()=>this.saveOptions()),this.refs.downloadAction.addEventListener("change",()=>this.saveOptions()),this.refs.downloadUncached.addEventListener("change",()=>this.saveOptions()),this.refs.downloadFolder.addEventListener("change",()=>this.saveOptions()),this.refs.torrentFiles.addEventListener("change",e=>this.handleFileSelection(e)),this.refs.nzbFiles.addEventListener("change",e=>this.handleFileSelection(e)),this.setupDragAndDrop()}loadSavedOptions(){const e={category:localStorage.getItem("downloadCategory")||"",action:localStorage.getItem("downloadAction")||"symlink",uncached:"true"===localStorage.getItem("downloadUncached"),folder:localStorage.getItem("downloadFolder")||this.downloadFolder,mode:localStorage.getItem("downloadMode")||"torrent"};this.refs.arr.value=e.category,this.refs.downloadAction.value=e.action,this.refs.downloadUncached.checked=e.uncached,this.refs.downloadFolder.value=e.folder,this.currentMode=e.mode}saveOptions(){localStorage.setItem("downloadCategory",this.refs.arr.value),localStorage.setItem("downloadAction",this.refs.downloadAction.value),localStorage.setItem("downloadUncached",this.refs.downloadUncached.checked.toString()),localStorage.setItem("downloadFolder",this.refs.downloadFolder.value),localStorage.setItem("downloadMode",this.currentMode)}handleMagnetFromURL(){const e=new URLSearchParams(window.location.search).get("magnet");e&&(this.refs.magnetURI.value=e,history.replaceState({},document.title,window.location.pathname),window.decypharrUtils.createToast("Magnet link loaded from URL","info"))}async handleSubmit(e){e.preventDefault();const t=new FormData;let n=[],s=[],r="/api/add",o="torrent";if("torrent"===this.currentMode){n=this.refs.magnetURI.value.split("\n").map(e=>e.trim()).filter(e=>e.length>0),n.length>0&&t.append("urls",n.join("\n"));for(let e=0;e<this.refs.torrentFiles.files.length;e++)t.append("files",this.refs.torrentFiles.files[e]),s.push(this.refs.torrentFiles.files[e])}else if("nzb"===this.currentMode){n=this.refs.nzbURLs.value.split("\n").map(e=>e.trim()).filter(e=>e.length>0),n.length>0&&t.append("nzbUrls",n.join("\n"));for(let e=0;e<this.refs.nzbFiles.files.length;e++)t.append("nzbFiles",this.refs.nzbFiles.files[e]),s.push(this.refs.nzbFiles.files[e]);r="/api/nzbs/add",o="NZB"}const d=n.length+s.length;if(0!==d)if(d>100)window.decypharrUtils.createToast(`Please submit up to 100 ${o}s at a time`,"warning");else{t.append("arr",this.refs.arr.value),t.append("downloadFolder",this.refs.downloadFolder.value),t.append("action",this.refs.downloadAction.value),t.append("downloadUncached",this.refs.downloadUncached.checked),this.refs.debrid&&t.append("debrid",this.refs.debrid.value);try{window.decypharrUtils.setButtonLoading(this.refs.submitBtn,!0);const e=await window.decypharrUtils.fetcher(r,{method:"POST",body:t,headers:{}}),n=await e.json();if(!e.ok)throw new Error(n.error||"Unknown error");if(n.errors&&n.errors.length>0){console.log(n.errors);let e=` ${n.errors.join("\n")}`;n.results.length>0?window.decypharrUtils.createToast(`Added ${n.results.length} ${o}s with ${n.errors.length} errors \n${e}`,"warning"):window.decypharrUtils.createToast(`Failed to add ${o}s \n${e}`,"error")}else window.decypharrUtils.createToast(`Successfully added ${n.results.length} ${o}${n.results.length>1?"s":""}!`),this.clearForm()}catch(e){console.error("Error adding downloads:",e),window.decypharrUtils.createToast(`Error adding downloads: ${e.message}`,"error")}finally{window.decypharrUtils.setButtonLoading(this.refs.submitBtn,!1)}}else window.decypharrUtils.createToast(`Please provide at least one ${o}`,"warning")}switchMode(e){this.currentMode=e,this.saveOptions(),this.updateURL(e),"torrent"===e?(this.refs.torrentMode.classList.remove("btn-outline"),this.refs.torrentMode.classList.add("btn-primary"),this.refs.nzbMode.classList.remove("btn-primary"),this.refs.nzbMode.classList.add("btn-outline"),this.refs.torrentInputs.classList.remove("hidden"),this.refs.nzbInputs.classList.add("hidden"),this.refs.submitButtonText.textContent="Add to Download Queue",this.refs.downloadFolderHint.textContent="Leave empty to use default qBittorrent folder"):(this.refs.nzbMode.classList.remove("btn-outline"),this.refs.nzbMode.classList.add("btn-primary"),this.refs.torrentMode.classList.remove("btn-primary"),this.refs.torrentMode.classList.add("btn-outline"),this.refs.nzbInputs.classList.remove("hidden"),this.refs.torrentInputs.classList.add("hidden"),this.refs.submitButtonText.textContent="Add to NZB Queue",this.refs.downloadFolderHint.textContent="Leave empty to use default SABnzbd folder")}clearForm(){"torrent"===this.currentMode?(this.refs.magnetURI.value="",this.refs.torrentFiles.value=""):(this.refs.nzbURLs.value="",this.refs.nzbFiles.value="")}handleFileSelection(e){const t=e.target.files;if(t.length>0){const e=Array.from(t).map(e=>e.name).join(", ");window.decypharrUtils.createToast(`Selected ${t.length} file${t.length>1?"s":""}: ${e}`,"info")}}setupDragAndDrop(){const e=this.refs.downloadForm;["dragenter","dragover","dragleave","drop"].forEach(t=>{e.addEventListener(t,this.preventDefaults,!1)}),["dragenter","dragover"].forEach(t=>{e.addEventListener(t,()=>this.highlight(e),!1)}),["dragleave","drop"].forEach(t=>{e.addEventListener(t,()=>this.unhighlight(e),!1)}),e.addEventListener("drop",e=>this.handleDrop(e),!1)}preventDefaults(e){e.preventDefault(),e.stopPropagation()}highlight(e){e.classList.add("border-primary","border-2","border-dashed","bg-primary/5")}unhighlight(e){e.classList.remove("border-primary","border-2","border-dashed","bg-primary/5")}handleDrop(e){const t=e.dataTransfer.files;if("torrent"===this.currentMode){const e=Array.from(t).filter(e=>e.name.toLowerCase().endsWith(".torrent"));if(e.length>0){const t=new DataTransfer;e.forEach(e=>t.items.add(e)),this.refs.torrentFiles.files=t.files,this.handleFileSelection({target:{files:e}})}else window.decypharrUtils.createToast("Please drop .torrent files only","warning")}else{const e=Array.from(t).filter(e=>e.name.toLowerCase().endsWith(".nzb"));if(e.length>0){const t=new DataTransfer;e.forEach(e=>t.items.add(e)),this.refs.nzbFiles.files=t.files,this.handleFileSelection({target:{files:e}})}else window.decypharrUtils.createToast("Please drop .nzb files only","warning")}}loadModeFromURL(){const e=new URLSearchParams(window.location.search).get("mode");this.currentMode="nzb"===e||"torrent"===e?e:this.currentMode||"torrent",this.setModeUI(this.currentMode)}setModeUI(e){"torrent"===e?(this.refs.torrentMode.classList.remove("btn-outline"),this.refs.torrentMode.classList.add("btn-primary"),this.refs.nzbMode.classList.remove("btn-primary"),this.refs.nzbMode.classList.add("btn-outline"),this.refs.torrentInputs.classList.remove("hidden"),this.refs.nzbInputs.classList.add("hidden"),this.refs.submitButtonText.textContent="Add to Download Queue",this.refs.downloadFolderHint.textContent="Leave empty to use default qBittorrent folder"):(this.refs.nzbMode.classList.remove("btn-outline"),this.refs.nzbMode.classList.add("btn-primary"),this.refs.torrentMode.classList.remove("btn-primary"),this.refs.torrentMode.classList.add("btn-outline"),this.refs.nzbInputs.classList.remove("hidden"),this.refs.torrentInputs.classList.add("hidden"),this.refs.submitButtonText.textContent="Add to NZB Queue",this.refs.downloadFolderHint.textContent="Leave empty to use default SABnzbd folder")}updateURL(e){const t=new URL(window.location);t.searchParams.set("mode",e),window.history.replaceState({},"",t)}} |