// ==UserScript==
// @name 爱学术网页下载器
// @namespace https://qinlili.bid/
// @version 0.1
// @description 下载爱学术原始pdf
// @author 琴梨梨
// @match https://www.iresearchbook.cn/f/cdf/read?*
// @icon https://www.iresearchbook.cn/favicon.ico
// @grant none
// @run-at document-idle
// ==/UserScript==
(function() {
'use strict';
// 自主开发的下载器公共组件
var SakiProgress={isLoaded:!1,progres:!1,pgDiv:!1,textSpan:!1,first:!1,alertMode:!1,init:function(t){if(this.isLoaded)console.error("Multi Instance Error-SakiProgress Already Loaded!");else{this.isLoaded=!0,console.info("SakiProgress Initializing!\nVersion:1.0.4\nQinlili Tech:Github@qinlili23333"),this.pgDiv=document.createElement("div"),this.pgDiv.id="pgdiv",this.pgDiv.style="z-index:9999;position:fixed;background-color:white;min-height:32px;width:auto;height:32px;left:0px;right:0px;top:0px;box-shadow:0px 2px 2px 1px rgba(0, 0, 0, 0.5);transition:opacity 0.5s;display:none;",this.pgDiv.style.opacity=0,s()>=9999&&(this.pgDiv.style.zIndex=s()+1),this.first=document.body.firstElementChild,document.body.insertBefore(this.pgDiv,this.first),this.first.style.transition="margin-top 0.5s",this.progress=document.createElement("div"),this.progress.id="dlprogress",this.progress.style="position: absolute;top: 0;bottom: 0;left: 0;background-color: #F17C67;z-index: -1;width:0%;transition: width 0.25s ease-in-out,opacity 0.25s,background-color 1s;",t&&this.setColor(t),this.pgDiv.appendChild(this.progress),this.textSpan=document.createElement("span"),this.textSpan.style="padding-left:4px;font-size:24px;",this.textSpan.style.display="inline-block",this.pgDiv.appendChild(this.textSpan);var i=".barBtn:hover{ background-color: #cccccc }.barBtn:active{ background-color: #999999 }",e=document.createElement("style");e.styleSheet?e.styleSheet.cssText=i:e.appendChild(document.createTextNode(i)),document.getElementsByTagName("head")[0].appendChild(e),console.info("SakiProgress Initialized!")}function s(){let t=[...document.all].map(t=>+window.getComputedStyle(t).zIndex||0);return t.length?Math.max(...t)+1:0}},destroy:function(){this.pgDiv&&(document.body.removeChild(this.pgDiv),this.isLoaded=!1,this.progres=!1,this.pgDiv=!1,this.textSpan=!1,this.first=!1,console.info("SakiProgress Destroyed!You Can Reload Later!"))},setPercent:function(t){this.progress?this.progress.style.width=t+"%":console.error("Not Initialized Error-Please Call `init` First!")},clearProgress:function(){this.progress?(this.progress.style.opacity=0,setTimeout(function(){SakiProgress.progress.style.width="0%"},500),setTimeout(function(){SakiProgress.progress.style.opacity=1},750)):console.error("Not Initialized Error-Please Call `init` First!")},hideDiv:function(){this.pgDiv?this.alertMode?setTimeout(function(){SakiProgress.pgDiv.style.opacity=0,SakiProgress.first.style.marginTop="",setTimeout(function(){SakiProgress.pgDiv.style.display="none"},500)},3e3):(this.pgDiv.style.opacity=0,this.first.style.marginTop="",setTimeout(function(){SakiProgress.pgDiv.style.display="none"},500)):console.error("Not Initialized Error-Please Call `init` First!")},showDiv:function(){this.pgDiv?(this.pgDiv.style.display="",setTimeout(function(){SakiProgress.pgDiv.style.opacity=1},10),this.first.style.marginTop=this.pgDiv.clientHeight+8+"px"):console.error("Not Initialized Error-Please Call `init` First!")},setText:function(t){this.textSpan?this.alertMode?setTimeout(function(){SakiProgress.alertMode||(SakiProgress.textSpan.innerText=t)},3e3):this.textSpan.innerText=t:console.error("Not Initialized Error-Please Call `init` First!")},setTextAlert:function(t){this.textSpan?(this.textSpan.innerText=t,this.alertMode=!0,setTimeout(function(){this.alertMode=!1},3e3)):console.error("Not Initialized Error-Please Call `init` First!")},setColor:function(t){this.progress?this.progress.style.backgroundColor=t:console.error("Not Initialized Error-Please Call `init` First!")},addBtn:function(t){if(this.pgDiv){var i=document.createElement("img");return i.style="display: inline-block;right:0px;float:right;height:32px;width:32px;transition:background-color 0.2s;",i.className="barBtn",i.src=t,this.pgDiv.appendChild(i),i}console.error("Not Initialized Error-Please Call `init` First!")},removeBtn:function(t){this.pgDiv?t&&this.pgDiv.removeChild(t):console.error("Not Initialized Error-Please Call `init` First!")}};
var XHRDL={isLoaded:!1,dlList:[],listBtn:!1,listDiv:!1,listBar:!1,clsBtn:!1,init:function(){if(this.isLoaded)console.error("Multi Instance Error-WebXHRDL Already Loaded!");else{console.info("WebXHRDL Initializing!\nVersion:Preview0.1.0\nQinlili Tech:Github@qinlili23333");try{SakiProgress.init()}catch{return console.error("Initialize Failed!Is SakiProgress Loaded?"),!1}this.isLoaded=!0,this.listBtn=SakiProgress.addBtn("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4cHgiIGZpbGw9IiMwMDAwMDAiPjxnPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjwvZz48Zz48Zz48cGF0aCBkPSJNMTguMzIsNC4yNkMxNi44NCwzLjA1LDE1LjAxLDIuMjUsMTMsMi4wNXYyLjAyYzEuNDYsMC4xOCwyLjc5LDAuNzYsMy45LDEuNjJMMTguMzIsNC4yNnogTTE5LjkzLDExaDIuMDIgYy0wLjItMi4wMS0xLTMuODQtMi4yMS01LjMyTDE4LjMxLDcuMUMxOS4xNyw4LjIxLDE5Ljc1LDkuNTQsMTkuOTMsMTF6IE0xOC4zMSwxNi45bDEuNDMsMS40M2MxLjIxLTEuNDgsMi4wMS0zLjMyLDIuMjEtNS4zMiBoLTIuMDJDMTkuNzUsMTQuNDYsMTkuMTcsMTUuNzksMTguMzEsMTYuOXogTTEzLDE5LjkzdjIuMDJjMi4wMS0wLjIsMy44NC0xLDUuMzItMi4yMWwtMS40My0xLjQzIEMxNS43OSwxOS4xNywxNC40NiwxOS43NSwxMywxOS45M3ogTTEzLDEyVjdoLTJ2NUg3bDUsNWw1LTVIMTN6IE0xMSwxOS45M3YyLjAyYy01LjA1LTAuNS05LTQuNzYtOS05Ljk1czMuOTUtOS40NSw5LTkuOTV2Mi4wMiBDNy4wNSw0LjU2LDQsNy45Miw0LDEyUzcuMDUsMTkuNDQsMTEsMTkuOTN6Ii8+PC9nPjwvZz48L3N2Zz4="),this.listBtn.onclick=XHRDL.showList,SakiProgress.showDiv(),SakiProgress.setText("初始化下载器..."),SakiProgress.setPercent(20),this.listDiv=document.createElement("div"),this.listDiv.style="z-index:9999;position:fixed;background-color:white;width:auto;margin-top:32px;height:100%;left:0px;right:0px;top:0px;transition:opacity 0.5s;display:none;",this.listDiv.style.opacity=0,this.listBar=document.createElement("div"),this.listBar.style="z-index:10000;position:fixed;background-color:white;min-height:32px;margin-top:32px;width:auto;height:32px;left:0px;right:0px;top:0px;box-shadow:0px 2px 2px 1px rgba(0, 0, 0, 0.5);",this.listDiv.appendChild(this.listBar),document.body.appendChild(this.listDiv);var i=document.createElement("img");i.style="display: inline-block;right:0px;float:right;height:32px;width:32px;transition:background-color 0.2s;",i.className="barBtn",i.src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjQ4cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjQ4cHgiIGZpbGw9IiMwMDAwMDAiPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjxwYXRoIGQ9Ik0yMiwzLjQxbC01LjI5LDUuMjlMMjAsMTJoLThWNGwzLjI5LDMuMjlMMjAuNTksMkwyMiwzLjQxeiBNMy40MSwyMmw1LjI5LTUuMjlMMTIsMjB2LThINGwzLjI5LDMuMjlMMiwyMC41OUwzLjQxLDIyeiIvPjwvc3ZnPg==",this.listBar.appendChild(i),i.onclick=function(){XHRDL.hideList()},this.clsBtn=i,SakiProgress.setPercent(100),SakiProgress.setText("下载器已加载!"),setTimeout(function(){SakiProgress.clearProgress(),SakiProgress.hideDiv()},1e3),console.info("WebXHRDL Initialized!")}},destroy:function(i){this.isLoaded&&(i&&SakiProgress.destroy(),this.isLoaded=!1,this.dlList=[],this.listBtn=!1,this.listDiv=!1,this.listBar=!1,this.clsBtn=!1,console.info("WebXHRDL Destroyed!You Can Reload Later!"))},showList:function(){XHRDL.isLoaded?(XHRDL.listDiv.style.display="",setTimeout(function(){XHRDL.listDiv.style.opacity=1},10)):console.error("Not Initialized Error-Please Call `init` First!")},hideList:function(){XHRDL.isLoaded?(XHRDL.listDiv.style.opacity=0,setTimeout(function(){XHRDL.listDiv.style.display="none"},500)):console.error("Not Initialized Error-Please Call `init` First!")},saveTaskList:function(){XHRDL.isLoaded?window.localStorage.setItem("XHRDL_List",JSON.stringify(this.dlList)):console.error("Not Initialized Error-Please Call `init` First!")},loadTaskList:function(){if(XHRDL.isLoaded){var i=window.localStorage;this.dlList=JSON.parse(i.getItem("XHRDL_List"))}else console.error("Not Initialized Error-Please Call `init` First!")},newTask:function(i,e){if(this.isLoaded){var s=this.dlList;s[s.length]={taskUrl:i,fileName:e},SakiProgress.showDiv(),SakiProgress.setText("已添加新任务:"+e),this.DLEngine.isWorking||this.DLEngine.start()}else console.error("Not Initialized Error-Please Call `init` First!")},DLEngine:{isWorking:!1,start:function(){this.isWorking?console.error("WebXHRDL Engine Already Started!"):(console.info("Start WebXHRDL Engine...\nChecking Tasks..."),this.isWorking=!0,SakiProgress.showDiv(),this.dlFirstFile())},stop:function(){this.isWorking=!1,SakiProgress.hideDiv(),SakiProgress.setText(""),XHRDL.dlList[0]?console.info("All Tasks Done!WebXHRDL Engine Stopped!"):console.info("WebXHRDL Engine Stopped!Tasks Paused!")},dlFirstFile:function(){var i=XHRDL.dlList[0];SakiProgress.showDiv(),SakiProgress.setPercent(0),SakiProgress.setText("正在下载"+i.fileName);var e=new XMLHttpRequest;e.responseType="blob",e.onprogress=(e=>{if(e.loaded&&e.total){var s=String(Number(e.loaded)/Number(e.total)*100).substring(0,4);SakiProgress.setText(i.fileName+"已下载"+s+"%"),SakiProgress.setPercent(s)}}),e.onload=(s=>{if(4===e.readyState)if(200===e.status){var t=URL.createObjectURL(e.response);SakiProgress.setText("正在写出"+i.fileName);var o=document.createElement("a"),r=i.fileName;o.href=t,o.download=r,o.click(),window.URL.revokeObjectURL(t),SakiProgress.clearProgress(),XHRDL.dlList.splice(0,1),XHRDL.DLEngine.checkNext()}else SakiProgress.setTextAlert(i.fileName+"暂不支持下载,跳过"),XHRDL.dlList.splice(0,1),XHRDL.DLEngine.checkNext()}),e.onerror=function(e){if(i.errorRetry)SakiProgress.setTextAlert(i.fileName+"下载又失败了,放弃");else{SakiProgress.setTextAlert(i.fileName+"下载失败,置入列尾等待重试"),i.errorRetry=!0;var s=XHRDL.dlList;s[s.length]=i}XHRDL.dlList.splice(0,1),XHRDL.DLEngine.checkNext()},e.open("GET",i.taskUrl),e.send()},checkNext:function(){XHRDL.dlList[0]?this.dlFirstFile():this.stop()}}};
XHRDL.init();
//召唤下载按钮
var dlBtn=document.getElementById("download");
dlBtn.style="";
dlBtn.onclick=function(){
var dlUrl=window.location.origin+DEFAULT_URL;
var flName=document.title.substr(0,document.title.indexOf(" -"))+".pdf";
XHRDL.newTask(dlUrl,flName);
}
})();