// ==UserScript==
// @name 小说下载器
// @version 3.5.0.1619536977475
// @author bgme
// @description 一个可扩展的通用型小说下载器。
// @supportURL https://github.com/yingziwu/novel-downloader
// @match *://www.ciweimao.com/chapter-list/*
// @match *://book.sfacg.com/Novel/*/MainIndex/
// @match *://book.qidian.com/info/*
// @match *://www.jjwxc.net/onebook.php?novelid=*
// @match *://book.zongheng.com/showchapter/*.html
// @match *://huayu.zongheng.com/showchapter/*.html
// @match *://www.17k.com/list/*.html
// @match *://www.shuhai.com/book/*.htm
// @match *://mm.shuhai.com/book/*.htm
// @match *://www.uukanshu.com/b/*/
// @match *://www.yruan.com/article/*.html
// @match *://www.biquwoo.com/bqw*/
// @match *://www.shuquge.com/txt/*/index.html
// @match *://www.dingdiann.net/ddk*/
// @match *://www.xkzw.org/xkzw*/
// @match *://www.266ks.com/*/
// @match *://www.266ks.com/*/index*.html
// @match *://www.hetushu.com/book/*/index.html
// @match *://www.shouda8.com/*/
// @match *://www.shouda88.com/*/
// @match *://www.gebiqu.com/biquge_*/
// @match *://www.meegoq.com/book*.html
// @match *://www.viviyzw.com/book*.html
// @match *://www.xiaoshuodaquan.com/*/
// @match *://www.81book.com/book/*/
// @namespace https://blog.bgme.me
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGUAAABjCAYAAAH1Iv5EAAAABGdBTUEAALGPC/xhBQAAAYRpQ0NQSUNDIHByb2ZpbGUAACiRfZE9SMNAHMVf02pFKg52EHHIUHWxIH7hqFUoQoVQK7TqYHLpFzRpSFJcHAXXgoMfi1UHF2ddHVwFQfADxM3NSdFFSvxfWmgR48FxP97de9y9A4RaiWlWYAzQdNtMxmNiOrMqBl8RQCdCmMKIzCxjTpIS8Bxf9/Dx9S7Ks7zP/Tl61KzFAJ9IPMsM0ybeIJ7etA3O+8RhVpBV4nPiUZMuSPzIdaXBb5zzLgs8M2ymkvPEYWIx38ZKG7OCqRFPEkdUTad8Id1glfMWZ61UYc178heGsvrKMtdpDiKORSxBgggFFRRRgo0orTopFpK0H/PwD7h+iVwKuYpg5FhAGRpk1w/+B7+7tXIT442kUAzoeHGcjyEguAvUq47zfew49RPA/wxc6S1/uQbMfJJebWmRI6B3G7i4bmnKHnC5A/Q/GbIpu5KfppDLAe9n9E0ZoO8W6F5r9Nbcx+kDkKKuEjfAwSEwnKfsdY93d7X39u+ZZn8/iS5ysNxMqHoAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAADdcAAA3XAUIom3gAAAAHdElNRQflBAYMNg49CJybAAAgAElEQVR42u1dd1gUV9c/M1vovVcpEjoICArYhZhELNFYYkQTSTQaJUEUTExEMSqJDU3ArsESjVixxBZUQH01vIiKgqIxtqCoIGpAyu7v+4Odyc7u0oyp33ue5z6PsjNz+7mn/M65RE2Qq4lkC7VAG9atWwdNlJubC41voBVUUVGh9jJ+/fVXAMDDhw+bfHHMmDEgoguCytLS0vgHFi1ahJiYGDg6OmLXrl3834loIcO9QUTEMAwBoOrqatLT06OGhgYaMWIEnTlzhpzbOZKTiyuVFhU2qPWpvr4eRITExEQAgKurKyoqKuDl5QUimsd3aPigQVzVys3gCwCMHTsWRDSDeydT+YWDBw/y/7axsQERQUtLCwxRuerovQEA169fh4+PD+Lj4wEAlZWVcHBwgIhl0a5dO83zFRYWBnt7exAR7t69CyLCnTt3IJfLoa2tDSJ62tTqqASAQ4cOYePGjU3X0AS16WGOPFr8alNkrM3OaPKNTp06NbtgbYy0fxK8dO7cOf7HhoaGJl/k+6n8R26lKz8UEBCAadOm4eHDh2AYpvGlgIAAAICnpycAYNmyZfxLycnJguWUlZXV+NLRo0dhamwIALh//z4AQC6Xo66uDkSE6dOnY9euXVCdAo1tDwgIABHhq6++QlVVFSRiMTS+UVlZiUuXLvH/NzAwABFpXhVGRkYCRrJgwQIAgEwm4/sz/t3RDZqma9fBgwehr68PhmEgl8vh4eGBa9euISUlBSbGxk0vq2nTpvH7qXfv3mjLGgQRWTzPgiV7I+l+IkJGRobaCGdlZUFENLTNHy0rK0NdXR2el65evQp7Y609LVbEMozay3Fxcc9dcW1tLQx1pL+qVELXuAf+85//gGXVKw0LC2v2wzExMSAiuLq64s033xRuPtUFu23bNqiueNVKp06dCgMDAzx79gzXr19HfX09QkNDUV1dDQAYOnQoiAhSqRREBGNjI+HOUK1AX19f7TxgWYZf8BwT9vfz4U5X2NraYurUqUhPT8fkyZNhYmwkJ6JK5U45cx+7cuUKkpKSBJWOHTtWsJ9lMhkAwMzMDPn5+fD39wcRwdraGgAwYsQIjXviMDd5IpblPyiTySAWiQQVTJ06FQAwbdo0AEBRURFmz56NoqIiEBE6derE9fhEk5utvr6e/2hUVBSUFwcRcecSXF1dBa1fvHgxKioqcPDgQaSkpCAyMhJ9+vQBES1v1cEhl8sBAKtXr0avXr1QWlqK8+fPg4jg5ubGz9W7774LIoKVlRW/sa30JGfauo8Fc7Vhw4bGBeDvDwBISUnBw4cPce/ePYgb+S6IaCb9DpJwPaitrVU+PvLpDyJvQ23Jry/yg10YIoSHh/NzpfG4bes8dOrUqdlzvNmzvTn+SUSkK2V/AUDm5uYkEonaukIIAKQSMdq0mq5du/bcXNqkkZcxmirRVZVeVq5cid9Dik1swNcgZpkKHW1tuaZjwMLCos0V3Lx5U3mpE0tEogY5TKprahiZTE5ubm5UXV3NN6C8vFG+zs7ObnKsb9++TQzDkKGhITEMQw0NDVRaWkpExE8wPv30U7z11lvCc0bDiXrq1CkAwK1bt0BE8PX1BRFh37596NGjBx48eNDkyuP/qKOjg9cHDuT/v3nzZjVJMzY2FgsXLgSn1aWnp2Pu3LkAgIsXL4KI0LFjRxAR9LQlsDTQ/oWkYjqj/JHu3bsjKSkJ4WGhGk/Pbt26AQDmz5+PCxcugIjg4uLCz4FYLIafnx+vtxGRORERUlJScPr0aUGLU1JSGivrHAwAmDdvHn799VcQEUQiEf/R/fv3w9LSEn5+fsjOzsb9+/eRnp6uXHEgeZmZ3eU+rCyDKh/LH3/8MYI7+AIAZs6cCQA4c+YMDAwMMHv2bHzyySdITEyEcaOoCZZh5ESk2+RmVN2YZ878NpozZsyAr0d7/rnHjx9j2LBhEIlYfgEofjNVq0AikaBPnz78x7SlYjx79kxQWWhoaGMrWZaXVIgIAwYM4BloQkICLl26pM7PEhISAAAdO3YUsBMfHx9ERkby/584cSKvsJ49exYA8O6776K2thavvfZao+L6W+UBgkocHR35D1VVVQlaP2vWLH74lPcRd1Jy+0RLS0t5h+tq2rB+UqmU/0DSjBmCit577z1IRQykUik8PDz4j23btg379u3D119/rayvt8j+f+OkBgb8wxUVFZg5cyaWLFnC/84J8WlpaY0SjaMjX7lihZk1x/Jnu7i48BWEhoZi7ty5mKHonUKYg1QiAREhKCgIRITAwEDk5+ejvr4eVVVVaJO0YmJsjLCwML6VH374IQDg7bff5nc6t/urqqpw4sQJ5flpFV0cNmyY2ub08PBAZWUlrly5wivAjo6OsLS0fO5zXzBXISEhSE1N5ZVlhRoOIlrX3AeYVlbUkJqaKrp06RJJJBIqKCigU6dOERFJiaj+RYpIlopW36a/kIJcTaVbxCK2gRTy2tatW/mhzsjI4IY29K9sZD8LfUkut5LDw8ORkZHB60jPS4cPH248QMU05Y9quJGJkYH86NGjAlXpz6DCwkKwLAMbA8nKF9UZtUq++eYbpKSk4M+mO3fuQE9XB84mWgXP1RMTHcmNsrKyJit4+PAhnJyc8FfQ06dPYWNtDTN96QMF12llp3Sl8tjYSS1WEBISgvz8/L+kczKZDE5OTpCK2doWl1lpaSmGDx+ODl4vYezY91r8eEZGBoYMGfJCG1xWVsZLE5yA5uTkBCKCn58ftETMz5pOmtpx48ahOTt3Xl4eDHW1WtWxp0+fwt7evkWOp9pYa2trvrGRkZE4ffo0bt26hcmTJ2P48OGCVdAqMQkAHBwcQEQYOnRokw2xMDXGhx/GtmqEOaGjc+fOvIxgb2+PjIwMrF69GoMGDcKmTZv450tKSjB+/HiMHTsWN2/e5P9+8eJF3tgnkUhgZ2cH9jfRYEqznoeamhowDIPo6GgQESJ699L4nJGBfpMdIyIwSlrj6dOnMXjwYIwePVqgTKg2lltKpqamv+leIhYiplFi9vb2xrx58yCXy2GqK/2FnxZDiaTK0swEIpFIo5UFAHJyckBEuHfvHqZOnQoiQu+e3QXPyOVy6OnqCJYiEcHd3R1ffPEF9u/fj2HDhvGNMzU15dxofIno3QtffPEFb/ILDQ1Fly5dsH//fsycORNyuRyzZ89GYWEhoqKiYKCvDzFDP2pcZnfu3AER4e23325y2UyZMgVeXl78/xMSEhorDg4SSO0SsRhGRkaCxlqYm2HVqlUAgIKCAs75ARcXF5ibm2PdunWYNGkStm7divz8fEyePBkZGRkwNDSEvZ2d8rc+adaCp3rqJyoa+csvvzTZsfDwcLXlMn36dBAROvh4NmlPMzMzQ0NDAz755BM0NDTgq6++wuHDh9GhQwcEBgbyjebEZSsrKzBE99tybj42MzPT2GixiIWbm1uzG32gktFD2ebTuXPnRsOtkz0aGhpARBg5ciQcHR1h9ZvSAGtra1y9ehUAcODAAcyfP59Xd/V0dFqlWLwuFosELmJHa2ssX75cs3nNxESg3avSyy+/zO8TrpG2trZYunQpb6QcPnw4goKCUFFRwb9XXl6Ojz/+GElJSXj8+DG2bNnCc1UjIyOEKgZEUaKb6kzx4sWL1Rq1atUqEJFGK2l1dTV69eqF3j27Q1nN5pbQwIEDUVdXhxMnTqi9u2HDBshkMtTU1CAhIYFfRu7u7rAT7gkQEQxEogdENKq1S8uZiDBlypQmUQwWTSy9O3fu4Mcff0R9fT1YlsHYsWPh5+eHadOm4fPPP0dhYSEiIyP5hnXq1ElgYuH2wuzZs/nlpTownIbOMPSQiIxavWFEDN0mIgH2gaMuwcFQhW2sWrUK1tbWvL/HxcUF/fv3VxvdkJAQfPTRR0hOTsZ//vMfwTeqqqqwc+dO1NbWYs+ePQgPD+ff6+jjI2AEPs62j55HgGZYhqqJCLt371YbLU5M6dSpE4qLizXOWklJCRYuXIglS5YgOzsbFRUVmDZtGi8NaGtrw05p8xMR76uWSqVwcHDAhx9+iBMnTkDhMB73InQcfa6ywsJCAMDdu3dhqXQyA8DevXvRpUsXEBEcHR0FLieuDBs2DIWFhbh8+TJsbW1BRDA0NISenh5mzJiBrKwsteV269YtyGQy3qxIRPYvSnlz4Rp2584dfKKQBIgIJiYm+OKLL1BbWysQT548ecJbbr29vUFEPACAcy8XFBQAAJYuXYojR45g8uTJgucVpYSIjP8oFTuCW8tPnjzRuHkjIyMxZMgQ3iP89ddf8yO/adMmZGdnY8WKFWqsXOHAdf+rjB4fcSZTjpUTEV555RW+c48fP8bx48chlUrh7u6ubAhrIKKX6W9Ka7kR9vT0hJOTE/T19ZVHfSz9Q2kM/UtIrC2id9pbGlyx0hNn/VMara8toneczPR+JiIYGxogNjaWl7Rra2vR3rmd3NrwOU1GfxCZaLE02dxAu4yIYGjQ2OiioqJWWVIC/HzllvpaN9pg3H4hZCtlabauVPyEiKCvp9fqRrdEoZ1CYKIneUhEWn9Ewxkxy9Rx4sUHH3yA8+fP/6H2rj4vvwwDbclTgeP8d+9Olnn68OFDbNy48U834A0ZMgRaEnEdEVn//o4oKWOff/4575T8MykmJgYilpX9npPev2/fvmoWFWdnZ4FM9WdRXFwcGOb5fDYO4eHhGj+an5+P/v37/yU246SkJAWMgAa0fqdrgG8o0/vvv4/MzMy/pEOLFi0CEUFX0gpRx8pAq6glq75MJoO1tTUePXr0l3Ro9erVICJY6oqTW+rPEJZh1PAuqvTjjz8iNDQUfxVt3bqVE0aHqE0IJ6leu3YNHbxeQmt8LuPHj0d6evqf0vj169fziEsigrZE/IyIegt64WSqfSI1NZV/acSIEdi8eXOTipQqd7OyshJY31/UqCvbla2srKCvr6+sTapZXuY7WRprbEhUVBTsrcxbNTsFBQUCW/LvHXF3d3doa2vDysqKtzPL5XIsWbIERPSLaicsiAgTx48T6Neq1KlTp1bNDofGUp7d1o64l5cXRCIRdHV1MW/ePDQ0NCAzMxP9+vXDokWLeE301KlT0BXTadWObOncuXMjyE1bGyKWFYQaqPlS9HR4VEpLFBkZKTB8K4+4vr4+D5lhWRbx8fG4fv064uLi0Lt3b2RlZQmWrqqtTEvMgmnU9dtz8lVtXl4e/1BRURFYlgHLMk0KjDt37kRrOBvn+uNMRyEhIfzojx49GtnZ2RgzZgwmTpyIn3/+mW90RkYGhg8frhaekJaWBisrK372BGYoHQn7SJNMZWBgAG1tbTAM06TMZWZi1KILj3O19e3bF2fPnkVBQQG2bNki2FejR49GVFQUcnJymmy4nZ2dWuMt9SWcZ8COiChu8ODBGhsxadIk2NrawsjIEESkhkwEgHXr1oFlNc/O2rVrMXToUPz3v//lvQKLFi1CREQE0tLS1OI30tPT+Ybr6enxoTdccTA34EFvvr6+KCoqwvwvUoQxPLdv39bYGQ5ZeuTIERgaNnYoOztbjf3q6+mqzU63bt3w6quvqh2k06ZNQ25urqDhLMsiMDBQ2WQEZztr3lHk6uoKc3NzfPfdd5g3bx7q6+vR0NAAbTH7QDXeBp9//nmTS8TBwQG9evVCeXk59PT0QEQ4fvy44JkVK1YIONvAgQMxZMgQbNy4EZmZmYKGcyOrBLSHro42Zs+ejUGDBvHeY2uFXycpKQn5+fk4efIk5s+fj82bN0NXV5d715mIyMvV1RVyuRwiloUyzlETwEAsFgNoDNniZkiZwzQ0NEBLKsVHH32IkydPIioqim+ojY2NoOEMwyA+Ph6PHz9GbGwsj5H09PTE5MmTsWbNGnz99dd4+PAh4uPjceTIEdja2gos+kS0gtfLO3bs+NtyCG+ElHJmT1Wqra0FwzC8hb68vJw3xH3//fcC8Vs5/oUrw4cPx08//QQAvGeZg2dFRETgwIEDGDFiBOrq6pCUlITMzExERETwrg1FKeU2eLOgA0XUHHbu3Nnk7PTr108Q83T//n3eZbBnzx4AwLNnz9C1a1fk5uYK3uVmMjg4GJ6enjhw4ADCw8NRUlKCFStWYMWKFXj33Xfh5uambJ0HEf1MRJFNG6VEoryXX35ZUBkXmsoBsDXRtWvXYG9vr4ZK4hq6Y8cOjWK4lZUVDh48iL179+LQoUM4e/Ysli5digULFsDc3Bzm5mYCgLdSR0xa1EW0RaLHmpylbi5OEIvFTYIQAMDDw0ONlVZUVPC++e+++04wkzExMaiursaVK1ewe/du6Ovr8zhi5QNTWedpC7y0IxFp9PclJiaCiJo1Df3www/86ax6lnCjunHjRh4urKenJwDjkiK+k9uHqamp2LRpEy9fiRj10GFVSuA+tG/fPmgCG3ANIiKMGzeu2ZP866+/VkVno127dqr+EL64uLggOTmZdwBxtHfvXowaNQrffPMNjh07BnND7SoiqiYi7SbRRaWlpbyRoaysrEnY1MyZM2FvYwVTU9NmRZKwsDBlHo9hw4bxYk5JSQnc3NzUbGc7duzARx99hIMHD+L+/ftcBDvPFCxNTWTKwSktcqxZs2Zh1qxZMG/CbT1y5EjeslFeXi74bc+ePXzlXGhwTU0NPvvsMyxcuJDfZ3K5HMuWLcPbb7/Nc7TFixfzB629vb3qnmkgoukt2Ys1anz62tp47bXXNHama9euuH37NogIS5cu5f+uUHgQEhKCwsJCNXvYuXPncPHiRQDAkSNHeFlKLBbz8S3KhWVZENHeViNWmwq+be/ggBUrVmj8LTAwsBHEZmbCa4WnT5/mJVVNqLtRo0YJsFzKy4+DdXAnflhYGAdMi2udLYuojmEY1NTUaEbQSST8SaxKPj4+fCSFajyhXC7Hl19+yWO2bG1t4efnpzbivXr1wp49e9QgJTExMfjyyy+V43s+a7EzLENFzQmNTWFXOBiI6pKYNWsWRCIRH0GjXMaMGYOqqir8/PPPSE1NRWpqKo4cOQIAuHfvHlJSUvDBBx8gNjYWAQEBuHz5MoqLi9HSRlemnkQEXV1dtcPv2bNnGjkZF7vVoUMHsCyLV199FXo62oKGGxoaol+/fpg5cybWrFmDx48fq7H1wsJCVFRUIDExkWfdpqam8FNCTShkrbBWm01ZhqkgIrW9UVxcDAsltrts2TL06dMHT58+RVVVFVasWIGPP/4YiYmJGDFiBO7cuaPWcW6jA8D58+d5UA3XYXtzc8EgMAwDT0/PRrnLyvDa81jmx3J2JNXR66ew2AcHBzd53tTW1mLXrl1YuHAh0tLSUFlZqQaocbC3h1gpvk0ZYefl5QVTU1NcuHABCxYs+F3RL0REEqaRfwuk1zcHD8aqVav4jhw8eBBvvPEGBg4ciMzMTMhkMshkMqSlpQlAZsqRfpweP2nSJF4P19bWhrW1NWJjY5GVlYX9+/erylke9DtpJafNceRkY4OVK1di1KhR2L59uwAVxLIs/Pz8eG6ljLj76quvIJPJOCQQj0Gxt7fH+fPnNVr66+vr0b59e+75Qy8qmocXZ7hlERERocZWuUCpbdu2CaC6nAJmaWkJsViMOXPm8L8vXLiQt6KsXr0a+/bt4/HKPkq4rhflPM1TxpsoNzwqKkoAEZTJZJDL5TxQTSQSwc3NDR4eHrxok5+fz+ccuHfvHmbOnInLly/DxMQEEokEZmZmynV8+KI9v4Hcx5tLW6QS0ceHEwLAF198gcuXL/PS8okTJzBnzhwex6LU+DtEZPtH++BvNSXWc+BpR0dHfPbZZzzMlgtnrK6uxoIFC/DkyRP4+/uDZVlYW1srd2Dxn42CGMEtG2UBMS4ujlekkpOTcevWLX6f/PDDD9i+fTsYhhEEghJRDRGF/JWQDkbRCD40itukixYtEswUh6lXQcvtJEU+gr8LzSQi6OjoYPfu3byYcfHiRRgaGsLT0xMSReCqooyivzEZKnOy4OBgHn6uKIUKEOg/hnarnCsz/8nAM0cicqL/0W8mNyIKlrA0vp2xdIe9ie4tiSJUl4hga20p79+/P+Lj42FrZSFjGEZub6z1AxH5/2/ono83dJGwFGdvKN1vbqBdxjQmjWgUmg30ER4ejtjYWGRkZLQJ7yaTybB161a4t3eRExFsDKSXiajf/+fBtiWifmKWki30JbnGutIHynzMQF99sJuzLr8IksvlyMrKQnBQow/M0kD7F20RvUNE4n/yQIuIyJuIRumJaZGdoeQ/OlLRr6qqn5eXF6Kjo7FixQoUFRW1OcnSn0m5ubmI6tuYr8RYT/rIQExTqYl0In83GkdEcG/vKn///fexatUqnD179nelCPy70pkzZ9C/fz8wDANdLXGNuQ47nzSkx/mrKVFZUudc5oMHDxY4df+tdOnSJYwcORJikQgSsajB3lD6LRG1+ysnxIazZzRFV65cQWRkJMaMGdNsIO2/hW7cuIEJEyZAW0sKhmHkDsZaR/9sCc+LVGKPmqPKykrExsbCw8MDe/fuxf8Hun//PpKSkmCsQCFZG2qV/NESnljEMrLm8CrNSToZGRmws7NDbGxsqyCF/wZ68uQJUlNTYaMwd1kaaJe9cAlPzDYaTFRTvLaVfvzxR4SEhKB3794C18m/nWpqapCWlgZHx0ZnhYmetMpYi40nIp3fOzesgZSdJhGL6p0dHWSqMLS20sOHDzFu3DjY2Nhg3bp1f7h+8nei+vp6bNiwgbd862lJau0NJUuohTx4quRHRDlEdIqIbhIRLE2NIBGL4OrkqAYZbSvJZDKsWrUKlpaWGDdunFp6zn8b3bx5E+vXr8eYMWMEcHRF2dOaCUkgRaaNnJwcHDhwACUlJcjMzMTSpUtx584dpMyZDalEDGdHezVk6vNQQUEBwsLC0KFDBzVU3j+BysrKsHXrVowdO1YdgK2E/nBwcPgNBUJUQK2NN3OzMblJRM0GxxUUFCAqKgq9evXCm0MGQ8SycHZ0eCETxElzhoaGSEpK+kti2to66GKxGHZ2dnB1deWhOM7OzoiJicGmTZtQVlaGmpoaWFtZcPa9V1szF3N4rLRFI66U8wi2hnJyctC9e3eYmxqDYRi0d273u1kcJ82tW7cOtra2iI6OVkOTvSi6desW1q9fj5iYGE3sBRYWFvDx8YGrqyvvETI2NsaAAQOwZMkS3mDa0NCAoqIibNiwAUlJSfjyyy+xfPlynDp1CocOHWqcQIZyWm1OISKcO3cOBw4caPQ/syyio6NRUlLS5k7m5OTAzdUZDBGcXhCL4wYvOjoaXbt2bZPluLmVLhaL0b59ewQFBcHFxYVDx0EkEiEoKAiJiYk4fPgwnjx5gvz8fKSmpiI6OhoRERGIjo5Gamoq8vPzW0wrd+XKFUW8IltLRDFN2doYhfh7u0FOdgsXLqTJkyfzPz58+JCmTp1K6zO+IZkcxLIMvfZaX0pOTqaAgIBWSwyPHj2iMaNH0c6sPeTazpHWbdhIXbt2fSGi+/Hjx0kqlZKjoyMdPXqUjh07RseOHaNr134DH5mbm1O7du2IZVm6c+cO/fLLb+Fc7u7u1KtXL+rVqxe5ubnRxYsXKS8vj65evUomJiYUGhpKoaGhFBgYSBKJhH+vpqaGCgsLKT8/n6qqqsjY2JgcHR2pe/fuZGSknm3o0qVLdOzYMUpMTKSnT5+StYk+VT39lWrqQYrF8YMCXrOTUViAG4iISktLqX379ho739DQQLGxsbRs2TKSiMVU39BALMvQ6wNfp89mzCB//9ZZHB48eEATxo2lzB07ydXJkdat/30T9PTpU/L396eysjLq168fHTlyhCoqKgQT0rNnT+rVqxe5u7vTrVu36MKFC/TkyROys7Oj8PBwCgkJIX3939y6lZWVdPr0aTp9+jQVFBSQTCYjT09P6tKlC4WFhZGFhUWTg378+HE6fvw43bt3r3HVMwy5uLiQmZkZVVZW0k8//UQymayp7pQQ0cdERKQvYXKJCE1d3aVKJSUlfPCEr68vDA0NBOn3VJPGNcdS+inM589zBlVWVkJXVxempqaIiopC3759W0xve/PmTWRmZiI+Ph4RERHo2bMnJk2ahPXr16OkpKRJ3enixYtIS0vD0KFDBSFApEh4FxgYCD8/Px7xrFq0JGJY6IkhYhpB+CEhIfD29kb37t0xceJEEJGcVMJK7UQsI5NKpW2+mmH37t0wMzMDwzRmIZs+fTofr8FNEneFQEuD9XJEb36CWiMWv/POOyAijBo1CjY2NjwCdfPmzZg1axbi4+OxfPlynDx5kkeTNjQ0oLCwENu3b4dyNtyLFy8iPT1d46BLJBJ4enoiKCiIv+xMtTAMA1c7SzjY2fJYSJFIBC8vL/j4+MDBwQFTpkzBzp07sXbtWmRmZqK8vBw3b96Evo5Wg5Sl2Wr7xkIiydMSi3h0HIfjbS01NDTwWGGJRILk5GSUlZUhISFBsHoie/dqccB/+ukndO/WtcUJ4qAlr7zyCnr27MnDr44ePYo5c+bgnXfewXvvvYc1a9bg8OHDTQ66Mjjb2dmZP+hVi6WZMQa/PhBjxoxBjx49BLic9u3bIzg4GGZmZhgwYAA2btyITZs2Yfr06UhNTcUvv/yCuro67Nu3D9u2bUNxcTFmz54NEcvKWZZSSenCDI70GUU2tsYV20uAEFTOeNhac8rgwYN5mP3JkycBNMalTZ06VTBJPbp2wdGjR5tllZ07NUbWurk4CSaIu5Bt5MiRkEgkWLp0KYYNG6Zx0PX09ODm5gYnJyfBLRaCHSEWo2uXcMycORPZ2dnYuXMnRo4cyYeekSLHWqdOneDk5AQvLy/MmTMHOTk5+PLLLzFt2jTs2rULtbW1KC0txZw5cxAfH49t27Zh//79GD16NIyMjODj44PAwEBoaUlV2yBIX+5OivSrynT06FHYWJrzEdsZ5wwAAAzwSURBVIatCQ7XNKhcfOjrr78uiLy6d+8epkyZIpikLp1DcOjQIY3funDhAgIDOvATdPz4cVhZWcHKygo2NjawtbWFvb29KrJMGIPk7IT33nsPW7ZsQXl5OeRyOU6cOIFJkyYJAI0sy8LX1xehoaEwNTXFkCFDkJmZiR07diAhIQHTpk1DQUEBnj17hqysLHz66af8ZKampiIgIACWlpYICAiAuZmpajsaiGg/Eb3RHO6W1RaL683MzDQedPX19UhMTOR5pb+/Pw8ibgsdOnQINjY2MDAwEGTx56i8vByJiYmCdGudAv015jc9f/48AvzVQcu6ujqIiIhASkoK8vLycOTIER4rcOvWLcyYMUMtaMzKygrc9ZVBQUFITU3F/v37ERsbi9deew2pqam4f/8+bty4gcWLFyMuLg4bNmzA9u3bER0dDX19fbi7u2tUOlXsW21Lg2XKsh9y+N3mcqdcv34dwYEd+MMtISGhzQn95XI50tLSoKOjg549e/JxXar04MEDfPLJJwL2EeTnjd27d7fJwvzrr7/yeY39/f3h6+sLW1tbxMXFITs7G8uXL8fAgQPxwQcfIDc3l88W+vnnn2Pp0qX4/vvvMW3aNDg6OsLBwQH+/v7QUYHek4L929vbw9HBAUyjNPX1C8FiGYhE14kIH330UYud3blzJwz1dJ9bOOB2YUpKCgwMDPDNN9+0eFZ99tlngsTSfp4vYdu2bc1q06NHj+bZZ1BQkJpYvXXrVqxatQoHDx7E2rVr0bt3bxgYGCAoKIhP5N6UxOXl5YWJEydi8+bNuH37Nr799lvu9w9etOexm4hhGiQSCY4dO9biwFZXV+O1V1/hGzto0CC1G4Rau6InTpyIPn36tCrTUWVlZaNLVoHmJyJ4v+SKzZs3CyaJy5jv4OCA/v37Iy4uDidOnMCECRNgbm4ODw8PhISEQE8lpo+UYmE/++wzNYHnxo0byMjIwNixYzFo0CBERkZCKpVCImKevBBHIxEtIaL5RDSBiC4REVil4JLKyspWDezKlSuhIxEp+LuuxitQW0PV1dVYu3atIE7x2bNnOHnyJBYtWoQ33niDvz2zudLe0RapqamCSB9N0hknzAwZMgSpqanIyMhAdnY2f7mWXC7HmTNn1ILRnjx5gu+//x4ff/wxL3EyjWl59lFjptznIj0iqiBFuOsPP/yAxYsX83FT1dXV6KwIb23Lzazp6enQ0dHhLhZEx44dcf369TZPTl5enka9QU9PD56envD399eYx9vQ0BCRkZGIiIgQKLOkSKXdqVMnhIeHY/LkyThy5EiTQaoVFRXIyspCQkICxo0bh/j4eGzfvh13795FcXExlixZgqioKIFwoiH6vJS4LD2tjMRII6IJ3bp1o+PHjwt+vHz5Mn366af06quvUnBwMHUNDaXq2lo6eOgQ9ezZs1UVxMfH044dO8jN1YUO/5BNLMvS9OnTKSkpqcUbJO/evUt2dnYkl8vJ19eXRCIRFRYWEsMw5OHhQV26dOGLi4uLwJB69OhRKioqIiIiBwcHioiIoHbt1GFbN27coJycHCooKCC5XE5WVlbUvXt3CgkJIblcTidPnqTDhw/ToUOH6OzZsySXyxtZi1hML730EhkbG1P53bt07fp1AtSCF38hou8V4u9eIqpr7cRcJJVAcU1UXFyMbt26wVMR3+Pt7d3qc6Ourg5RUVEICQnBgQMHYGtlwUfEa8pur7zbSCl62MjIiJf0rl69itWrV2PhwoVYsGABcnJy1O7x48TgNWvWYMKECXjnnXeQnJzMS1icrrRp0ya8/fbbajvOwMAAAQEBCAwMFJxbTZQz9CLScCoon4gwadKkVrOU27dvw1HBlydPntzq9x49eoSgoCCMGjUK9fX1mDFjBp9h5s0331SDIyll48Mbb7yBkJCQ5zqfzp8/j4ULF6JPnz5qAfo2NjYIDAxUJHgRNSllGRoawtXVFZ07d0ZoaCi8vLwgFYvlirPjhVM8V7lyJGhr6KeffoKliQkkYnGzphJNSqK3tzfWr1/Pr+bwziGKTGt6fH6v+/fv8wrrhx9+CIZhNEpl1dXVOHjwIKZMmQJ/f39BximRSISXXnoJQUFBfI78lopYLIaLiwuioqKQmJiIFStWIDc3l180a9asARFBR+msYxm6r4D6vrAsvO+zTGMqYQ6uqpoKpTnauHFj4/UL3t5qsf3N0d27dzF69Gg+4raoqAiJiYnQ09Hib93hEkm9/vrr/KCqshKOzXTs2JG/5URTYVkWHh4eGD9+PJQz4nHomqtXr2LXrl3YsmUL9u7dqzHHx9OnTzFkyBAQEZ8Cs7i4GG+99ZZgp7EMVRFR8vNMkqrar0VEcxiiyVD81rlzZ1q/fj25ubk1+yEAFD18OG3aupWmTJlC8+fPbxkyk5AgeI5lWfL19SVdXV2qq6uja1ev0qOqKv73sLAwevbsGRUXF1NNTY3mmA2RiIKDg6lv377UsWNHEovFdOnSJf76Y5ZlycnJiXx9fcnNzY3EYjHJZDIqLi6mgoICKi4upurqaoLiOms/Pz9yd3enBw8eUF5eHuXl5dHJkyfp0aNH1CUkhPLOnCEtLS3q378/1dTU0IEDB6ihoYFrToVCxfjuRUZarVBeaREREXyAb3MYW1cHB0glkiZN7pWVlTAxMYGpqSnatWvHx5U7OTlh3759auJpYWEhXnIVatampqYIDg5GTEwMMjMzUVxc/NwhGjdu3MDGjRsxfvx4+Pj4qIngxsbG8HZzg0+7djARXoMg8Ln4+vrCxsYGLMvCyki7lP7gGGErhUgnOHibslkBQHZ2NiQiEXy9vNRY2qhRo2BpaQlDQ0N8++23/MDs27cP//3vf9sMzKurq0NhYSHWrl2LpUuXYuXKldiyZQtu3LiBmpoa5ObmYu7cuejbt69GKcrCwgKONjYwbEKjVy3m5uYICAiAgYEBQkNDsXbtWlRVVeGNgf1kTub6d/6K4CMPIvpRuZHR0dFNniUfK3KacRkYAMDFxQU9evQAEWlM01pZWYmcnBykp6fj/fffx4ABAzB8+HBMmDAB6enpOHXqFJ9Ps7lVzjAMLCws0K5dOxgrGTU1Heze3t7o2LGjmqJpZ2cHHx8fSKVS9OjRA5s2bcLly5exZs0arFy5ks/dWVJS0nj4S158Bom2UihDdFVZ0klISFDTF6qrq9GpQwdoSSTIy8tDTEwMbGxs4OzsDAsLC6SlpSE3N1dN7+FW+bx589RWuZaWFlxcXODh4QELlZw6qsXY2Bh9+/bFvHnzkJOTg127dmHQoEFqF2S1a9cO7du3h0gkwiuvvIJt27YhLy+PT9HZkl5maWkJYx3JE2rMBTeJ/uQbKzRRP4bonrIZe+7cuYK4x6KiIhjp6cHH3R0eHh6wtrZGeHg4JBKJYJVbWFjA398fgYGBrbJvubu7IyYmBt98840gA+Hjx4+xZs0a1fSeYFkWL730Euzt7SEWizFgwADs3bsX9fX1KCkpQV5eHmQyGS5evIjMzEy15LKlpaVYs2YNtmzZggsXLiAlJQXOzs588mSV9l36u4TmxTBET5TtVOnp6bwPZLXinrvWFIlEwgPisrKycO7cOcTFxandynb79m3MnTtX7T4vHR0deHt7w9TUFFKpFEOHDsXhw4cFVuTHjx9j7dq1iIuLw7JlywS6UG5uLpKTk7F48WKUlpZi9erVgisZ7ezs4O7ursk+9ysRrVYE8P7tooo/YRpvROelps2bNwNovJ5xwoQJmDhxIpYvX47z58+3iDKUyWTo3bs377BSzhPr5ubWaILX04OOjg5GjRqlBlt69uwZNmzYgKlTp2L9+vV83luZTIYDBw5gxowZSEtLw71797Br1y68/PLLvDJqbW0NDw8PTZp/PRFto8b0+Qz9g0iHiFIV+CYeQaKcxas1xCVhNDExQXBwMMLCwmBsbIwePXqo4c3q6uqwY8cOpKSkYOvWrQJF8MyZM0hJScGyZcvw8OFD5OXlYcSIEXziOnNzc3h6eqqmpOXwWUeIaPA/PQ5flUyIaLNyZ11dXZs1TnKWA+75bt26YdasWQIH2ebNm7FkyRLs3LlToLNcu3YN6enpWLlyJe7du4fi4mLExsbyHkxTU1N4e3urHfyKkt8c7vffSg4KHK0gs+e5c+fUJuXNN9/8DZrUowcGDx6M48ePC/z1dXV1OH36NPbv34/y8nKUlZUhOTmZFxiMjIx4HUPDBJQqbIGm9D8SRCX/V3mgOnfujCtXrgAAZigynhIR3nrrLYwePVowaY8fP0Z6ejqfOo9T7ppANd4lohT6X3aiNlEXIvpJeSCVk/q+//77jUZQxQTo6uoiLCxMLTOlolQR0VeKSf8fvSB6nYjKSUNiSg0T8IyINlBbssn+j343jaLfdCAZER2mxiupRP+WDv4fOF7wvCtwgZgAAAAASUVORK5CYII=
// @license AGPL-3.0
// @run-at document-end
// @noframes true
// @incompatible Greasemonkey
// @exclude *://www.jjwxc.net/onebook.php?novelid=*&chapterid=*
// @exclude *://www.meegoq.com/book/*.html
// @exclude *://www.viviyzw.com/book/*.html
// @exclude *://www.yruan.com/article/*/*.html
// @grant unsafeWindow
// @grant GM_info
// @grant GM_xmlhttpRequest
// @grant GM_getTab
// @grant GM_saveTab
// @grant GM_getTabs
// @grant GM.info
// @grant GM.xmlHttpRequest
// @connect img.shouda8.com
// @connect qidian.com
// @connect yuewen.com
// @connect kuangxiangit.com
// @connect sinaimg.cn
// @connect jjwxc.net
// @connect image.gebiqu.com
// @connect qidian.qpic.cn
// @connect zongheng.com
// @connect 17k.com
// @connect www.shuhai.com
// @connect img.uukanshu.com
// @connect oss-accelerate.aliyuncs.com
// @connect cdn.bcebos.com
// @connect rs.sfacg.com
// @connect shuhai.com
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js#sha512-Qlv6VSKh1gDKGoJbnyA5RMXYcvnpIqhO++MhIM2fStMcGT9i2T//tSwYFlcyoRRDcDZ+TYHpH8azBBCyhpSeqw==
// @require https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js#sha512-uVSVjE7zYsGz4ag0HEzfugJ78oHCI1KhdkivjQro8ABL/PRiEO4ROwvrolYAcZnky0Fl/baWKYilQfWvESliRA==
// @require https://cdn.jsdelivr.net/npm/[email protected]/crypto-js.min.js#sha512-s+p/j7+gSFJa1SUEwmPBAlitcUccgbaTTM3yRSmDHUp0UCcRdBMgI2toIT97ZKGKItfV3N66PEZbHcT/iS5thg==
// ==/UserScript==
/******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 563:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.sleep = exports.concurrencyRun = exports.gfetch = exports.rm = exports.cosCompare = exports.ggetHtmlDOM = exports.ggetHtmlText = exports.getHtmlDOM = exports.getHtmlText = exports.cleanDOM = exports._GM_info = void 0;
const main_1 = __webpack_require__(519);
try {
exports._GM_info = GM_info;
}
catch (error) {
try {
exports._GM_info = GM.info;
}
catch (error) {
console.error("未发现 _GM_info API");
}
}
let _GM_xmlhttpRequest;
try {
_GM_xmlhttpRequest = GM_xmlhttpRequest;
}
catch (error) {
try {
_GM_xmlhttpRequest = GM.xmlHttpRequest;
}
catch (error) {
console.error("未发现 _GM_xmlhttpRequest API");
}
}
class CleanerClass {
constructor(imgMode) {
this.imgMode = imgMode;
this.statusType = {
init: this.parse_init,
p: this.parse_p,
br: this.parse_br,
hr: this.parse_hr,
};
this.typeParagraph = [
"DIV",
"P",
"OL",
"H1",
"H1",
"H2",
"H3",
"H4",
"H5",
"H6",
];
this.typeInto = ["IMG", "HR", "BR"];
this.currentHtml = document.createElement("p");
this.currentText = "";
this.br_count = 0;
this.images = [];
this.doms = [];
this.texts = [];
this.status = "init";
}
reset_current() {
this.currentHtml = document.createElement("p");
this.currentText = "";
}
create_pbr() {
const p = document.createElement("p");
const br = document.createElement("br");
p.appendChild(br);
return p;
}
parse_init(element) {
var _a, _b;
const nodeName = element.nodeName;
if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") {
this.br_count = 0;
this.status = "p";
this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim();
}
else if (this.typeParagraph.includes(nodeName)) {
this.meet_p(element, nodeName);
}
else if (nodeName === "BR") {
this.br_count++;
this.status = "br";
}
else if (nodeName === "IMG") {
this.meet_img(element);
}
else if (nodeName === "HR") {
this.meet_hr();
}
}
parse_p(element) {
const nodeName = element.nodeName;
if (nodeName === "BR") {
this.br_count++;
this.status = "br";
this.currentText += "\n";
}
else if (this.typeParagraph.includes(nodeName)) {
this.meet_p(element, nodeName);
}
else if (nodeName === "IMG") {
this.meet_img(element);
}
else if (nodeName === "HR") {
this.meet_hr();
}
}
parse_br(element) {
var _a, _b;
const nodeName = element.nodeName;
if (nodeName === "BR") {
this.br_count++;
if (this.br_count <= 4) {
this.currentText += "\n";
}
}
else if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") {
this.meet_br_push();
this.status = "p";
this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim();
}
else if (this.typeParagraph.includes(nodeName)) {
if (this.br_count > 2) {
this.doms.push(this.create_pbr());
}
this.meet_p(element, nodeName);
}
else if (nodeName === "IMG") {
this.meet_img(element);
}
else if (nodeName === "HR") {
this.meet_hr();
}
}
parse_hr(element) {
var _a, _b;
const nodeName = element.nodeName;
if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") {
this.br_count = 0;
this.status = "p";
this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim();
this.currentHtml.innerText = this.currentText;
}
else if (this.typeParagraph.includes(nodeName)) {
this.meet_p(element, nodeName);
}
else if (nodeName === "IMG") {
this.meet_img(element);
}
}
meet_p(element, nodeName) {
var _a;
this.br_count = 0;
const childrenNodeNamesSet = new Set(Array.from(element.children).map((ele) => ele.nodeName));
const typeParagraphSet = new Set(this.typeParagraph);
const intersectParagraph = Array.from(childrenNodeNamesSet).filter((x) => typeParagraphSet.has(x));
const typeIntoSet = new Set(this.typeInto);
const intersectInto = Array.from(childrenNodeNamesSet).filter((x) => typeIntoSet.has(x));
if (intersectParagraph.length !== 0 || intersectInto.length != 0) {
this.meet_text_push();
const subcleaner = new CleanerClass(this.imgMode);
const subcleanerBound = subcleaner.clean.bind(this);
subcleanerBound(element);
this.status = "init";
}
else {
this.status = "p";
this.currentText += "\n".repeat(2);
this.currentText += (_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim();
this.meet_text_push();
}
}
meet_img(element) {
function genImageName(url) {
let t = btoa(new URL(url).pathname.split("/").slice(-2).join("/")) +
`.${url.split(".").slice(-1)[0]}`;
if (t.length >= 125) {
t =
btoa(new URL(url).pathname.split("/").slice(-1)[0]) +
`.${url.split(".").slice(-1)[0]}`;
}
return t;
}
this.meet_br_push();
this.br_count = 0;
const imageUrl = element.src;
const imageName = genImageName(imageUrl);
const image = new main_1.attachmentClass(imageUrl, imageName, this.imgMode);
image.init();
this.images.push(image);
const pimg = document.createElement("p");
const img = document.createElement("img");
img.src = imageName;
img.alt = imageUrl;
pimg.appendChild(img);
this.doms.push(pimg);
this.texts.push(`\n\n`);
}
meet_hr() {
this.meet_br_push();
this.br_count = 0;
this.status = "hr";
this.texts.push(`\n${"-".repeat(20)}\n`);
const hr = document.createElement("hr");
this.doms.push(hr);
}
meet_text_push() {
this.currentHtml.innerText = this.currentText.trim();
this.doms.push(this.currentHtml);
this.texts.push(this.currentText);
this.reset_current();
}
meet_br_push() {
if (this.br_count === 1) {
this.br_count = 0;
this.meet_text_push();
}
else if (this.br_count === 2) {
this.br_count = 0;
this.meet_text_push();
}
else if (this.br_count >= 3) {
this.br_count = 0;
this.meet_text_push();
this.doms.push(this.create_pbr());
}
}
clean(DOM) {
let i = 0;
while (i < DOM.childNodes.length) {
const fn = this.statusType[this.status].bind(this);
fn(DOM.childNodes[i]);
i++;
}
this.meet_text_push();
return { doms: this.doms, texts: this.texts, images: this.images };
}
}
function cleanDOM(DOM, imgMode) {
const cleaner = new CleanerClass(imgMode);
const { doms, texts, images } = cleaner.clean(DOM);
const outputDOM = document.createElement("div");
for (const dom of doms) {
outputDOM.appendChild(dom);
}
let outputText = "";
for (const t of texts) {
outputText += t;
}
outputText = outputText.trim();
return { dom: outputDOM, text: outputText, images: images };
}
exports.cleanDOM = cleanDOM;
async function getHtmlText(url, charset) {
if (charset === undefined) {
return fetch(url).then((response) => {
if (response.ok) {
return response.text();
}
else {
console.error(new Error(`Bad response! ${url}`));
return response.text();
}
});
}
else {
return fetch(url)
.then((response) => {
if (response.ok) {
return response.arrayBuffer();
}
else {
console.error(new Error(`Bad response! ${url}`));
return response.arrayBuffer();
}
})
.then((buffer) => {
const decoder = new TextDecoder(charset);
const text = decoder.decode(buffer);
return text;
});
}
}
exports.getHtmlText = getHtmlText;
async function getHtmlDOM(url, charset) {
const htmlText = await getHtmlText(url, charset);
return new DOMParser().parseFromString(htmlText, "text/html");
}
exports.getHtmlDOM = getHtmlDOM;
async function ggetHtmlText(url, charset) {
if (charset === undefined) {
return gfetch(url).then((response) => {
if (response.status >= 200 && response.status <= 299) {
return response.responseText;
}
else {
console.error(new Error(`Bad response! ${url}`));
return response.responseText;
}
});
}
else {
return gfetch(url, { responseType: "arraybuffer" })
.then((response) => {
if (response.status >= 200 && response.status <= 299) {
return response.response;
}
else {
console.error(new Error(`Bad response! ${url}`));
return response.response;
}
})
.then((buffer) => {
const decoder = new TextDecoder(charset);
const text = decoder.decode(buffer);
return text;
});
}
}
exports.ggetHtmlText = ggetHtmlText;
async function ggetHtmlDOM(url, charset) {
const htmlText = await ggetHtmlText(url, charset);
return new DOMParser().parseFromString(htmlText, "text/html");
}
exports.ggetHtmlDOM = ggetHtmlDOM;
function cosCompare(a, b) {
if (a.sectionNumber !== null && b.sectionNumber != null) {
if (a.sectionNumber > b.sectionNumber) {
return 1;
}
if (a.sectionNumber === b.sectionNumber) {
if (a.sectionChapterNumber !== null && b.sectionChapterNumber !== null) {
if (a.sectionChapterNumber > b.sectionChapterNumber) {
return 1;
}
if (a.sectionChapterNumber === b.sectionChapterNumber) {
return 0;
}
if (a.sectionChapterNumber < b.sectionChapterNumber) {
return -1;
}
}
}
if (a.sectionNumber < b.sectionNumber) {
return -1;
}
}
return 0;
}
exports.cosCompare = cosCompare;
function rm(selector, all = false, dom) {
if (all) {
let rs = dom.querySelectorAll(selector);
rs.forEach((e) => e.remove());
}
else {
let r = dom.querySelector(selector);
if (r) {
r.remove();
}
}
}
exports.rm = rm;
function gfetch(url, { method = "GET", headers, data, cookie, binary, nocache, revalidate, timeout, context, responseType, overrideMimeType, anonymous, username, password, } = {}) {
return new Promise((resolve, reject) => {
if (_GM_xmlhttpRequest) {
_GM_xmlhttpRequest({
url: url,
method: method,
headers: headers,
data: data,
cookie: cookie,
binary: binary,
nocache: nocache,
revalidate: revalidate,
timeout: timeout,
context: context,
responseType: responseType,
overrideMimeType: overrideMimeType,
anonymous: anonymous,
username: username,
password: password,
onload: (obj) => {
resolve(obj);
},
onerror: (err) => {
reject(err);
},
});
}
else {
throw new Error("未发现 _GM_xmlhttpRequest API");
}
});
}
exports.gfetch = gfetch;
function concurrencyRun(list, limit, asyncHandle) {
function recursion(arr) {
return asyncHandle(arr.shift()).then(() => {
if (arr.length !== 0) {
return recursion(arr);
}
else {
return "finish!";
}
});
}
let listCopy = [...list];
let asyncList = [];
while (limit--) {
asyncList.push(recursion(listCopy));
}
return Promise.all(asyncList);
}
exports.concurrencyRun = concurrencyRun;
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
exports.sleep = sleep;
/***/ }),
/***/ 519:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.attachmentClass = exports.Chapter = exports.Book = exports.Status = void 0;
const rules_1 = __webpack_require__(489);
const lib_1 = __webpack_require__(563);
var Status;
(function (Status) {
Status[Status["pending"] = 0] = "pending";
Status[Status["downloading"] = 1] = "downloading";
Status[Status["failed"] = 2] = "failed";
Status[Status["finished"] = 3] = "finished";
Status[Status["aborted"] = 4] = "aborted";
})(Status = exports.Status || (exports.Status = {}));
class Book {
constructor(bookUrl, bookname, author, introduction, additionalMetadate, chapters) {
this.bookUrl = bookUrl;
this.bookname = bookname;
this.author = author;
this.introduction = introduction;
this.additionalMetadate = additionalMetadate;
this.chapters = chapters;
console.debug("[Book]初始化完成");
}
}
exports.Book = Book;
class Chapter {
constructor(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, charset) {
this.bookUrl = bookUrl;
this.bookname = bookname;
this.chapterUrl = chapterUrl;
this.chapterNumber = chapterNumber;
this.chapterName = chapterName;
this.isVIP = isVIP;
this.isPaid = isPaid;
this.sectionName = sectionName;
this.sectionNumber = sectionNumber;
this.sectionChapterNumber = sectionChapterNumber;
this.chapterParse = chapterParse;
this.charset = charset;
this.status = Status.pending;
this.retryTime = 0;
}
async init() {
const obj = await this.parse();
const { chapterName, contentRaw, contentText, contentHTML, contentImages, } = obj;
this.chapterName = chapterName;
this.contentRaw = contentRaw;
this.contentText = contentText;
this.contentHTML = contentHTML;
this.contentImages = contentImages;
console.debug(`[Chapter]${this.chapterName} 解析完成。`);
return obj;
}
async parse() {
this.status = Status.downloading;
return this.chapterParse(this.chapterUrl, this.chapterName, this.isVIP, this.isPaid, this.charset)
.then((obj) => {
this.status = Status.finished;
return obj;
})
.catch(async (err) => {
this.retryTime++;
console.error(`[Chapter]${this.chapterName}解析出错,第${this.retryTime}次重试,章节地址:${this.chapterUrl}`);
if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) {
await lib_1.sleep(this.retryTime * 1500);
return this.parse();
}
else {
this.status = Status.failed;
console.error(err);
return {
chapterName: this.chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
});
}
}
exports.Chapter = Chapter;
class attachmentClass {
constructor(imageUrl, name, mode) {
this.imageUrl = imageUrl;
this.name = name;
this.mode = mode;
this.status = Status.pending;
this.retryTime = 0;
}
async init() {
if (this.mode === "naive") {
this.imageBlob = await this.downloadImage();
}
else {
this.imageBlob = await this.tmDownloadImage();
}
console.debug(`[Image] ${this.imageUrl} 下载完成。`);
return this.imageBlob;
}
downloadImage() {
this.status = Status.downloading;
return fetch(this.imageUrl)
.then((response) => {
if (response.ok) {
this.status = Status.finished;
return response.blob();
}
else {
if (response.status === 404) {
this.status = Status.failed;
}
throw new Error(`Image request response is not ok!\nImage url: ${this.imageUrl} .`);
}
})
.catch(async (err) => {
this.retryTime++;
console.error(`[Image]下载 ${this.imageUrl} 出错,第${this.retryTime}次重试,下载模式:${this.mode}`);
if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) {
await lib_1.sleep(this.retryTime * 1500);
return this.downloadImage();
}
else {
this.status = Status.failed;
console.error(err);
return null;
}
});
}
tmDownloadImage() {
this.status = Status.downloading;
return lib_1.gfetch(this.imageUrl, { responseType: "blob" })
.then((response) => {
if (response.status >= 200 && response.status <= 299) {
this.status = Status.finished;
return response.response;
}
else {
if (response.status === 404) {
this.status = Status.failed;
}
throw new Error(`Bad response!\nRequest url: ${this.imageUrl}`);
}
})
.catch(async (err) => {
this.retryTime++;
console.error(`[Image]下载 ${this.imageUrl} 出错,第${this.retryTime}次重试,下载模式:${this.mode}`);
if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) {
await lib_1.sleep(this.retryTime * 1500);
return this.tmDownloadImage();
}
else {
this.status = Status.failed;
console.error(err);
return null;
}
});
}
}
exports.attachmentClass = attachmentClass;
/***/ }),
/***/ 489:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getRule = exports.icon1 = exports.icon0 = exports.retryLimit = void 0;
const ciweimao_1 = __webpack_require__(444);
const uukanshu_1 = __webpack_require__(623);
const yruan_1 = __webpack_require__(514);
const biquge_1 = __webpack_require__(931);
const xkzw_1 = __webpack_require__(441);
const sfacg_1 = __webpack_require__(116);
const hetushu_1 = __webpack_require__(161);
const shouda8_1 = __webpack_require__(382);
const meegoq_1 = __webpack_require__(158);
const xiaoshuodaquan_1 = __webpack_require__(678);
const qidian_1 = __webpack_require__(839);
const jjwxc_1 = __webpack_require__(217);
const zongheng_1 = __webpack_require__(862);
const _17k_1 = __webpack_require__(528);
const shuhai_1 = __webpack_require__(113);
exports.retryLimit = 5;
exports.icon0 = "data:image/png;base64,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";
exports.icon1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAANSAAADUgEQACRKAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAUdQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiYSOVQAAAGx0Uk5TAAECAwQFCAkKCwwNDhETFRkaHB0fICMkKCwwNTg5PD1AQUZKTk9QV1tcX2BjZGhtb3B2eHl6fX6AgYKHi4+QlJicnaChpamur7C3uru+v8LEyMzP0NXZ3N3f4OTn6uvt7/Hy8/T2+Pn6/P3+VI4wmgAAAyxJREFUeNrtmVdT4zAUhTFs6BB6Cb13WLpooffeQjW9hMT//3mVJbsT4li6ahbD6D4y5p5vzrGuFDkry5QpznLSygAYAANgAAyAATAABsAAGAADYAAMgAEwAD8XADlChTQTIM0eIM0pIM3vAdL8JiLNawFpXo1I8zxAmicS0jwTkeapjDTvC8r0gQQK9UEESvUBBIr1qQTK9SkESvR/wQkQ5V95KhS+Q1AC14N34ZCYenD0LGNjoH7ij2ejQV71QPd2lNQapI8rut0d4LMe0Bz4CHMUSetZCGgPMESRYj1cAGARMIqv1kMlgK8pNQq39TARBB8VhCgyW59S414y6frjxDYeUYTCNnnKHw4WeUxl1/wtGjwk97LToyBan6irmRrPfSHj/K+ZuSJ3TImCav3zaqvlvTN57T9W6+ozJAqa9fH9/gLS3kja/wr69+PUKMhGXUxVie0mVVMXZAUSwONys4ztvHn5kQcgttubJ+tEkde7G2MEiExUyD3VVExE4AAPS40qTlaNSw8QgI+dnlxVx8ncnp0PCsD5WJnaI23Z2Lk3wP1igx83jA2L998V4G8E5WrVy0kRfIeXMLkMm1TIN8GWYXIQTVbKVa+cjLCO4r2+fFnq+X17MZ7N6GmlxRJXt1pWnjh3Q1yX09Vi8tXTl/zb8eeB5GCgkFe9cOAgTutPBcD1stbGEYXVtvYCaA4BwHU9W8smXzt7DesMBMB1NFQMVS8eOgK3hQM4zut6ezZdPbt9/ZWhKQsArpu5OrJ83dwNW0dGAFzHwyVe6iXDx8zt2AEc522jI8etntOx8cbRjAcA1+18/Vf5+vlbvk6cALhORkr/qZeOnHC34QdwnPfNTvzjLtC5+S7QRAQg8eNuYcEW6yAIIF4GQD8A9W5IZX3eFQW6tqI61KNbXf9vy4K/T/2Wd90X+hqFnfHG1K8oUq1nuqpVZD3zjal865nvjBVY74pC/qpg/nYkNQqb6+uZrChYrFcQhcBnOwlR2KIfLoUGlIj1EgaUsPVCUcixnjcKmdZzRCHdeqYo1FgPjUKl9YAolFtPjMIf672i8NP6DFH4br2pH1d/AAm28mJJn9pPAAAAAElFTkSuQmCC";
function getRule() {
const host = document.location.host;
let ruleClass;
switch (host) {
case "www.ciweimao.com":
ruleClass = ciweimao_1.ciweimao;
break;
case "www.uukanshu.com":
ruleClass = uukanshu_1.uukanshu;
break;
case "www.yruan.com":
ruleClass = yruan_1.yrun;
break;
case "www.biquwoo.com":
ruleClass = biquge_1.biquwo;
break;
case "www.shuquge.com":
ruleClass = biquge_1.shuquge;
break;
case "www.dingdiann.net":
ruleClass = biquge_1.dingdiann;
break;
case "www.xkzw.org":
ruleClass = xkzw_1.xkzw;
break;
case "www.266ks.com":
ruleClass = biquge_1.c226ks;
break;
case "book.sfacg.com":
ruleClass = sfacg_1.sfacg;
break;
case "www.hetushu.com":
ruleClass = hetushu_1.hetushu;
break;
case "www.shouda8.com":
case "www.shouda88.com":
ruleClass = shouda8_1.shouda8;
break;
case "www.gebiqu.com":
ruleClass = biquge_1.gebiqu;
break;
case "www.meegoq.com":
case "www.viviyzw.com":
ruleClass = meegoq_1.meegoq;
break;
case "www.xiaoshuodaquan.com":
ruleClass = xiaoshuodaquan_1.xiaoshuodaquan;
break;
case "book.qidian.com":
ruleClass = qidian_1.qidian;
break;
case "www.jjwxc.net":
ruleClass = jjwxc_1.jjwxc;
break;
case "www.81book.com":
ruleClass = biquge_1.zwdu;
break;
case "book.zongheng.com":
case "huayu.zongheng.com":
ruleClass = zongheng_1.zongheng;
break;
case "www.17k.com":
ruleClass = _17k_1.c17k;
break;
case "www.shuhai.com":
case "mm.shuhai.com":
ruleClass = shuhai_1.shuhai;
break;
default:
throw new Error("Not Found Rule!");
}
const rule = new ruleClass();
return rule;
}
exports.getRule = getRule;
/***/ }),
/***/ 528:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.c17k = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class c17k {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 5;
}
async bookParse(chapterParse) {
const bookUrl = document.location.href.replace("/list/", "/book/");
const bookname = (document.querySelector("h1.Title")).innerText.trim();
const author = (document.querySelector("div.Author > a")).innerText.trim();
const doc = await lib_1.getHtmlDOM(bookUrl, undefined);
let introduction;
const introDom = doc.querySelector("#bookInfo p.intro > a");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
let coverUrl = doc.querySelector("#bookCover img.book")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const sections = document.querySelectorAll("dl.Volume");
const cos = [];
for (let i = 0; i < sections.length; i++) {
const s = sections[i];
const sectionNumber = i + 1;
const sectionName = (s.querySelector("dt > span.tit")).innerText.trim();
const cs = s.querySelectorAll("dd > a");
for (let j = 0; j < cs.length; j++) {
const a = cs[j];
const span = a.firstElementChild;
const chapterName = span.innerText.trim();
const chapterUrl = a.href;
const isVIP = () => {
if (span === null || span === void 0 ? void 0 : span.className.includes("vip")) {
return true;
}
else {
return false;
}
};
const isPaid = () => {
return false;
};
const co = {
bookUrl: bookUrl,
bookname: bookname,
chapterUrl: chapterUrl,
chapterName: chapterName,
isVIP: isVIP(),
isPaid: isPaid(),
sectionName: sectionName,
sectionNumber: sectionNumber,
sectionChapterNumber: j,
};
cos.push(co);
}
}
cos.sort(lib_1.cosCompare);
for (let i = 0; i < cos.length; i++) {
const chapterNumber = i + 1;
let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
const isLogin = () => {
return false;
};
if (isVIP && !(isLogin() && chapter.isPaid)) {
chapter.status = main_1.Status.aborted;
}
chapters.push(chapter);
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
async function publicChapter() {
const doc = await lib_1.getHtmlDOM(chapterUrl, charset);
const chapterName = (doc.querySelector("#readArea > div.readAreaBox.content > h1")).innerText.trim();
const content = (doc.querySelector("#readArea > div.readAreaBox.content > div.p"));
if (content) {
lib_1.rm("p.copy", false, content);
lib_1.rm("#banner_content", false, content);
lib_1.rm("div.qrcode", false, content);
lib_1.rm("div.chapter_text_ad", false, content);
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
async function vipChapter() {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
if (isVIP) {
return vipChapter();
}
else {
return publicChapter();
}
}
}
exports.c17k = c17k;
/***/ }),
/***/ 931:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.zwdu = exports.c226ks = exports.gebiqu = exports.dingdiann = exports.shuquge = exports.biquwo = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class biquwo {
constructor() {
this.imageMode = "TM";
}
async bookParse(chapterParse) {
const bookUrl = document.location.href;
const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
const author = (document.querySelector("#info > p:nth-child(2)")).innerText
.replace(/作(\s+)?者[::]/, "")
.trim();
let introduction;
const introDom = document.querySelector("#intro");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = document.querySelector("#fmimg > img")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const dl = document.querySelector("#list>dl");
if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
const dlc = Array.from(dl.children);
if (dlc[0].nodeName === "DT" &&
dlc[0].innerText.includes("最新章节")) {
for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
if (i !== 0 && dlc[i].nodeName === "DT") {
delete dlc[0];
break;
}
delete dlc[i];
}
}
const chapterList = dlc.filter((obj) => obj !== undefined);
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < chapterList.length; i++) {
const node = chapterList[i];
if (node.nodeName === "DT") {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
}
else if (node.nodeName === "DD") {
chapterNumber++;
sectionChapterNumber++;
const a = node.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
chapters.push(chapter);
}
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
const content = dom.querySelector("#content");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.biquwo = biquwo;
class shuquge {
constructor() {
this.imageMode = "TM";
}
async bookParse(chapterParse) {
const bookUrl = document.location.href;
const bookname = (document.querySelector(".info > h2")).innerText.trim();
const author = (document.querySelector(".small > span:nth-child(1)")).innerText
.replace(/作(\s+)?者[::]/, "")
.trim();
let introduction;
const introDom = document.querySelector(".intro");
if (introDom === null) {
introduction = null;
}
else {
introDom.innerHTML = introDom.innerHTML.replace(/推荐地址:http:\/\/www.shuquge.com\/txt\/\d+\/index\.html/, "");
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = (document.querySelector(".info > .cover > img")).src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const dl = document.querySelector(".listmain>dl");
if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
const dlc = Array.from(dl.children);
if (dlc[0].nodeName === "DT" &&
dlc[0].innerText.includes("最新章节")) {
for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
if (i !== 0 && dlc[i].nodeName === "DT") {
delete dlc[0];
break;
}
delete dlc[i];
}
}
const chapterList = dlc.filter((obj) => obj !== undefined);
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < chapterList.length; i++) {
const node = chapterList[i];
if (node.nodeName === "DT") {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
}
else if (node.nodeName === "DD") {
chapterNumber++;
sectionChapterNumber++;
const a = node.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
chapters.push(chapter);
}
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector(".content > h1:nth-child(1)")).innerText.trim();
const content = dom.querySelector("#content");
if (content) {
content.innerHTML = content.innerHTML
.replace("请记住本书首发域名:www.shuquge.com。书趣阁_笔趣阁手机版阅读网址:m.shuquge.com", "")
.replace(/http:\/\/www.shuquge.com\/txt\/\d+\/\d+\.html/, "");
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.shuquge = shuquge;
class dingdiann {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 5;
}
async bookParse(chapterParse) {
const bookUrl = document.location.href;
const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
const author = (document.querySelector("#info > p:nth-child(2)")).innerText
.replace(/作(\s+)?者[::]/, "")
.trim();
let introduction;
const introDom = document.querySelector("#intro");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = document.querySelector("#fmimg > img")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const dl = document.querySelector("#list>dl");
if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
const dlc = Array.from(dl.children);
if (dlc[0].nodeName === "DT" &&
dlc[0].innerText.includes("最新章节")) {
for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
if (i !== 0 && dlc[i].nodeName === "DT") {
delete dlc[0];
break;
}
delete dlc[i];
}
}
const chapterList = dlc.filter((obj) => obj !== undefined);
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < chapterList.length; i++) {
const node = chapterList[i];
if (node.nodeName === "DT") {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
}
else if (node.nodeName === "DD") {
chapterNumber++;
sectionChapterNumber++;
const a = node.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
chapters.push(chapter);
}
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
const content = dom.querySelector("#content");
const ad = '<div align="center"><a href="javascript:postError();" style="text-align:center;color:red;">章节错误,点此举报(免注册)</a>,举报后维护人员会在两分钟内校正章节内容,请耐心等待,并刷新页面。</div>';
content.innerHTML = content.innerHTML
.replace(ad, "")
.replace(/http:\/\/www.shuquge.com\/txt\/\d+\/\d+\.html/, "");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.dingdiann = dingdiann;
class gebiqu {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 5;
}
async bookParse(chapterParse) {
const bookUrl = document.location.href;
const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
const author = (document.querySelector("#info > p:nth-child(2)")).innerText
.replace(/作(\s+)?者[::]/, "")
.trim();
let introduction;
const introDom = document.querySelector("#intro");
if (introDom === null) {
introduction = null;
}
else {
introDom.innerHTML = introDom.innerHTML.replace(/如果您喜欢.+,别忘记分享给朋友/, "");
lib_1.rm('a[href^="http://down.gebiqu.com"]', false, introDom);
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = document.querySelector("#fmimg > img")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const dl = document.querySelector("#list>dl");
if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
const dlc = Array.from(dl.children);
if (dlc[0].nodeName === "DT" &&
dlc[0].innerText.includes("最新的八个章节")) {
for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
if (i !== 0 && dlc[i].nodeName === "DT") {
delete dlc[0];
break;
}
delete dlc[i];
}
}
const chapterList = dlc.filter((obj) => obj !== undefined);
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < chapterList.length; i++) {
const node = chapterList[i];
if (node.nodeName === "DT") {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
}
else if (node.nodeName === "DD") {
chapterNumber++;
sectionChapterNumber++;
const a = node.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
chapters.push(chapter);
}
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
const content = dom.querySelector("#content");
content.innerHTML = content.innerHTML.replace("www.gebiqu.com", "");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.gebiqu = gebiqu;
class c226ks {
constructor() {
this.imageMode = "TM";
}
async bookParse(chapterParse) {
const bookUrl = document.location.href.replace(/index_\d+\.html/, "index_1.html");
const bookname = (document.querySelector(".info > .top > h1")).innerText.trim();
const author = (document.querySelector(".info > .top > .fix > p:nth-child(1)")).innerText
.replace(/作(\s+)?者[::]/, "")
.trim();
let introduction;
const introDom = document.querySelector(".desc");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = document.querySelector(".imgbox > img")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const indexUrls = Array.from(document.querySelectorAll('[name="pageselect"] > option')).map((opt) => document.location.origin + opt.getAttribute("value"));
let lis = [];
for (const indexUrl of indexUrls) {
const dom = await lib_1.getHtmlDOM(indexUrl, "UTF-8");
const ul = dom.querySelector("div.row.row-section > div > div:nth-child(4) > ul");
if (ul === null || ul === void 0 ? void 0 : ul.childElementCount) {
lis = lis.concat(Array.from(ul.children));
}
}
const chapterList = lis.filter((obj) => obj !== undefined);
let chapterNumber = 0;
for (let i = 0; i < chapterList.length; i++) {
const node = chapterList[i];
chapterNumber++;
const a = node.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8");
chapters.push(chapter);
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = dom.querySelector("h1.title").innerText.trim();
const content = dom.querySelector("#content");
const ad = '<div class="posterror"><a href="javascript:postError();" class="red">章节错误,点此举报(免注册)</a>,举报后维护人员会在两分钟内校正章节内容,请耐心等待,并刷新页面。</div>';
content.innerHTML = content.innerHTML.replace(ad, "");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.c226ks = c226ks;
class zwdu {
constructor() {
this.imageMode = "TM";
this.charset = "GBK";
}
async bookParse(chapterParse) {
const bookUrl = document.location.href;
const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
const author = (document.querySelector("#info > p:nth-child(2)")).innerText
.replace(/作(\s+)?者[::]/, "")
.trim();
let introduction;
const introDom = document.querySelector("#intro");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = document.querySelector("#fmimg > img")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const dl = document.querySelector("#list>dl");
if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
const dlc = Array.from(dl.children);
if (dlc[0].nodeName === "DT" &&
dlc[0].innerText.includes("最新章节")) {
for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
if (i !== 0 && dlc[i].nodeName === "DT") {
delete dlc[0];
break;
}
delete dlc[i];
}
}
const chapterList = dlc.filter((obj) => obj !== undefined);
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < chapterList.length; i++) {
const node = chapterList[i];
if (node.nodeName === "DT") {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
}
else if (node.nodeName === "DD") {
chapterNumber++;
sectionChapterNumber++;
const a = node.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
chapters.push(chapter);
}
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
const content = dom.querySelector("#content");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.zwdu = zwdu;
/***/ }),
/***/ 444:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.ciweimao = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class ciweimao {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 1;
this.maxRunLimit = 1;
}
async bookParse(chapterParse) {
var _a, _b;
const bookid = unsafeWindow.HB.book.book_id;
const bookUrl = `https://www.ciweimao.com/book/${bookid}`;
const bookname = (document.querySelector(".book-catalog .hd h3")).innerText.trim();
const author = (document.querySelector(".book-catalog .hd > p > a")).innerText.trim();
let introduction;
const dom = await lib_1.getHtmlDOM(bookUrl, undefined);
const introDom = dom.querySelector(".book-intro-cnt .book-desc");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = dom.querySelector(".cover > img").src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
additionalMetadate.tags = Array.from(dom.querySelectorAll(".label-box > .label")).map((span) => span.innerText.trim());
const chapters = [];
const sections = document.querySelectorAll(".book-chapter > .book-chapter-box");
const cos = [];
for (let i = 0; i < sections.length; i++) {
const s = sections[i];
const sectionNumber = i + 1;
const sectionName = s.querySelector(".sub-tit").innerText;
const cs = s.querySelectorAll(".book-chapter-list > li > a");
for (let j = 0; j < cs.length; j++) {
const c = cs[j];
const chapterName = c.innerText.trim();
const chapterUrl = c.href;
let isVIP = false;
let isPaid = false;
if (c.childElementCount) {
isVIP = true;
if (((_a = c.firstElementChild) === null || _a === void 0 ? void 0 : _a.className) === "icon-unlock") {
isPaid = true;
}
}
const co = {
bookUrl: bookUrl,
bookname: bookname,
chapterUrl: chapterUrl,
chapterName: chapterName,
isVIP: isVIP,
isPaid: isPaid,
sectionName: sectionName,
sectionNumber: sectionNumber,
sectionChapterNumber: j,
};
cos.push(co);
}
}
cos.sort(lib_1.cosCompare);
for (let i = 0; i < cos.length; i++) {
const chapterNumber = i + 1;
let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
const isLogin = ((_b = document.querySelector(".login-info.ly-fr")) === null || _b === void 0 ? void 0 : _b.childElementCount) === 1
? true
: false;
if (isVIP && !(isLogin && isPaid)) {
chapter.status = main_1.Status.aborted;
}
chapters.push(chapter);
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
function decrypt(item) {
let message = item.content;
let keys = item.keys;
let len = item.keys.length;
let accessKey = item.accessKey;
let accessKeyList = accessKey.split("");
let charsNotLatinNum = accessKeyList.length;
let output = new Array();
output.push(keys[accessKeyList[charsNotLatinNum - 1].charCodeAt(0) % len]);
output.push(keys[accessKeyList[0].charCodeAt(0) % len]);
for (let i = 0; i < output.length; i++) {
message = atob(message);
let data = output[i];
let iv = btoa(message.substr(0, 16));
let keys255 = btoa(message.substr(16));
let pass = CryptoJS.format.OpenSSL.parse(keys255);
message = CryptoJS.AES.decrypt(pass, CryptoJS.enc.Base64.parse(data), {
iv: CryptoJS.enc.Base64.parse(iv),
format: CryptoJS.format.OpenSSL,
});
if (i < output.length - 1) {
message = message.toString(CryptoJS.enc.Base64);
message = atob(message);
}
}
return message.toString(CryptoJS.enc.Utf8);
}
async function getChapterAuthorSay() {
const doc = await lib_1.getHtmlDOM(chapterUrl, undefined);
const _chapter_author_says = doc.querySelectorAll("#J_BookCnt .chapter.author_say");
let div_chapter_author_say;
if (_chapter_author_says.length !== 0) {
let hr = document.createElement("hr");
div_chapter_author_say = document.createElement("div");
div_chapter_author_say.appendChild(hr);
for (let _chapter_author_say of Array.from(_chapter_author_says)) {
lib_1.rm("i", true, _chapter_author_say);
div_chapter_author_say.appendChild(_chapter_author_say);
}
}
return div_chapter_author_say;
}
const chapter_id = chapterUrl.split("/").slice(-1)[0];
async function publicChapter() {
async function chapterDecrypt(chapter_id, refererUrl) {
const rootPath = "https://www.ciweimao.com/";
const access_key_url = rootPath + "chapter/ajax_get_session_code";
const chapter_content_url = rootPath + "chapter/get_book_chapter_detail_info";
console.debug(`[Chapter]请求 ${access_key_url} Referer ${refererUrl}`);
const access_key_obj = await lib_1.gfetch(access_key_url, {
method: "POST",
headers: {
Accept: "application/json, text/javascript, */*; q=0.01",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
Referer: refererUrl,
Origin: "https://www.ciweimao.com",
"X-Requested-With": "XMLHttpRequest",
},
data: `chapter_id=${chapter_id}`,
responseType: "json",
}).then((response) => response.response);
const chapter_access_key = access_key_obj
.chapter_access_key;
console.debug(`[Chapter]请求 ${chapter_content_url} Referer ${refererUrl}`);
const chapter_content_obj = await lib_1.gfetch(chapter_content_url, {
method: "POST",
headers: {
Accept: "application/json, text/javascript, */*; q=0.01",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
Referer: refererUrl,
Origin: "https://www.ciweimao.com",
"X-Requested-With": "XMLHttpRequest",
},
data: `chapter_id=${chapter_id}&chapter_access_key=${chapter_access_key}`,
responseType: "json",
}).then((response) => response.response);
if (chapter_content_obj.code !== 100000) {
console.error(chapter_content_obj);
throw new Error(`下载 ${refererUrl} 失败`);
}
return decrypt({
content: chapter_content_obj.chapter_content,
keys: chapter_content_obj.encryt_keys,
accessKey: chapter_access_key,
});
}
const div_chapter_author_say = await getChapterAuthorSay();
let content = document.createElement("div");
let decryptDate = await chapterDecrypt(chapter_id, chapterUrl);
content.innerHTML = decryptDate;
lib_1.rm(".chapter span", true, content);
if (div_chapter_author_say) {
content.appendChild(div_chapter_author_say);
}
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
async function vipChapter() {
var _a;
const isLogin = ((_a = document.querySelector(".login-info.ly-fr")) === null || _a === void 0 ? void 0 : _a.childElementCount) === 1
? true
: false;
if (isLogin && isPaid) {
async function vipChapterDecrypt(chapter_id, refererUrl) {
const HB = unsafeWindow.HB;
const parentWidth = 871;
const setFontSize = "14";
const image_session_code_url = HB.config.rootPath + "chapter/ajax_get_image_session_code";
console.debug(`[Chapter]请求 ${image_session_code_url} Referer ${refererUrl}`);
const image_session_code_object = await lib_1.gfetch(image_session_code_url, {
method: "POST",
headers: {
Accept: "application/json, text/javascript, */*; q=0.01",
Referer: refererUrl,
Origin: "https://www.ciweimao.com",
"X-Requested-With": "XMLHttpRequest",
},
responseType: "json",
}).then((response) => response.response);
if (image_session_code_object.code !==
100000) {
console.error(image_session_code_object);
throw new Error(`下载 ${refererUrl} 失败`);
}
const imageCode = decrypt({
content: image_session_code_object
.image_code,
keys: image_session_code_object
.encryt_keys,
accessKey: image_session_code_object
.access_key,
});
const vipCHapterImageUrl = HB.config.rootPath +
"chapter/book_chapter_image?chapter_id=" +
chapter_id +
"&area_width=" +
parentWidth +
"&font=undefined" +
"&font_size=" +
setFontSize +
"&image_code=" +
imageCode +
"&bg_color_name=white" +
"&text_color_name=white";
return vipCHapterImageUrl;
}
const div_chapter_author_say = await getChapterAuthorSay();
const vipCHapterImageUrl = await vipChapterDecrypt(chapter_id, chapterUrl);
console.debug(`[Chapter]请求 ${vipCHapterImageUrl} Referer ${chapterUrl}`);
const vipCHapterImageBlob = await lib_1.gfetch(vipCHapterImageUrl, {
method: "GET",
headers: {
Referer: chapterUrl,
Accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
},
responseType: "blob",
}).then((response) => response.response);
const vipCHapterName = `vipCHapter${chapter_id}.png`;
const vipCHapterImage = new main_1.attachmentClass(vipCHapterImageUrl, vipCHapterName, "TM");
if (vipCHapterImageBlob) {
vipCHapterImage.imageBlob = vipCHapterImageBlob;
vipCHapterImage.status = main_1.Status.finished;
}
const contentImages = [vipCHapterImage];
let ddom, dtext, dimages;
if (div_chapter_author_say) {
let { dom, text, images } = lib_1.cleanDOM(div_chapter_author_say, "TM");
[ddom, dtext, dimages] = [dom, text, images];
}
const img = document.createElement("img");
img.src = vipCHapterName;
img.alt = vipCHapterImageUrl;
const contentHTML = document.createElement("div");
contentHTML.appendChild(img);
if (ddom) {
contentHTML.appendChild(ddom);
}
let contentText = `VIP章节,请打开HTML文件查看。\n`;
if (dtext) {
contentText = contentText + "\n\n" + dtext;
}
return {
chapterName: chapterName,
contentRaw: contentHTML,
contentText: contentText,
contentHTML: contentHTML,
contentImages: contentImages,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
if (isVIP) {
return vipChapter();
}
else {
return publicChapter();
}
}
}
exports.ciweimao = ciweimao;
/***/ }),
/***/ 161:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.hetushu = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class hetushu {
constructor() {
this.imageMode = "TM";
}
async bookParse(chapterParse) {
var _a;
const bookUrl = document.location.href;
const bookname = (document.querySelector(".book_info > h2")).innerText.trim();
const author = (document.querySelector(".book_info > div:nth-child(3) > a:nth-child(1)")).innerText.trim();
let introduction;
const introDom = document.querySelector(".intro");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = (document.querySelector(".book_info > img")).src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const chapterList = ((_a = document.querySelector("#dir")) === null || _a === void 0 ? void 0 : _a.childNodes);
if (chapterList && chapterList.length !== 0) {
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < chapterList.length; i++) {
const node = chapterList[i];
if (node.nodeName === "DT") {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = node.innerText.trim();
}
else if (node.nodeName === "DD") {
chapterNumber++;
sectionChapterNumber++;
const a = node.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
chapters.push(chapter);
}
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector("#content .h2")).innerText.trim();
const content = dom.querySelector("#content");
if (content) {
lib_1.rm("h2", true, content);
lib_1.rm("tt", true, content);
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.hetushu = hetushu;
/***/ }),
/***/ 217:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.jjwxc = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
const rules_1 = __webpack_require__(489);
class jjwxc {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 5;
this.charset = "GB18030";
}
async bookParse(chapterParse) {
var _a;
const bookUrl = document.location.href;
const bookname = (document.querySelector('h1[itemprop="name"] > span')).innerText.trim();
let introduction;
const author = (document.querySelector("td.sptd h2 a span")).innerText
.replace(/作\s+者:/, "")
.trim();
const introDom = document.querySelector("#novelintro");
if (introDom === null) {
introduction = null;
}
else {
lib_1.rm("img", true, introDom);
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
let coverUrl = (document.querySelector(".noveldefaultimage")).src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const cos = [];
const trList = document.querySelectorAll("#oneboolt > tbody > tr");
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < trList.length; i++) {
const tr = trList[i];
if (tr.getAttribute("bgcolor")) {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = (_a = (tr.querySelector("b.volumnfont"))) === null || _a === void 0 ? void 0 : _a.innerText.trim();
}
else if (tr.getAttribute("itemprop")) {
chapterNumber++;
sectionChapterNumber++;
const td = tr.querySelector("td:nth-child(2)");
const a = td === null || td === void 0 ? void 0 : td.querySelector("a:nth-child(1)");
const isLocked = () => {
var _a;
if (((_a = td) === null || _a === void 0 ? void 0 : _a.innerText.trim()) === "[锁]") {
return true;
}
else {
return false;
}
};
const isVIP = () => {
if (a === null || a === void 0 ? void 0 : a.getAttribute("onclick")) {
return true;
}
else {
return false;
}
};
if (!isLocked()) {
if (isVIP()) {
const chapterName = a.innerText.trim();
const chapterUrl = a.getAttribute("rel");
if (chapterUrl) {
const co = {
bookUrl: bookUrl,
bookname: bookname,
chapterUrl: chapterUrl,
chapterName: chapterName,
isVIP: isVIP(),
isPaid: null,
sectionName: sectionName,
sectionNumber: sectionNumber,
sectionChapterNumber: sectionChapterNumber,
};
cos.push(co);
}
}
else {
const chapterName = a.innerText.trim();
const chapterUrl = a.href;
const co = {
bookUrl: bookUrl,
bookname: bookname,
chapterUrl: chapterUrl,
chapterName: chapterName,
isVIP: isVIP(),
isPaid: null,
sectionName: sectionName,
sectionNumber: sectionNumber,
sectionChapterNumber: sectionChapterNumber,
};
cos.push(co);
}
}
}
}
cos.sort(lib_1.cosCompare);
for (let i = 0; i < cos.length; i++) {
const chapterNumber = i + 1;
let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GB18030");
const isLogin = () => {
if (document.getElementById("jj_login")) {
return false;
}
else {
return true;
}
};
if (isVIP && !isLogin()) {
chapter.status = main_1.Status.aborted;
}
chapters.push(chapter);
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
async function publicChapter() {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
const chapterName = (dom.querySelector("div.noveltext h2")).innerText.trim();
const content = dom.querySelector("div.noveltext");
if (content) {
lib_1.rm("div", true, content);
content.innerHTML = content.innerHTML.replace("@无限好文,尽在晋江文学城", "");
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
async function vipChapter() {
async function getFont() {
function getFontInfo() {
var _a;
const s = dom.querySelectorAll("body > style")[1];
let fontName, fontUrl;
if (s.sheet) {
const f = s.sheet.cssRules[s.sheet.cssRules.length - 2];
const m1 = f.cssText.match(/jjwxcfont_[\d\w]+/);
const m2 = f.cssText.match(/{(.*)}/);
if (m1 && m2) {
fontName = m1[0];
const ft = m2[1];
for (const k of ft.split(",")) {
if (k.includes('format("woff2")')) {
const m3 = k.match(/url\("(.*)"\)\s/);
if (m3) {
fontUrl = document.location.protocol + m3[1];
return [fontName, fontUrl];
}
}
}
}
}
const _fontName = (_a = document.querySelector("div.noveltext")) === null || _a === void 0 ? void 0 : _a.classList[1];
if (_fontName) {
fontName = _fontName;
fontUrl =
document.location.protocol +
`//static.jjwxc.net/tmp/fonts/${fontName}.woff2?h=my.jjwxc.net`;
return [fontName, fontUrl];
}
return [null, null];
}
let retryTime = 0;
function fetchFont(fontUrl) {
console.debug(`[Chapter]请求 ${fontUrl} Referer ${chapterUrl} 重试次数 ${retryTime}`);
return lib_1.gfetch(fontUrl, {
headers: {
accept: "*/*",
Referer: chapterUrl,
},
responseType: "blob",
}).then((response) => {
if (response.status >= 200 && response.status <= 299) {
return response.response;
}
else {
console.error(`[Chapter]请求 ${fontUrl} 失败 Referer ${chapterUrl}`);
if (retryTime < rules_1.retryLimit) {
retryTime++;
return fetchFont(fontUrl);
}
else {
return null;
}
}
});
}
const [fontName, fontUrl] = getFontInfo();
if (fontName && fontUrl) {
const fontBlob = await fetchFont(fontUrl);
const fontFileName = `${fontName}.woff2`;
if (fontBlob) {
const fontClassObj = new main_1.attachmentClass(fontUrl, fontFileName, "TM");
fontClassObj.imageBlob = fontBlob;
fontClassObj.status = main_1.Status.finished;
const fontStyleDom = document.createElement("style");
fontStyleDom.innerHTML = `.${fontName} {
font-family: ${fontName}, 'Microsoft YaHei', PingFangSC-Regular, HelveticaNeue-Light, 'Helvetica Neue Light', sans-serif !important;
}
@font-face {
font-family: ${fontName};
src: url('${fontFileName}') format('woff2');
}`;
return [fontName, fontClassObj, fontStyleDom];
}
}
return [null, null, null];
}
const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset);
const isPaid = () => {
if (!dom.querySelector("#buy_content") &&
dom.querySelector("div.noveltext")) {
return true;
}
else {
return false;
}
};
if (isPaid()) {
const chapterName = (dom.querySelector("div.noveltext h2")).innerText.trim();
const content = dom.querySelector("div.noveltext");
if (content) {
lib_1.rm("div", true, content);
content.innerHTML = content.innerHTML.replace("@无限好文,尽在晋江文学城", "");
let { dom: cdom, text, images } = lib_1.cleanDOM(content, "TM");
let [fontName, fontClassObj, fontStyleDom] = await getFont();
if (fontName && fontClassObj && fontStyleDom) {
images.push(fontClassObj);
cdom.appendChild(fontStyleDom);
cdom.className = fontName;
}
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: cdom,
contentImages: images,
};
}
}
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
if (isVIP) {
return vipChapter();
}
else {
return publicChapter();
}
}
}
exports.jjwxc = jjwxc;
/***/ }),
/***/ 158:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.meegoq = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class meegoq {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 3;
}
async bookParse(chapterParse) {
const bookUrl = document.location.href.replace("/book", "/info");
const bookname = (document.querySelector("article.info > header > h1")).innerText.trim();
const dom = await lib_1.getHtmlDOM(bookUrl, "GBK");
const author = (dom.querySelector("article.info > p.detail.pt20 > i:nth-child(1) > a")).innerText.trim();
let introduction;
const introDom = dom.querySelector("article.info > p.desc");
if (introDom === null) {
introduction = null;
}
else {
lib_1.rm("b", false, introDom);
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = (dom.querySelector("article.info > div.cover > img")).src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const ul = document.querySelector("ul.mulu");
if (ul === null || ul === void 0 ? void 0 : ul.childElementCount) {
const ulc = Array.from(ul.children);
if (Array.from(ulc[0].classList).includes("volumn") &&
ulc[0].innerText.match(/最新.章/)) {
for (let i = 0; i < (ul === null || ul === void 0 ? void 0 : ul.childElementCount); i++) {
if (i !== 0 &&
Array.from(ulc[i].classList).includes("volumn") &&
ulc[i].innerText.trim() !== "全部章节") {
delete ulc[0];
break;
}
delete ulc[i];
}
}
const chapterList = ulc.filter((obj) => obj !== undefined);
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < chapterList.length; i++) {
const li = chapterList[i];
if (Array.from(li.classList).includes("volumn")) {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = li.innerText.trim();
}
else {
chapterNumber++;
sectionChapterNumber++;
const a = li.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
chapters.push(chapter);
}
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector("article > header > h1")).innerText.trim();
const content = dom.querySelector("#content");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.meegoq = meegoq;
/***/ }),
/***/ 839:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.qidian = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class qidian {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 5;
}
async bookParse(chapterParse) {
const bookUrl = document.location.href;
const bookname = (document.querySelector(".book-info > h1 > em")).innerText.trim();
let introduction;
const author = (document.querySelector(".book-info .writer")).innerText
.replace(/作\s+者:/, "")
.trim();
const introDom = document.querySelector(".book-info-detail .book-intro");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
let coverUrl = document.querySelector("#bookImg > img")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
additionalMetadate.tags = Array.from(document.querySelectorAll(".tag-wrap>.tags")).map((a) => a.innerText.trim());
const chapters = [];
const liLength = document.querySelectorAll("#j-catalogWrap li").length;
const getChapterTotalNumber = () => {
const span = (document.querySelector("#J-catalogCount")).innerText.match(/\d+/);
if (span) {
return Number(span[0]);
}
};
if (!(liLength && getChapterTotalNumber() === liLength)) {
await lib_1.sleep(3000);
}
const sections = document.querySelectorAll("#j-catalogWrap > .volume-wrap > .volume");
const cos = [];
for (let i = 0; i < sections.length; i++) {
const s = sections[i];
const sectionNumber = i + 1;
const sectionName = s.querySelector("h3").innerText
.trim()
.split("·")[0];
const cs = s.querySelectorAll("ul.cf > li");
for (let j = 0; j < cs.length; j++) {
const c = cs[j];
const a = c.firstElementChild;
const chapterName = a.innerText.trim();
const chapterUrl = a.href;
const isVIP = () => {
const host = new URL(chapterUrl).host;
if (host === "vipreader.qidian.com") {
return true;
}
return false;
};
const isPaid = () => {
if (isVIP()) {
if (c.childElementCount === 2) {
return false;
}
else {
return true;
}
}
return false;
};
const co = {
bookUrl: bookUrl,
bookname: bookname,
chapterUrl: chapterUrl,
chapterName: chapterName,
isVIP: isVIP(),
isPaid: isPaid(),
sectionName: sectionName,
sectionNumber: sectionNumber,
sectionChapterNumber: j,
};
cos.push(co);
}
}
cos.sort(lib_1.cosCompare);
for (let i = 0; i < cos.length; i++) {
const chapterNumber = i + 1;
let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
const isLogin = () => {
const sign_in_dom = document.querySelector(".sign-in");
const sign_out_dom = document.querySelector(".sign-out");
if (sign_in_dom && sign_out_dom) {
if (Array.from(sign_out_dom.classList).includes("hidden")) {
return true;
}
}
return false;
};
if (isVIP && !(isLogin() && chapter.isPaid)) {
chapter.status = main_1.Status.aborted;
}
chapters.push(chapter);
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
async function publicChapter() {
const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset);
const chapterName = (dom.querySelector(".j_chapterName > .content-wrap")).innerText.trim();
const content = dom.querySelector(".read-content");
const author_say_wrap = (dom.querySelector(".author-say-wrap"));
if (content) {
if (author_say_wrap) {
const author_say = author_say_wrap.querySelector("div.author-say > p:nth-child(3)");
const hr = document.createElement("hr");
content.appendChild(hr);
content.appendChild(author_say);
}
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
async function vipChapter() {
var _a;
const _csrfToken = unsafeWindow.jQuery.ajaxSettings.data
._csrfToken;
const bookId = document.location.pathname.split("/").slice(-1)[0];
const authorId = (_a = document
.querySelector("#authorId")) === null || _a === void 0 ? void 0 : _a.getAttribute("data-authorid");
const chapterId = chapterUrl.split("/").slice(-1)[0];
async function getChapterInfo() {
const baseUrl = "https://vipreader.qidian.com/ajax/chapter/chapterInfo";
const search = new URLSearchParams({
_csrfToken: _csrfToken,
bookId: bookId,
chapterId: chapterId,
authorId: authorId,
});
const url = baseUrl + "?" + search.toString();
console.debug(`[Chapter]请求 ${url} Referer ${chapterUrl}`);
return lib_1.gfetch(url, {
headers: {
accept: "application/json, text/javascript, */*; q=0.01",
"x-requested-with": "XMLHttpRequest",
Referer: chapterUrl,
},
responseType: "json",
}).then((response) => response.response);
}
if (isPaid) {
const chapterInfo = await getChapterInfo();
if (chapterInfo.code === 0) {
const authorSay = chapterInfo.data.chapterInfo.authorSay;
const _content = chapterInfo.data.chapterInfo.content;
const content = document.createElement("div");
content.innerHTML = _content;
if (authorSay) {
const hr = document.createElement("hr");
content.appendChild(hr);
const authorSayDom = document.createElement("p");
authorSayDom.innerHTML = authorSay;
content.appendChild(authorSayDom);
}
const { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
}
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
if (isVIP) {
return vipChapter();
}
else {
return publicChapter();
}
}
}
exports.qidian = qidian;
/***/ }),
/***/ 116:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.sfacg = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
const rules_1 = __webpack_require__(489);
class sfacg {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 1;
}
async bookParse(chapterParse) {
var _a, _b, _c;
const bookUrl = document.location.href.replace("/MainIndex/", "");
const bookname = (document.querySelector("h1.story-title")).innerText.trim();
let introduction;
const dom = await lib_1.getHtmlDOM(bookUrl, undefined);
const author = (dom.querySelector(".author-name")).innerText.trim();
const introDom = dom.querySelector(".introduce");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
let coverUrl = (dom.querySelector("#hasTicket div.pic img")).src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
additionalMetadate.tags = Array.from(dom.querySelectorAll("ul.tag-list > li.tag > a")).map((a) => a.innerText.trim());
const chapters = [];
const sections = document.querySelectorAll(".story-catalog");
const cos = [];
for (let i = 0; i < sections.length; i++) {
const s = sections[i];
const sectionNumber = i + 1;
const sectionName = (s.querySelector(".catalog-title")).innerText
.replace(`【${bookname}】`, "")
.trim();
const cs = s.querySelectorAll(".catalog-list > ul > li > a");
for (let j = 0; j < cs.length; j++) {
const c = cs[j];
const _chapterName = (_a = c.getAttribute("title")) === null || _a === void 0 ? void 0 : _a.trim();
const chapterName = _chapterName ? _chapterName : "";
const chapterUrl = c.href;
let isVIP = false;
let isPaid = null;
if (c.childElementCount &&
((_b = c.firstElementChild) === null || _b === void 0 ? void 0 : _b.getAttribute("class")) === "icn_vip") {
isVIP = true;
}
const co = {
bookUrl: bookUrl,
bookname: bookname,
chapterUrl: chapterUrl,
chapterName: chapterName,
isVIP: isVIP,
isPaid: isPaid,
sectionName: sectionName,
sectionNumber: sectionNumber,
sectionChapterNumber: j,
};
cos.push(co);
}
}
let chapterNumber = 0;
cos.sort(lib_1.cosCompare);
for (let i = 0; i < cos.length; i++) {
chapterNumber++;
let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
const isLogin = ((_c = document.querySelector(".user-bar > .top-link > .normal-link")) === null || _c === void 0 ? void 0 : _c.childElementCount) === 3
? true
: false;
if (isVIP && !isLogin) {
chapter.status = main_1.Status.aborted;
}
chapters.push(chapter);
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const chapter_id = chapterUrl.split("/").slice(-2, -1)[0];
async function publicChapter() {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
const chapterName = (dom.querySelector("h1.article-title")).innerText.trim();
const content = dom.querySelector(".article-content");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
async function vipChapter() {
var _a;
async function getvipChapterImage(vipChapterImageUrl, vipChapterName) {
let retryTime = 0;
function fetchVipChapterImage(vipChapterImageUrl) {
console.debug(`[Chapter]请求 ${vipChapterImageUrl} Referer ${chapterUrl} 重试次数 ${retryTime}`);
return fetch(vipChapterImageUrl, {
headers: {
accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
},
referrer: chapterUrl,
body: null,
method: "GET",
mode: "cors",
credentials: "include",
})
.then((response) => response.blob())
.then((blob) => {
if (blob.size === 53658 || blob.size === 42356) {
console.error(`[Chapter]请求 ${vipChapterImageUrl} 失败 Referer ${chapterUrl}`);
if (retryTime < rules_1.retryLimit) {
retryTime++;
return fetchVipChapterImage(vipChapterImageUrl);
}
else {
return null;
}
}
else {
return blob;
}
});
}
const vipChapterImageBlob = await fetchVipChapterImage(vipChapterImageUrl);
const vipChapterImage = new main_1.attachmentClass(vipChapterImageUrl, vipChapterName, "naive");
if (vipChapterImageBlob) {
vipChapterImage.imageBlob = vipChapterImageBlob;
vipChapterImage.status = main_1.Status.finished;
}
else {
vipChapterImage.status = main_1.Status.failed;
}
return vipChapterImage;
}
const isLogin = ((_a = document.querySelector(".user-bar > .top-link > .normal-link")) === null || _a === void 0 ? void 0 : _a.childElementCount) === 3
? true
: false;
if (isLogin) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
const chapterName = (dom.querySelector("h1.article-title")).innerText.trim();
const isPaid = dom.querySelector(".pay-section") === null;
if (isPaid) {
const vipChapterDom = (dom.querySelector(".article-content > #vipImage"));
if (vipChapterDom) {
const vipChapterImageUrl = vipChapterDom.src;
const vipChapterName = `vipCHapter${chapter_id}.gif`;
const vipChapterImage = await getvipChapterImage(vipChapterImageUrl, vipChapterName);
const contentImages = [vipChapterImage];
const img = document.createElement("img");
img.src = vipChapterName;
img.alt = vipChapterImageUrl;
const contentHTML = document.createElement("div");
contentHTML.appendChild(img);
const contentText = `VIP章节,请打开HTML文件查看。\n`;
return {
chapterName: chapterName,
contentRaw: contentHTML,
contentText: contentText,
contentHTML: contentHTML,
contentImages: contentImages,
};
}
else {
return publicChapter();
}
}
}
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
if (isVIP) {
return vipChapter();
}
else {
return publicChapter();
}
}
}
exports.sfacg = sfacg;
/***/ }),
/***/ 382:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.shouda8 = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class shouda8 {
constructor() {
this.imageMode = "TM";
}
async bookParse(chapterParse) {
const bookUrl = document.location.href;
const bookname = (document.querySelector(".bread-crumbs > li:nth-child(4)")).innerText.trim();
const author = (document.querySelector("div.bookname > h1 > em")).innerText
.replace("作者:", "")
.trim();
let introduction;
const introDom = document.querySelector(".intro");
if (introDom === null) {
introduction = null;
}
else {
lib_1.rm(".book_keywords", false, introDom);
lib_1.rm("script", true, introDom);
lib_1.rm("#cambrian0", false, introDom);
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = (document.querySelector(".pic > img:nth-child(1)")).src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const chapterList = document.querySelectorAll(".link_14 > dl dd a");
for (let i = 0; i < chapterList.length; i++) {
const a = chapterList[i];
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, i + 1, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8");
chapters.push(chapter);
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector(".kfyd > h2:nth-child(1)")).innerText.trim();
const content = dom.querySelector("#content");
if (content) {
lib_1.rm("p:last-child", false, content);
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.shouda8 = shouda8;
/***/ }),
/***/ 113:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.shuhai = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class shuhai {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 5;
this.charset = "GBK";
}
async bookParse(chapterParse) {
var _a;
const bookUrl = document.location.href;
const bookname = (document.querySelector("div.book-info-bookname > span:nth-child(1)")).innerText.trim();
let introduction;
const author = (document.querySelector("div.book-info-bookname > span:nth-child(2)")).innerText
.replace("作者: ", "")
.trim();
const introDom = document.querySelector("div.book-info-bookintro") ||
document.querySelector("div.book-info-bookintro-all");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
let coverUrl = (document.querySelector(".book-cover-wrapper > img")).getAttribute("data-original");
if (coverUrl) {
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
}
additionalMetadate.tags = Array.from(document.querySelectorAll(".book-info-bookstate > .tag")).map((span) => span.innerText.trim());
const chapters = [];
if (document.querySelectorAll("#catalog > .chapter-item").length === 0) {
await lib_1.sleep(3000);
}
const cos = [];
const dsList = document.querySelectorAll("#catalog > .chapter-item");
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < dsList.length; i++) {
const node = dsList[i];
if (node.nodeName === "SPAN") {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = (_a = node) === null || _a === void 0 ? void 0 : _a.innerText.trim();
}
else if (node.nodeName === "DIV") {
chapterNumber++;
sectionChapterNumber++;
const a = node.querySelector("a");
const isVIP = () => {
if (node.childElementCount === 2) {
return true;
}
else {
return false;
}
};
const isPaid = () => {
return false;
};
const chapterName = a.innerText.trim();
const chapterUrl = a.href;
const co = {
bookUrl: bookUrl,
bookname: bookname,
chapterUrl: chapterUrl,
chapterName: chapterName,
isVIP: isVIP(),
isPaid: isPaid(),
sectionName: sectionName,
sectionNumber: sectionNumber,
sectionChapterNumber: sectionChapterNumber,
};
cos.push(co);
}
}
cos.sort(lib_1.cosCompare);
for (let i = 0; i < cos.length; i++) {
const chapterNumber = i + 1;
let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
const isLogin = () => {
return false;
};
if (isVIP && !(isLogin() && chapter.isPaid)) {
chapter.status = main_1.Status.aborted;
}
chapters.push(chapter);
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
async function publicChapter() {
const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset);
const chapterName = (dom.querySelector("div.chapter-name")).innerText
.replace("正文 ", "")
.trim();
const content = (dom.querySelector("#reader-content > div:nth-child(1)"));
if (content) {
lib_1.rm("div.chaper-info", false, content);
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
async function vipChapter() {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
if (isVIP) {
return vipChapter();
}
else {
return publicChapter();
}
}
}
exports.shuhai = shuhai;
/***/ }),
/***/ 623:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.uukanshu = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class uukanshu {
constructor() {
this.imageMode = "TM";
this.charset = "GBK";
}
async bookParse(chapterParse) {
var _a;
const bookUrl = document.location.href;
const bookname = (document.querySelector("dd.jieshao_content > h1 > a")).innerText
.replace("最新章节", "")
.trim();
const author = (document.querySelector("dd.jieshao_content > h2 > a")).innerText.trim();
let introduction;
const introDom = (document.querySelector("dd.jieshao_content > h3"));
if (introDom === null) {
introduction = null;
}
else {
introDom.innerHTML = introDom.innerHTML
.replace(/^.+简介:\s+www.uukanshu.com\s+/, "")
.replace(/\s+https:\/\/www.uukanshu.com/, "")
.replace(/-+/, "");
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = (document.querySelector("a.bookImg > img")).src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const button = (document.querySelector('span[onclick="javascript:reverse(this);"]'));
const reverse = unsafeWindow.reverse;
if (button.innerText === "顺序排列") {
reverse(button);
}
const chapterList = ((_a = document.getElementById("chapterList")) === null || _a === void 0 ? void 0 : _a.childNodes);
if (chapterList && chapterList.length !== 0) {
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (let i = 0; i < chapterList.length; i++) {
const li = chapterList[i];
if (li.className === "volume") {
sectionNumber++;
sectionChapterNumber = 0;
sectionName = li.innerText;
}
else {
chapterNumber++;
sectionChapterNumber++;
const a = li.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
chapters.push(chapter);
}
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = dom.querySelector("#timu").innerText.trim();
const content = dom.querySelector("#contentbox");
if (content) {
lib_1.rm(".ad_content", true, content);
const contentReplace = [
/[UuUu]+看书\s*[ww]+.[UuUu]+[kk][aa][nn][ss][hh][UuUu].[nn][ee][tt]/g,
/[UuUu]+看书\s*[ww]+.[UuUu]+[kk][aa][nn][ss][hh][UuUu].[cCc][oOo][mMm]/g,
/[UU]*看书[(\\(].*?[)\\)]文字首发。/,
"请记住本书首发域名:。",
"笔趣阁手机版阅读网址:",
"小说网手机版阅读网址:",
"https://",
"http://",
];
for (let r of contentReplace) {
content.innerHTML = content.innerHTML.replace(r, "");
}
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.uukanshu = uukanshu;
/***/ }),
/***/ 678:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.xiaoshuodaquan = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class xiaoshuodaquan {
constructor() {
this.imageMode = "TM";
this.charset = "GBK";
this.concurrencyLimit = 5;
}
async bookParse(chapterParse) {
var _a, _b;
const ccount = (_a = document.querySelector(".crumbswrap")) === null || _a === void 0 ? void 0 : _a.childElementCount;
let bookUrl = document.location.href;
if (ccount) {
bookUrl = (document.querySelector(`.crumbswrap > a:nth-child(${ccount - 2})`)).href;
}
const bookname = (document.querySelector("div.dirwraps > h1")).innerText
.replace("《", "")
.replace("》", "")
.trim();
const author = (document.querySelector(".smallcons > span:nth-child(1) > a:nth-child(1)")).innerText.trim();
let introduction;
const introDom = document.querySelector(".bookintro");
if (introDom === null) {
introduction = null;
}
else {
introDom.innerHTML = introDom.innerHTML.replace("内容简介:", "");
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
let coverUrl;
if (ccount) {
const dom = await lib_1.getHtmlDOM(bookUrl, "GBK");
coverUrl = dom.querySelector(".con_limg > img").src;
}
if (coverUrl) {
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
}
const chapters = [];
const sectionNames = document.querySelectorAll(".dirwraps > div.dirtitone");
const sections = document.querySelectorAll(".dirwraps > div.clearfix.dirconone");
let chapterNumber = 0;
for (let i = 0; i < sections.length; i++) {
const sectionNameObj = sectionNames[i];
const sectionObj = sections[i];
const sectionNumber = i + 1;
const sectionName = (_b = (sectionNameObj.firstElementChild)) === null || _b === void 0 ? void 0 : _b.innerText.replace(bookname, "").trim();
let sectionChapterNumber = 0;
const cos = sectionObj.querySelectorAll("ul>li>a");
for (let j = 0; j < cos.length; j++) {
chapterNumber++;
sectionChapterNumber++;
const a = cos[j];
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
chapters.push(chapter);
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector(".page-body > h1:nth-child(4)")).innerText.trim();
const _content = dom.querySelector("#content");
if (_content) {
lib_1.rm("div", true, _content);
lib_1.rm("script", true, _content);
const content = document.createElement("div");
content.innerHTML = _content.innerHTML.replace(/\n/g, "<br/>");
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.xiaoshuodaquan = xiaoshuodaquan;
/***/ }),
/***/ 441:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.xkzw = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class xkzw {
constructor() {
this.imageMode = "TM";
}
async bookParse(chapterParse) {
const bookUrl = document.location.href;
const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
const author = (document.querySelector("#info > p:nth-child(2)")).innerText
.replace(/作(\s+)?者[::]/, "")
.trim();
let introduction;
const introDom = document.querySelector("#intro");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = document.querySelector("#fmimg > img")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
const chapters = [];
const bookid = unsafeWindow.bookId;
const siteChapterList = await fetch("http://www.xkzw.org/action.php", {
headers: {
accept: "application/json, text/javascript, */*",
"content-type": "application/x-www-form-urlencoded",
"x-requested-with": "XMLHttpRequest",
},
body: `action=clist&bookid=${bookid}`,
method: "POST",
mode: "cors",
credentials: "include",
}).then((response) => response.json());
const dl = document.querySelector("#wrapper > div.box_con:nth-child(7) > div:nth-child(1) > dl:nth-child(1)");
let tmpColumnName = "";
let tmpColumnList = [];
let tmpChapterList = [];
if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
const dlc = Array.from(dl.children);
for (let i = 0; i < dl.childElementCount; i++) {
const node = dlc[i];
if (i !== 0) {
if (node.nodeName === "DD") {
const a = node.firstElementChild;
const chapterName = a.innerText;
const chapterUrl = a.href;
const chapterid = chapterUrl
.split("/")
.slice(-1)[0]
.replace(".html", "");
tmpChapterList.push({
chapterid: Number(chapterid) - bookid * 11,
chaptername: chapterName,
isempty: 0,
originalurl: "",
currenturl: "",
});
}
else if (node.nodeName === "DT") {
const tmpColumnObj = {
columnname: tmpColumnName,
columnid: 0,
chapterlist: tmpChapterList,
};
tmpColumnList.push(tmpColumnObj);
tmpColumnName = node.innerText
.replace(`《${bookname}》`, "")
.trim();
tmpChapterList = [];
}
}
else {
tmpColumnName = node.innerText
.replace(`《${bookname}》`, "")
.trim();
}
}
}
const tcl = tmpChapterList.length;
for (let i = 0; i < tcl; i++) {
const tmpChapterObject = tmpChapterList.pop();
if (tmpChapterObject) {
siteChapterList.columnlist[0].chapterlist.unshift(tmpChapterObject);
}
}
if (tmpColumnList.length !== 0) {
const tmpColumnListLenght = tmpColumnList.length;
for (let i = 0; i < tmpColumnListLenght; i++) {
const tmpColumnObject = tmpColumnList.pop();
if (tmpColumnObject) {
siteChapterList.columnlist.unshift(tmpColumnObject);
}
}
}
let chapterNumber = 0;
let sectionNumber = 0;
let sectionName = null;
let sectionChapterNumber = 0;
for (const column of siteChapterList.columnlist) {
sectionNumber++;
sectionName = column.columnname;
for (const sitechapter of column.chapterlist) {
chapterNumber++;
sectionChapterNumber++;
const chapterName = sitechapter.chaptername;
const chapterUrl = bookUrl + (sitechapter.chapterid + bookid * 11) + ".html";
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
chapters.push(chapter);
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
function runEval(CryptoJS) {
function gettt1(str, keyStr, ivStr) {
let key = CryptoJS.enc.Utf8.parse(keyStr);
let iv = CryptoJS.enc.Utf8.parse(ivStr);
let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
let decrypt = CryptoJS.DES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
function gettt2(str, keyStr, ivStr) {
let key = CryptoJS.enc.Utf8.parse(keyStr);
let iv = CryptoJS.enc.Utf8.parse(ivStr);
let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
let decrypt = CryptoJS.AES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
function gettt3(str, keyStr, ivStr) {
let key = CryptoJS.enc.Utf8.parse(keyStr);
let iv = CryptoJS.enc.Utf8.parse(ivStr);
let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
let decrypt = CryptoJS.RC4.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
function getttn(str, keyStr, ivStr) {
let key = CryptoJS.enc.Utf8.parse(keyStr);
let iv = CryptoJS.enc.Utf8.parse(ivStr);
let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
let decrypt = CryptoJS.TripleDES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
function showttt1(dom) {
let obj = dom.getElementById("other");
let objTips = dom.getElementById("contenttips");
if (obj) {
let content = obj.innerHTML.trim();
let type = parseInt(content.substring(0, 1));
let key;
let iv;
if (type === 1) {
key = content.substring(1, 9);
iv = content.substring(9, 17);
content = content.substring(17);
obj.innerHTML = gettt1(content, key, iv);
obj.style.display = "block";
if (objTips) {
objTips.remove();
}
}
else if (type === 2) {
key = content.substring(1, 33);
iv = content.substring(33, 49);
content = content.substring(49);
obj.innerHTML = gettt2(content, key, iv);
obj.style.display = "block";
if (objTips) {
objTips.remove();
}
}
else if (type === 3) {
key = content.substring(1, 9);
iv = content.substring(9, 17);
content = content.substring(17);
obj.innerHTML = gettt3(content, key, iv);
obj.style.display = "block";
if (objTips) {
objTips.remove();
}
}
else {
key = content.substring(1, 25);
iv = content.substring(25, 33);
content = content.substring(33);
obj.innerHTML = getttn(content, key, iv);
obj.style.display = "block";
if (objTips) {
objTips.remove();
}
}
}
}
showttt1(dom);
}
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
runEval(CryptoJS);
chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
const content = dom.querySelector("#content");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.xkzw = xkzw;
/***/ }),
/***/ 514:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.yrun = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class yrun {
constructor() {
this.imageMode = "naive";
}
async bookParse(chapterParse) {
const bookUrl = document.location.href;
const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
const author = (document.querySelector("#info > p:nth-child(2)")).innerText
.replace(/作(\s+)?者[::]/, "")
.trim();
let introduction;
const introDom = document.querySelector("#intro > p");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "naive");
introduction = introCleantext;
}
const additionalMetadate = {};
const coverUrl = document.querySelector("#fmimg > img")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "naive");
additionalMetadate.cover.init();
const chapters = [];
const chapterList = document.querySelectorAll("#list>dl>dd>a");
if (chapterList && chapterList.length !== 0) {
for (let i = 0; i < chapterList.length; i++) {
const a = chapterList[i];
const chapterName = a.innerText;
const chapterUrl = a.href;
const isVIP = false;
const isPaid = false;
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, i, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8");
chapters.push(chapter);
}
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
const content = dom.querySelector("#content");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
}
exports.yrun = yrun;
/***/ }),
/***/ 862:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.zongheng = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class zongheng {
constructor() {
this.imageMode = "TM";
this.concurrencyLimit = 5;
}
async bookParse(chapterParse) {
const bookUrl = document.location.href.replace("/showchapter/", "/book/");
const bookname = (document.querySelector("div.book-meta > h1")).innerText.trim();
const author = (document.querySelector("div.book-meta > p > span:nth-child(1) > a")).innerText.trim();
const doc = await lib_1.getHtmlDOM(bookUrl, undefined);
let introduction;
const introDom = doc.querySelector("div.book-info > div.book-dec");
if (introDom === null) {
introduction = null;
}
else {
let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
introduction = introCleantext;
}
const additionalMetadate = {};
let coverUrl = doc.querySelector("div.book-img > img")
.src;
additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
additionalMetadate.cover.init();
additionalMetadate.tags = Array.from(doc.querySelectorAll(".book-info>.book-label a")).map((a) => a.innerText.trim());
const chapters = [];
const sections = document.querySelectorAll(".volume-list");
const cos = [];
for (let i = 0; i < sections.length; i++) {
const s = sections[i];
const sectionNumber = i + 1;
const sectionLabel = s.querySelector("div.volume");
Array.from(sectionLabel.children).forEach((ele) => ele.remove());
const sectionName = sectionLabel.innerText.trim();
const cs = s.querySelectorAll("ul.chapter-list > li");
for (let j = 0; j < cs.length; j++) {
const c = cs[j];
const a = c.querySelector("a");
const chapterName = a.innerText.trim();
const chapterUrl = a.href;
const isVIP = () => {
if (c.className.includes("vip")) {
return true;
}
else {
return false;
}
};
const isPaid = () => {
return false;
};
const co = {
bookUrl: bookUrl,
bookname: bookname,
chapterUrl: chapterUrl,
chapterName: chapterName,
isVIP: isVIP(),
isPaid: isPaid(),
sectionName: sectionName,
sectionNumber: sectionNumber,
sectionChapterNumber: j,
};
cos.push(co);
}
}
cos.sort(lib_1.cosCompare);
for (let i = 0; i < cos.length; i++) {
const chapterNumber = i + 1;
let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
const isLogin = () => {
return false;
};
if (isVIP && !(isLogin() && chapter.isPaid)) {
chapter.status = main_1.Status.aborted;
}
chapters.push(chapter);
}
return {
bookUrl: bookUrl,
bookname: bookname,
author: author,
introduction: introduction,
additionalMetadate: additionalMetadate,
chapters: chapters,
};
}
async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
async function publicChapter() {
const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset);
const chapterName = (dom.querySelector("div.title_txtbox")).innerText.trim();
const content = dom.querySelector("div.content");
if (content) {
let { dom, text, images } = lib_1.cleanDOM(content, "TM");
return {
chapterName: chapterName,
contentRaw: content,
contentText: text,
contentHTML: dom,
contentImages: images,
};
}
else {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
}
async function vipChapter() {
return {
chapterName: chapterName,
contentRaw: null,
contentText: null,
contentHTML: null,
contentImages: null,
};
}
if (isVIP) {
return vipChapter();
}
else {
return publicChapter();
}
}
}
exports.zongheng = zongheng;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
var exports = __webpack_exports__;
var __webpack_unused_export__;
__webpack_unused_export__ = ({ value: true });
const rules_1 = __webpack_require__(489);
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
function printEnvironments() {
if (lib_1._GM_info) {
console.log(`开始载入小说下载器……
当前浏览器UA:${navigator.userAgent}
当前脚本管理器:${lib_1._GM_info.scriptHandler}
当前脚本管理器版本:${lib_1._GM_info.version}
当前脚本名称:${lib_1._GM_info.script.name}
当前脚本版本:${lib_1._GM_info.script.version}
当前脚本最后更新时间:${lib_1._GM_info.script.lastModified}
是否处于隐私模式:${lib_1._GM_info.isIncognito}
是否启用调试:${enaleDebug}`);
}
}
async function initBook(rule) {
console.log(`[initBook]开始初始化图书`);
const bookParse = rule.bookParse;
const chapterParse = rule.chapterParse;
return bookParse(chapterParse).then((obj) => {
const { bookUrl, bookname, author, introduction, additionalMetadate, chapters, } = obj;
const book = new main_1.Book(bookUrl, bookname, author, introduction, additionalMetadate, chapters);
return book;
});
}
async function initChapters(rule, book) {
console.log(`[initChapters]开始初始化章节`);
let concurrencyLimit = 10;
if (rule.concurrencyLimit !== undefined) {
concurrencyLimit = rule.concurrencyLimit;
}
const chapters = book.chapters.filter((chapter) => chapter.status === main_1.Status.pending);
if (chapters.length === 0) {
console.error(`[initChapters]初始化章节出错,未找到需初始化章节`);
return [];
}
if (concurrencyLimit === 1) {
for (let chapter of chapters) {
const obj = await chapter.init();
if (obj.contentHTML !== undefined) {
finishedChapterNumber++;
updateProgress(finishedChapterNumber, totalChapterNumber, null);
}
}
}
else {
await lib_1.concurrencyRun(chapters, concurrencyLimit, (curChapter) => {
return curChapter.init().then((obj) => {
if (obj.contentHTML !== undefined) {
finishedChapterNumber++;
updateProgress(finishedChapterNumber, totalChapterNumber, null);
}
return obj;
});
});
}
console.log(`[initChapters]章节初始化完毕`);
return chapters;
}
function save(book) {
function chapterSort(a, b) {
if (a.chapterNumber > b.chapterNumber) {
return 1;
}
if (a.chapterNumber === b.chapterNumber) {
return 0;
}
if (a.chapterNumber < b.chapterNumber) {
return -1;
}
return 0;
}
function addImageToZip(image, zip) {
if (image.status === main_1.Status.finished && image.imageBlob) {
console.debug(`[save]添加附件,文件名:${image.name},对象`, image.imageBlob);
zip.file(image.name, image.imageBlob);
}
else {
console.error("[save]附件下载失败!");
console.error(image);
}
}
function genSectionText(sectionName) {
return `${"=".repeat(20)}\n\n\n\n# ${sectionName}\n\n\n\n${"=".repeat(20)}`;
}
function genChapterText(chapterName, contentText) {
return `## ${chapterName}\n\n${contentText}\n\n`;
}
function genSectionHtmlFile(sectionName) {
let htmlFile = new DOMParser().parseFromString(`<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="https://github.com/yingziwu/novel-downloader"><link href="style.css" type="text/css" rel="stylesheet"/><title>${sectionName}</title></head><body><div class="main"><h1>${sectionName}</h1></div></body></html>`, "text/html");
return new Blob([htmlFile.documentElement.outerHTML], {
type: "text/html; charset=UTF-8",
});
}
function genHtmlFile(chapterName, DOM, chapterUrl) {
var _a;
let htmlFile = new DOMParser().parseFromString(`<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="https://github.com/yingziwu/novel-downloader"><meta name="source" content="${chapterUrl}"><link href="style.css" type="text/css" rel="stylesheet"/><title>${chapterName}</title></head><body><div class="main"><h2>${chapterName}</h2></div></body></html>`, "text/html");
(_a = htmlFile.querySelector(".main")) === null || _a === void 0 ? void 0 : _a.appendChild(DOM);
return new Blob([htmlFile.documentElement.outerHTML], {
type: "text/html; charset=UTF-8",
});
}
console.log("[save]开始保存");
console.debug("book Object:", book);
const chapters = book.chapters;
chapters.sort(chapterSort);
let savedTextArray = [];
let savedZip = new JSZip();
let infoText = `题名:${book.bookname}\n作者:${book.author}\n简介:${book.introduction}\n来源:${book.bookUrl}\n下载时间:${new Date().toISOString()}\n本文件由小说下载器生成,软件地址:https://github.com/yingziwu/novel-downloader\n\n`;
savedTextArray.push(infoText);
if (book.additionalMetadate.cover) {
const cover = book.additionalMetadate.cover;
if (cover.imageBlob) {
console.debug(`[save]添加封面图片,文件名:${`cover.${cover.imageBlob.type.split("/").slice(-1)[0]}`},对象`, cover.imageBlob);
savedZip.file(`cover.${cover.imageBlob.type.split("/").slice(-1)[0]}`, cover.imageBlob);
}
else {
console.error("[save]图片下载失败!");
console.error(cover);
}
}
savedZip.file("info.txt", new Blob([infoText], { type: "text/plain;charset=utf-8" }));
const styleCSS = `body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI",
"Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div.main {
width: 900px;
margin: 5em auto;
padding: 2em;
background-color: #fdfdff;
border-radius: 0.5em;
box-shadow: 2px 3px 7px 2px rgba(0, 0, 0, 0.02);
}
@media (max-width: 700px) {
div.main {
margin: 0 auto;
width: auto;
}
}
h1 {
line-height: 130%;
text-align: center;
font-weight: bold;
font-size: xxx-large;
margin-top: 3.2em;
margin-bottom: 3.3em;
}
h2 {
line-height: 130%;
text-align: center;
font-weight: bold;
font-size: x-large;
margin-top: 1.2em;
margin-bottom: 2.3em;
}
div {
margin: 0px;
padding: 0px;
text-align: justify;
}
p {
text-indent: 2em;
display: block;
line-height: 1.3em;
margin-top: 0.4em;
margin-bottom: 0.4em;
}`;
savedZip.file("style.css", new Blob([styleCSS], { type: "text/css;charset=utf-8" }));
let preSectionName = "";
for (const c of chapters) {
if (c.status === main_1.Status.finished) {
const sectionName = c.sectionName;
const chapterNumber = c.chapterNumber;
const chapterUrl = c.chapterUrl;
const chapterName = c.chapterName
? c.chapterName
: chapterNumber.toString();
const contentText = c.contentText;
const contentHTML = c.contentHTML;
const contentImages = c.contentImages;
const fileNameBase = `${"0".repeat(chapters.length.toString().length - chapterNumber.toString().length)}${chapterNumber.toString()}.html`;
if (sectionName && contentText && sectionName !== preSectionName) {
savedTextArray.push(genSectionText(sectionName));
const sectionHTMLBlob = genSectionHtmlFile(sectionName);
if (sectionHTMLBlob) {
console.debug(`[save]添加卷HTML,文件名:${"Section" + fileNameBase},对象`, sectionHTMLBlob);
savedZip.file(`Section${fileNameBase}`, sectionHTMLBlob);
}
}
preSectionName = sectionName;
if (contentText) {
savedTextArray.push(genChapterText(chapterName, contentText));
}
if (contentHTML) {
const chapterHTMLBlob = genHtmlFile(chapterName, contentHTML, chapterUrl);
if (chapterHTMLBlob) {
console.debug(`[save]添加章节HTML,文件名:${"Chapter" + fileNameBase},对象`, chapterHTMLBlob);
savedZip.file(`Chapter${fileNameBase}`, chapterHTMLBlob);
}
}
if (contentImages !== null) {
for (const image of contentImages) {
addImageToZip(image, savedZip);
}
}
}
}
console.log("[save]开始生成下载文件");
const saveFileNameBase = `[${book.author}]${book.bookname}`;
console.debug("[save]开始保存TXT文件");
const savedText = savedTextArray.join("\n");
saveAs(new Blob([savedText], { type: "text/plain;charset=utf-8" }), `${saveFileNameBase}.txt`);
console.debug("[save]保存TXT文件完毕");
console.debug("[save]开始生成ZIP文件");
savedZip
.generateAsync({
type: "blob",
compression: "DEFLATE",
compressionOptions: {
level: 6,
},
}, (metadata) => updateProgress(finishedChapterNumber, totalChapterNumber, metadata.percent))
.then((blob) => {
console.debug("[save]ZIP文件生成完毕,开始保存ZIP文件");
saveAs(blob, `${saveFileNameBase}.zip`);
})
.then(() => {
var _a;
console.debug("[save]保存ZIP文件完毕");
finishedChapterNumber = 0;
(_a = document.querySelector("#nd-progress")) === null || _a === void 0 ? void 0 : _a.remove();
})
.catch((err) => console.error("saveZip: " + err));
}
function setTabMark() {
return new Promise((resolve, reject) => {
GM_getTab((curTabObject) => {
curTabObject.novel_downloader =
document.location.href;
GM_saveTab(curTabObject);
resolve(curTabObject);
});
});
}
function getNowRunNumber() {
return new Promise((resolve, reject) => {
GM_getTabs((curTabObjects) => {
let nowRunNumber = 0;
for (let i in curTabObjects) {
const novel_downloader_url = curTabObjects[i]
.novel_downloader;
if (novel_downloader_url !== undefined &&
new URL(novel_downloader_url).hostname === document.location.hostname) {
nowRunNumber++;
}
}
resolve(nowRunNumber);
});
});
}
function removeTabMark() {
return new Promise((resolve, reject) => {
GM_getTab((curTabObject) => {
if (curTabObject.novel_downloader) {
delete curTabObject.novel_downloader;
}
GM_saveTab(curTabObject);
resolve(curTabObject);
});
});
}
let totalChapterNumber;
let finishedChapterNumber = 0;
function updateProgress(finishedChapterNumber, totalChapterNumber, zipPercent) {
if (!document.querySelector("#nd-progress")) {
console.debug("[progress]初始化进度条");
let progress = document.createElement("div");
progress.id = "nd-progress";
progress.innerHTML = `
<div id='chapter-progress' title="章节"></div>
<div id='zip-progress' title="ZIP"></div>
`;
let progressStyle = document.createElement("style");
progressStyle.innerHTML = `#nd-progress {
position: fixed;
bottom: 8%;
right: 3%;
z-index: 99;
border-style: none;
text-align: center;
vertical-align: baseline;
background-color: rgba(210, 210, 210, 0.2);
padding: 6px;
border-radius: 12px;
}
#chapter-progress{
--color:green;
--position:0%;
width:200px;
height:10px;
border-radius:30px;
background-color:#ccc;
background-image:radial-gradient(closest-side circle at var(--position),var(--color),var(--color) 100%,transparent),linear-gradient(var(--color),var(--color));
background-image:-webkit-radial-gradient(var(--position),circle closest-side,var(--color),var(--color) 100%,transparent),-webkit-linear-gradient(var(--color),var(--color));
background-size:100% ,var(--position);
background-repeat: no-repeat;
}
#zip-progress{
--color:yellow;
--position:0%;
width:200px;
height:10px;
border-radius:30px;
background-color:#ccc;
background-image:radial-gradient(closest-side circle at var(--position),var(--color),var(--color) 100%,transparent),linear-gradient(var(--color),var(--color));
background-image:-webkit-radial-gradient(var(--position),circle closest-side,var(--color),var(--color) 100%,transparent),-webkit-linear-gradient(var(--color),var(--color));
background-size:100% ,var(--position);
background-repeat: no-repeat;
margin-top: 5px;
}`;
document.head.appendChild(progressStyle);
document.body.appendChild(progress);
}
let pagePercent = `${(finishedChapterNumber / totalChapterNumber) * 100}%`;
document.querySelector("#chapter-progress").style.cssText = `--position:${pagePercent};`;
if (zipPercent) {
document.querySelector("#zip-progress").style.cssText = `--position:${zipPercent}%;`;
}
else {
document.querySelector("#zip-progress").style.cssText =
"display:none;";
}
}
async function run() {
console.log(`[run]下载开始`);
const rule = rules_1.getRule();
console.log(`[run]获取规则成功`);
let maxRunLimit = null;
let nowRunNumber;
if (lib_1._GM_info.scriptHandler === "Tampermonkey") {
console.log(`[run]添加运行标志`);
await setTabMark();
nowRunNumber = await getNowRunNumber();
if (rule.maxRunLimit !== undefined && nowRunNumber !== undefined) {
maxRunLimit = rule.maxRunLimit;
if (nowRunNumber > maxRunLimit) {
const alertText = `当前网站目前已有${nowRunNumber - 1}个下载任务正在运行,当前站点最多允许${maxRunLimit}下载任务同时进行。\n请待其它下载任务完成后,再行尝试。`;
alert(alertText);
console.log(`[run]${alertText}`);
return;
}
}
}
const book = await initBook(rule);
totalChapterNumber = book.chapters.filter((chapter) => chapter.status === main_1.Status.pending).length;
await initChapters(rule, book);
save(book);
if (lib_1._GM_info.scriptHandler === "Tampermonkey") {
console.log(`[run]移除运行标志`);
await removeTabMark();
}
console.log(`[run]下载完毕`);
return book;
}
function catchError(error) {
var _a, _b;
downloading = false;
if (lib_1._GM_info.scriptHandler === "Tampermonkey") {
removeTabMark();
}
finishedChapterNumber = 0;
(_a = document.querySelector("#nd-progress")) === null || _a === void 0 ? void 0 : _a.remove();
(_b = document.getElementById("novel-downloader")) === null || _b === void 0 ? void 0 : _b.remove();
console.error("运行过程出错,请附上相关日志至支持地址进行反馈。\n支持地址:https://github.com/yingziwu/novel-downloader");
console.error(error);
}
function addButton() {
let button = document.createElement("button");
button.id = "novel-downloader";
button.style.cssText = `position: fixed; top: 15%; right: 5%; z-index: 99; border-style: none; text-align:center; vertical-align:baseline; background-color: rgba(128, 128, 128, 0.2); padding: 5px; border-radius: 12px;`;
let img = document.createElement("img");
img.src = rules_1.icon0;
img.style.cssText = "height: 2em;";
button.onclick = function () {
if (downloading) {
alert("正在下载中,请耐心等待……");
}
else {
downloading = true;
img.src = rules_1.icon1;
try {
run()
.then((book) => {
downloading = false;
img.src = rules_1.icon0;
})
.catch(catchError);
}
catch (error) {
catchError(error);
}
}
};
button.appendChild(img);
document.body.appendChild(button);
}
async function debug() {
const rule = rules_1.getRule();
const book = await initBook(rule);
unsafeWindow.rule = rule;
unsafeWindow.book = book;
unsafeWindow.save = save;
unsafeWindow.saveAs = saveAs;
return;
}
let downloading = false;
const enaleDebug = false;
window.addEventListener("DOMContentLoaded", () => {
printEnvironments();
addButton();
if (enaleDebug) {
debug();
}
});
})();
/******/ })()
;