novel-downloader 1.4.5__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. novel_downloader/__init__.py +1 -1
  2. novel_downloader/cli/__init__.py +2 -4
  3. novel_downloader/cli/clean.py +21 -88
  4. novel_downloader/cli/config.py +27 -104
  5. novel_downloader/cli/download.py +78 -66
  6. novel_downloader/cli/export.py +20 -21
  7. novel_downloader/cli/main.py +3 -1
  8. novel_downloader/cli/search.py +120 -0
  9. novel_downloader/cli/ui.py +156 -0
  10. novel_downloader/config/__init__.py +10 -14
  11. novel_downloader/config/adapter.py +195 -99
  12. novel_downloader/config/{loader.py → file_io.py} +53 -27
  13. novel_downloader/core/__init__.py +14 -13
  14. novel_downloader/core/archived/deqixs/fetcher.py +115 -0
  15. novel_downloader/core/archived/deqixs/parser.py +132 -0
  16. novel_downloader/core/archived/deqixs/searcher.py +89 -0
  17. novel_downloader/core/archived/qidian/searcher.py +79 -0
  18. novel_downloader/core/archived/wanbengo/searcher.py +98 -0
  19. novel_downloader/core/archived/xshbook/searcher.py +93 -0
  20. novel_downloader/core/downloaders/__init__.py +8 -30
  21. novel_downloader/core/downloaders/base.py +182 -30
  22. novel_downloader/core/downloaders/common.py +217 -384
  23. novel_downloader/core/downloaders/qianbi.py +332 -4
  24. novel_downloader/core/downloaders/qidian.py +250 -290
  25. novel_downloader/core/downloaders/registry.py +69 -0
  26. novel_downloader/core/downloaders/signals.py +46 -0
  27. novel_downloader/core/exporters/__init__.py +8 -26
  28. novel_downloader/core/exporters/base.py +107 -31
  29. novel_downloader/core/exporters/common/__init__.py +3 -4
  30. novel_downloader/core/exporters/common/epub.py +92 -171
  31. novel_downloader/core/exporters/common/main_exporter.py +14 -67
  32. novel_downloader/core/exporters/common/txt.py +90 -86
  33. novel_downloader/core/exporters/epub_util.py +184 -1327
  34. novel_downloader/core/exporters/linovelib/__init__.py +3 -2
  35. novel_downloader/core/exporters/linovelib/epub.py +165 -222
  36. novel_downloader/core/exporters/linovelib/main_exporter.py +10 -71
  37. novel_downloader/core/exporters/linovelib/txt.py +76 -66
  38. novel_downloader/core/exporters/qidian.py +15 -11
  39. novel_downloader/core/exporters/registry.py +55 -0
  40. novel_downloader/core/exporters/txt_util.py +67 -0
  41. novel_downloader/core/fetchers/__init__.py +57 -56
  42. novel_downloader/core/fetchers/aaatxt.py +83 -0
  43. novel_downloader/core/fetchers/{biquge/session.py → b520.py} +10 -10
  44. novel_downloader/core/fetchers/{base/session.py → base.py} +63 -47
  45. novel_downloader/core/fetchers/biquyuedu.py +83 -0
  46. novel_downloader/core/fetchers/dxmwx.py +110 -0
  47. novel_downloader/core/fetchers/eightnovel.py +139 -0
  48. novel_downloader/core/fetchers/{esjzone/session.py → esjzone.py} +23 -11
  49. novel_downloader/core/fetchers/guidaye.py +85 -0
  50. novel_downloader/core/fetchers/hetushu.py +92 -0
  51. novel_downloader/core/fetchers/{qianbi/browser.py → i25zw.py} +22 -26
  52. novel_downloader/core/fetchers/ixdzs8.py +113 -0
  53. novel_downloader/core/fetchers/jpxs123.py +101 -0
  54. novel_downloader/core/fetchers/{biquge/browser.py → lewenn.py} +15 -15
  55. novel_downloader/core/fetchers/{linovelib/session.py → linovelib.py} +16 -12
  56. novel_downloader/core/fetchers/piaotia.py +105 -0
  57. novel_downloader/core/fetchers/qbtr.py +101 -0
  58. novel_downloader/core/fetchers/{qianbi/session.py → qianbi.py} +9 -9
  59. novel_downloader/core/fetchers/{qidian/session.py → qidian.py} +55 -40
  60. novel_downloader/core/fetchers/quanben5.py +92 -0
  61. novel_downloader/core/fetchers/{base/rate_limiter.py → rate_limiter.py} +2 -2
  62. novel_downloader/core/fetchers/registry.py +60 -0
  63. novel_downloader/core/fetchers/{sfacg/session.py → sfacg.py} +11 -9
  64. novel_downloader/core/fetchers/shencou.py +106 -0
  65. novel_downloader/core/fetchers/{common/browser.py → shuhaige.py} +24 -19
  66. novel_downloader/core/fetchers/tongrenquan.py +84 -0
  67. novel_downloader/core/fetchers/ttkan.py +95 -0
  68. novel_downloader/core/fetchers/{common/session.py → wanbengo.py} +21 -17
  69. novel_downloader/core/fetchers/xiaoshuowu.py +106 -0
  70. novel_downloader/core/fetchers/xiguashuwu.py +177 -0
  71. novel_downloader/core/fetchers/xs63b.py +171 -0
  72. novel_downloader/core/fetchers/xshbook.py +85 -0
  73. novel_downloader/core/fetchers/{yamibo/session.py → yamibo.py} +23 -11
  74. novel_downloader/core/fetchers/yibige.py +114 -0
  75. novel_downloader/core/interfaces/__init__.py +8 -14
  76. novel_downloader/core/interfaces/downloader.py +6 -2
  77. novel_downloader/core/interfaces/exporter.py +7 -7
  78. novel_downloader/core/interfaces/fetcher.py +4 -17
  79. novel_downloader/core/interfaces/parser.py +5 -6
  80. novel_downloader/core/interfaces/searcher.py +26 -0
  81. novel_downloader/core/parsers/__init__.py +58 -22
  82. novel_downloader/core/parsers/aaatxt.py +132 -0
  83. novel_downloader/core/parsers/b520.py +116 -0
  84. novel_downloader/core/parsers/base.py +63 -12
  85. novel_downloader/core/parsers/biquyuedu.py +133 -0
  86. novel_downloader/core/parsers/dxmwx.py +162 -0
  87. novel_downloader/core/parsers/eightnovel.py +224 -0
  88. novel_downloader/core/parsers/{esjzone/main_parser.py → esjzone.py} +67 -67
  89. novel_downloader/core/parsers/guidaye.py +128 -0
  90. novel_downloader/core/parsers/hetushu.py +139 -0
  91. novel_downloader/core/parsers/i25zw.py +137 -0
  92. novel_downloader/core/parsers/ixdzs8.py +186 -0
  93. novel_downloader/core/parsers/jpxs123.py +137 -0
  94. novel_downloader/core/parsers/lewenn.py +142 -0
  95. novel_downloader/core/parsers/{linovelib/main_parser.py → linovelib.py} +54 -65
  96. novel_downloader/core/parsers/piaotia.py +189 -0
  97. novel_downloader/core/parsers/qbtr.py +136 -0
  98. novel_downloader/core/parsers/{qianbi/main_parser.py → qianbi.py} +54 -51
  99. novel_downloader/core/parsers/qidian/__init__.py +2 -2
  100. novel_downloader/core/parsers/qidian/book_info_parser.py +58 -59
  101. novel_downloader/core/parsers/qidian/chapter_encrypted.py +290 -346
  102. novel_downloader/core/parsers/qidian/chapter_normal.py +25 -56
  103. novel_downloader/core/parsers/qidian/main_parser.py +19 -57
  104. novel_downloader/core/parsers/qidian/utils/__init__.py +12 -11
  105. novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py +6 -7
  106. novel_downloader/core/parsers/qidian/utils/fontmap_recover.py +143 -0
  107. novel_downloader/core/parsers/qidian/utils/helpers.py +0 -4
  108. novel_downloader/core/parsers/qidian/utils/node_decryptor.py +2 -2
  109. novel_downloader/core/parsers/quanben5.py +103 -0
  110. novel_downloader/core/parsers/registry.py +57 -0
  111. novel_downloader/core/parsers/{sfacg/main_parser.py → sfacg.py} +46 -48
  112. novel_downloader/core/parsers/shencou.py +215 -0
  113. novel_downloader/core/parsers/shuhaige.py +111 -0
  114. novel_downloader/core/parsers/tongrenquan.py +116 -0
  115. novel_downloader/core/parsers/ttkan.py +132 -0
  116. novel_downloader/core/parsers/wanbengo.py +191 -0
  117. novel_downloader/core/parsers/xiaoshuowu.py +173 -0
  118. novel_downloader/core/parsers/xiguashuwu.py +435 -0
  119. novel_downloader/core/parsers/xs63b.py +161 -0
  120. novel_downloader/core/parsers/xshbook.py +134 -0
  121. novel_downloader/core/parsers/yamibo.py +155 -0
  122. novel_downloader/core/parsers/yibige.py +166 -0
  123. novel_downloader/core/searchers/__init__.py +51 -0
  124. novel_downloader/core/searchers/aaatxt.py +107 -0
  125. novel_downloader/core/searchers/b520.py +84 -0
  126. novel_downloader/core/searchers/base.py +168 -0
  127. novel_downloader/core/searchers/dxmwx.py +105 -0
  128. novel_downloader/core/searchers/eightnovel.py +84 -0
  129. novel_downloader/core/searchers/esjzone.py +102 -0
  130. novel_downloader/core/searchers/hetushu.py +92 -0
  131. novel_downloader/core/searchers/i25zw.py +93 -0
  132. novel_downloader/core/searchers/ixdzs8.py +107 -0
  133. novel_downloader/core/searchers/jpxs123.py +107 -0
  134. novel_downloader/core/searchers/piaotia.py +100 -0
  135. novel_downloader/core/searchers/qbtr.py +106 -0
  136. novel_downloader/core/searchers/qianbi.py +165 -0
  137. novel_downloader/core/searchers/quanben5.py +144 -0
  138. novel_downloader/core/searchers/registry.py +79 -0
  139. novel_downloader/core/searchers/shuhaige.py +124 -0
  140. novel_downloader/core/searchers/tongrenquan.py +110 -0
  141. novel_downloader/core/searchers/ttkan.py +92 -0
  142. novel_downloader/core/searchers/xiaoshuowu.py +122 -0
  143. novel_downloader/core/searchers/xiguashuwu.py +95 -0
  144. novel_downloader/core/searchers/xs63b.py +104 -0
  145. novel_downloader/locales/en.json +36 -79
  146. novel_downloader/locales/zh.json +37 -80
  147. novel_downloader/models/__init__.py +23 -50
  148. novel_downloader/models/book.py +44 -0
  149. novel_downloader/models/config.py +16 -43
  150. novel_downloader/models/login.py +1 -1
  151. novel_downloader/models/search.py +21 -0
  152. novel_downloader/resources/config/settings.toml +39 -74
  153. novel_downloader/resources/css_styles/intro.css +83 -0
  154. novel_downloader/resources/css_styles/main.css +30 -89
  155. novel_downloader/resources/json/xiguashuwu.json +718 -0
  156. novel_downloader/utils/__init__.py +43 -0
  157. novel_downloader/utils/chapter_storage.py +247 -226
  158. novel_downloader/utils/constants.py +5 -50
  159. novel_downloader/utils/cookies.py +6 -18
  160. novel_downloader/utils/crypto_utils/__init__.py +13 -0
  161. novel_downloader/utils/crypto_utils/aes_util.py +90 -0
  162. novel_downloader/utils/crypto_utils/aes_v1.py +619 -0
  163. novel_downloader/utils/crypto_utils/aes_v2.py +1143 -0
  164. novel_downloader/utils/{crypto_utils.py → crypto_utils/rc4.py} +3 -10
  165. novel_downloader/utils/epub/__init__.py +34 -0
  166. novel_downloader/utils/epub/builder.py +377 -0
  167. novel_downloader/utils/epub/constants.py +118 -0
  168. novel_downloader/utils/epub/documents.py +297 -0
  169. novel_downloader/utils/epub/models.py +120 -0
  170. novel_downloader/utils/epub/utils.py +179 -0
  171. novel_downloader/utils/file_utils/__init__.py +5 -30
  172. novel_downloader/utils/file_utils/io.py +9 -150
  173. novel_downloader/utils/file_utils/normalize.py +2 -2
  174. novel_downloader/utils/file_utils/sanitize.py +2 -7
  175. novel_downloader/utils/fontocr.py +207 -0
  176. novel_downloader/utils/i18n.py +2 -0
  177. novel_downloader/utils/logger.py +10 -16
  178. novel_downloader/utils/network.py +111 -252
  179. novel_downloader/utils/state.py +5 -90
  180. novel_downloader/utils/text_utils/__init__.py +16 -21
  181. novel_downloader/utils/text_utils/diff_display.py +6 -9
  182. novel_downloader/utils/text_utils/numeric_conversion.py +253 -0
  183. novel_downloader/utils/text_utils/text_cleaner.py +179 -0
  184. novel_downloader/utils/text_utils/truncate_utils.py +62 -0
  185. novel_downloader/utils/time_utils/__init__.py +6 -12
  186. novel_downloader/utils/time_utils/datetime_utils.py +23 -33
  187. novel_downloader/utils/time_utils/sleep_utils.py +5 -10
  188. novel_downloader/web/__init__.py +13 -0
  189. novel_downloader/web/components/__init__.py +11 -0
  190. novel_downloader/web/components/navigation.py +35 -0
  191. novel_downloader/web/main.py +66 -0
  192. novel_downloader/web/pages/__init__.py +17 -0
  193. novel_downloader/web/pages/download.py +78 -0
  194. novel_downloader/web/pages/progress.py +147 -0
  195. novel_downloader/web/pages/search.py +329 -0
  196. novel_downloader/web/services/__init__.py +17 -0
  197. novel_downloader/web/services/client_dialog.py +164 -0
  198. novel_downloader/web/services/cred_broker.py +113 -0
  199. novel_downloader/web/services/cred_models.py +35 -0
  200. novel_downloader/web/services/task_manager.py +264 -0
  201. novel_downloader-2.0.0.dist-info/METADATA +171 -0
  202. novel_downloader-2.0.0.dist-info/RECORD +210 -0
  203. {novel_downloader-1.4.5.dist-info → novel_downloader-2.0.0.dist-info}/entry_points.txt +1 -1
  204. novel_downloader/config/site_rules.py +0 -94
  205. novel_downloader/core/downloaders/biquge.py +0 -25
  206. novel_downloader/core/downloaders/esjzone.py +0 -25
  207. novel_downloader/core/downloaders/linovelib.py +0 -25
  208. novel_downloader/core/downloaders/sfacg.py +0 -25
  209. novel_downloader/core/downloaders/yamibo.py +0 -25
  210. novel_downloader/core/exporters/biquge.py +0 -25
  211. novel_downloader/core/exporters/esjzone.py +0 -25
  212. novel_downloader/core/exporters/qianbi.py +0 -25
  213. novel_downloader/core/exporters/sfacg.py +0 -25
  214. novel_downloader/core/exporters/yamibo.py +0 -25
  215. novel_downloader/core/factory/__init__.py +0 -20
  216. novel_downloader/core/factory/downloader.py +0 -73
  217. novel_downloader/core/factory/exporter.py +0 -58
  218. novel_downloader/core/factory/fetcher.py +0 -96
  219. novel_downloader/core/factory/parser.py +0 -86
  220. novel_downloader/core/fetchers/base/__init__.py +0 -14
  221. novel_downloader/core/fetchers/base/browser.py +0 -403
  222. novel_downloader/core/fetchers/biquge/__init__.py +0 -14
  223. novel_downloader/core/fetchers/common/__init__.py +0 -14
  224. novel_downloader/core/fetchers/esjzone/__init__.py +0 -14
  225. novel_downloader/core/fetchers/esjzone/browser.py +0 -204
  226. novel_downloader/core/fetchers/linovelib/__init__.py +0 -14
  227. novel_downloader/core/fetchers/linovelib/browser.py +0 -193
  228. novel_downloader/core/fetchers/qianbi/__init__.py +0 -14
  229. novel_downloader/core/fetchers/qidian/__init__.py +0 -14
  230. novel_downloader/core/fetchers/qidian/browser.py +0 -318
  231. novel_downloader/core/fetchers/sfacg/__init__.py +0 -14
  232. novel_downloader/core/fetchers/sfacg/browser.py +0 -189
  233. novel_downloader/core/fetchers/yamibo/__init__.py +0 -14
  234. novel_downloader/core/fetchers/yamibo/browser.py +0 -229
  235. novel_downloader/core/parsers/biquge/__init__.py +0 -10
  236. novel_downloader/core/parsers/biquge/main_parser.py +0 -134
  237. novel_downloader/core/parsers/common/__init__.py +0 -13
  238. novel_downloader/core/parsers/common/helper.py +0 -323
  239. novel_downloader/core/parsers/common/main_parser.py +0 -106
  240. novel_downloader/core/parsers/esjzone/__init__.py +0 -10
  241. novel_downloader/core/parsers/linovelib/__init__.py +0 -10
  242. novel_downloader/core/parsers/qianbi/__init__.py +0 -10
  243. novel_downloader/core/parsers/sfacg/__init__.py +0 -10
  244. novel_downloader/core/parsers/yamibo/__init__.py +0 -10
  245. novel_downloader/core/parsers/yamibo/main_parser.py +0 -194
  246. novel_downloader/models/browser.py +0 -21
  247. novel_downloader/models/chapter.py +0 -25
  248. novel_downloader/models/site_rules.py +0 -99
  249. novel_downloader/models/tasks.py +0 -33
  250. novel_downloader/models/types.py +0 -15
  251. novel_downloader/resources/css_styles/volume-intro.css +0 -56
  252. novel_downloader/resources/json/replace_word_map.json +0 -4
  253. novel_downloader/resources/text/blacklist.txt +0 -22
  254. novel_downloader/tui/__init__.py +0 -7
  255. novel_downloader/tui/app.py +0 -32
  256. novel_downloader/tui/main.py +0 -17
  257. novel_downloader/tui/screens/__init__.py +0 -14
  258. novel_downloader/tui/screens/home.py +0 -198
  259. novel_downloader/tui/screens/login.py +0 -74
  260. novel_downloader/tui/styles/home_layout.tcss +0 -79
  261. novel_downloader/tui/widgets/richlog_handler.py +0 -24
  262. novel_downloader/utils/cache.py +0 -24
  263. novel_downloader/utils/fontocr/__init__.py +0 -22
  264. novel_downloader/utils/fontocr/model_loader.py +0 -69
  265. novel_downloader/utils/fontocr/ocr_v1.py +0 -303
  266. novel_downloader/utils/fontocr/ocr_v2.py +0 -752
  267. novel_downloader/utils/hash_store.py +0 -279
  268. novel_downloader/utils/hash_utils.py +0 -103
  269. novel_downloader/utils/text_utils/chapter_formatting.py +0 -46
  270. novel_downloader/utils/text_utils/font_mapping.py +0 -28
  271. novel_downloader/utils/text_utils/text_cleaning.py +0 -107
  272. novel_downloader-1.4.5.dist-info/METADATA +0 -196
  273. novel_downloader-1.4.5.dist-info/RECORD +0 -165
  274. {novel_downloader-1.4.5.dist-info → novel_downloader-2.0.0.dist-info}/WHEEL +0 -0
  275. {novel_downloader-1.4.5.dist-info → novel_downloader-2.0.0.dist-info}/licenses/LICENSE +0 -0
  276. {novel_downloader-1.4.5.dist-info → novel_downloader-2.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,171 @@
1
+ Metadata-Version: 2.4
2
+ Name: novel-downloader
3
+ Version: 2.0.0
4
+ Summary: A command-line tool for downloading Chinese web novels from Qidian and similar platforms.
5
+ Author-email: Saudade Z <saudadez217@gmail.com>
6
+ License: MIT License
7
+
8
+ Copyright (c) 2025 Saudade Z
9
+
10
+ Permission is hereby granted, free of charge, to any person obtaining a copy
11
+ of this software and associated documentation files (the "Software"), to deal
12
+ in the Software without restriction, including without limitation the rights
13
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14
+ copies of the Software, and to permit persons to whom the Software is
15
+ furnished to do so, subject to the following conditions:
16
+
17
+ The above copyright notice and this permission notice shall be included in all
18
+ copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26
+ SOFTWARE.
27
+
28
+ Project-URL: Homepage, https://github.com/saudadez21/novel-downloader
29
+ Project-URL: Source, https://github.com/saudadez21/novel-downloader
30
+ Keywords: novel,web novel,qidian,biquge,ebook
31
+ Classifier: Development Status :: 3 - Alpha
32
+ Classifier: Environment :: Console
33
+ Classifier: License :: OSI Approved :: MIT License
34
+ Classifier: Natural Language :: Chinese (Simplified)
35
+ Classifier: Topic :: Utilities
36
+ Classifier: Programming Language :: Python :: 3
37
+ Classifier: Programming Language :: Python :: 3.11
38
+ Classifier: Programming Language :: Python :: 3.12
39
+ Classifier: Programming Language :: Python :: 3.13
40
+ Requires-Python: >=3.11
41
+ Description-Content-Type: text/markdown
42
+ License-File: LICENSE
43
+ Requires-Dist: rich
44
+ Requires-Dist: nicegui
45
+ Requires-Dist: requests
46
+ Requires-Dist: aiohttp
47
+ Requires-Dist: lxml
48
+ Requires-Dist: platformdirs
49
+ Provides-Extra: font-recovery
50
+ Requires-Dist: numpy; extra == "font-recovery"
51
+ Requires-Dist: fonttools; extra == "font-recovery"
52
+ Requires-Dist: pillow; extra == "font-recovery"
53
+ Provides-Extra: dev
54
+ Requires-Dist: black; extra == "dev"
55
+ Requires-Dist: mypy; extra == "dev"
56
+ Requires-Dist: ruff; extra == "dev"
57
+ Requires-Dist: pytest; extra == "dev"
58
+ Requires-Dist: pytest-cov; extra == "dev"
59
+ Requires-Dist: pytest-mock; extra == "dev"
60
+ Requires-Dist: types-requests; extra == "dev"
61
+ Requires-Dist: types-lxml; extra == "dev"
62
+ Requires-Dist: types-PyYAML; extra == "dev"
63
+ Requires-Dist: pre-commit; extra == "dev"
64
+ Requires-Dist: commitizen; extra == "dev"
65
+ Dynamic: license-file
66
+
67
+ # novel-downloader
68
+
69
+ 基于 [aiohttp](https://github.com/aio-libs/aiohttp) 的异步小说下载工具 / 库。支持断点续传、广告过滤与 TXT/EPUB 导出, 提供 CLI 与 Web 图形界面。
70
+
71
+ > 运行要求: **Python 3.11+** (开发环境: Python 3.12)
72
+
73
+ ## 功能特性
74
+
75
+ * **可恢复下载**: 运行时自动检测本地已完成的部分, 跳过已下载内容
76
+ * **多格式导出**: 合并所有章节为
77
+ * `TXT`
78
+ * `EPUB` (可选打包章节插图)
79
+ * **广告/活动过滤**:
80
+ * [x] 章节标题过滤
81
+ * [x] 章节正文过滤
82
+ * **可选字体混淆还原**: `decode_font`
83
+ * **双形态使用**: 命令行 (CLI) 与 Web 图形界面 (GUI)
84
+
85
+ ---
86
+
87
+ ## 安装
88
+
89
+ 使用 `pip` 安装稳定版:
90
+
91
+ ```bash
92
+ pip install novel-downloader
93
+ ```
94
+
95
+ 启用字体解密功能 (`decode_font`):
96
+
97
+ ```bash
98
+ pip install "novel-downloader[font-recovery]"
99
+ ```
100
+
101
+ > 参见: [安装](https://github.com/saudadez21/novel-downloader/blob/main/docs/1-installation.md)
102
+
103
+ ---
104
+
105
+ ## 快速开始
106
+
107
+ ### 1. 初始化配置
108
+
109
+ ```bash
110
+ # 生成默认配置 ./settings.toml
111
+ novel-cli config init
112
+ ```
113
+
114
+ 编辑生成的 `./settings.toml`, 可修改 `request_interval`、`book_ids` 等配置 (参考 [settings.toml 配置说明](https://github.com/saudadez21/novel-downloader/blob/main/docs/3-settings-schema.md))
115
+
116
+ ### 2. 命令行 (CLI)
117
+
118
+ ```bash
119
+ # 执行下载任务 (示例: 书籍 ID 为 123456, 默认站点为起点)
120
+ novel-cli download 123456
121
+ ```
122
+
123
+ * 支持站点见: [支持站点列表](https://github.com/saudadez21/novel-downloader/blob/main/docs/4-supported-sites.md)
124
+ * 更多示例见: [CLI 使用示例](https://github.com/saudadez21/novel-downloader/blob/main/docs/5-cli-usage-examples.md)
125
+
126
+ ### 3. 图形界面 (GUI / Web)
127
+
128
+ ```bash
129
+ # 启动 Web 界面 (基于当前 settings.toml)
130
+ novel-web
131
+
132
+ # 如需提供局域网/外网访问 (请自行留意安全与网络环境)
133
+ # novel-web --listen public
134
+ ```
135
+
136
+ ---
137
+
138
+ ## 从源码安装 (开发版)
139
+
140
+ 体验最新开发功能:
141
+
142
+ ```bash
143
+ git clone https://github.com/saudadez21/novel-downloader.git
144
+ cd novel-downloader
145
+ pip install .
146
+ # 或安装带可选功能:
147
+ # pip install .[font-recovery]
148
+ ```
149
+
150
+ ---
151
+
152
+ ## 文档导航
153
+
154
+ * [安装](https://github.com/saudadez21/novel-downloader/blob/main/docs/1-installation.md)
155
+ * [配置](https://github.com/saudadez21/novel-downloader/blob/main/docs/2-configuration.md)
156
+ * [settings.toml 配置说明](https://github.com/saudadez21/novel-downloader/blob/main/docs/3-settings-schema.md)
157
+ * [支持站点列表](https://github.com/saudadez21/novel-downloader/blob/main/docs/4-supported-sites.md)
158
+ * [CLI 使用示例](https://github.com/saudadez21/novel-downloader/blob/main/docs/5-cli-usage-examples.md)
159
+ * [复制 Cookies](https://github.com/saudadez21/novel-downloader/blob/main/docs/copy-cookies.md)
160
+ * [文件保存](https://github.com/saudadez21/novel-downloader/blob/main/docs/file-saving.md)
161
+ * [模块与接口文档](https://github.com/saudadez21/novel-downloader/blob/main/docs/api/README.md)
162
+ * [TODO](https://github.com/saudadez21/novel-downloader/blob/main/docs/todo.md)
163
+ * [开发](https://github.com/saudadez21/novel-downloader/blob/main/docs/develop.md)
164
+
165
+ ---
166
+
167
+ ## 项目说明
168
+
169
+ * 本项目仅供学习和研究使用, **不得**用于任何商业或违法用途; 请遵守目标网站的 `robots.txt` 及相关法律法规
170
+ * 由于网站结构可能变化或其他问题, 可能导致无法正常工作, 请按需自行调整代码或寻找其他解决方案
171
+ * 使用本项目造成的任何法律责任由使用者自行承担, 项目作者不承担相关责任
@@ -0,0 +1,210 @@
1
+ novel_downloader/__init__.py,sha256=gvhm67MQNWoL_G7z3QqXrhgp7Cw3xc5KqU8-UpCKQ0s,218
2
+ novel_downloader/cli/__init__.py,sha256=okUd_09fBWx8lz3zx3329dIK0xNRlNQJkUzDXYoSE1U,167
3
+ novel_downloader/cli/clean.py,sha256=VaiJox75-ZuXvSDFMaiAUawEbdtuEUsnsVWZGKuirJ4,2395
4
+ novel_downloader/cli/config.py,sha256=W4-f59dK5jdlg_9XDwGIyzd6VtpyNpB9U4qcxfso8Xg,3598
5
+ novel_downloader/cli/download.py,sha256=-59icT24iU_l6LhAJqQaxLAogJAr0hRxd-_RfcjQbdI,7587
6
+ novel_downloader/cli/export.py,sha256=iSIbSXreYRTs_KfZS4eJ0cJoMgoutwdza88JGoxQMlw,2573
7
+ novel_downloader/cli/main.py,sha256=GKtxeumw_VvWManp52Am538jL2t7xz7yVrGIaxrvSVk,1009
8
+ novel_downloader/cli/search.py,sha256=_Ci4fa1ECiYmBZI2OZBxzwddYGIvdUyIp4AOIJiL1Ds,3641
9
+ novel_downloader/cli/ui.py,sha256=Gme3J4M_eK23cDWepMs8-c0zfIanSSXERnYSWYkerE4,3992
10
+ novel_downloader/config/__init__.py,sha256=gwaDMlcBX7Lw8Hi8dY2HxNEt9ysMhIFNhkziyjramWo,405
11
+ novel_downloader/config/adapter.py,sha256=Y8Dt5GflbCiOwjBbTN7D3O5JPnkssbJDYGtYOYzEt1M,11561
12
+ novel_downloader/config/file_io.py,sha256=ncKk7rj07UnYYVEPR_RHS2D5igMSv8xaHySNvJQWhB8,6495
13
+ novel_downloader/core/__init__.py,sha256=20zZKxemHFQv8noyftPTcen6Okq-AJS5GIlwn8Zc7AA,1157
14
+ novel_downloader/core/archived/deqixs/fetcher.py,sha256=JGTLWI-d5jLULB-vS2VUeajwp7tHlb9trUCF4lJrdiQ,3432
15
+ novel_downloader/core/archived/deqixs/parser.py,sha256=udM6MYdunPVYwUNjEoBDjffHR_SsXPvv_EqsCMJJVrE,4169
16
+ novel_downloader/core/archived/deqixs/searcher.py,sha256=ezXCQ0pM8AqmTXmkzLrOSebTvHg_GouIywIE23c5hwY,2920
17
+ novel_downloader/core/archived/qidian/searcher.py,sha256=Q0-MdYfO-NrFW7rhF92lXk8EX1Gdcmp_gYzhcM06cLU,2460
18
+ novel_downloader/core/archived/wanbengo/searcher.py,sha256=RAXHENGgqGzWRop3N4_PPlRB7JdUZotQqKaA2RRrzZM,3056
19
+ novel_downloader/core/archived/xshbook/searcher.py,sha256=pfyVPl7DP_cq0mjIIyOkQPKZL-piOTO5agSSPeY4Qi4,2915
20
+ novel_downloader/core/downloaders/__init__.py,sha256=r1Ipy4AMc_sBYo14pUPYkLu7eN1g_6UJ9O2gfQLcAB8,430
21
+ novel_downloader/core/downloaders/base.py,sha256=mCyMG3Iwvursm3ACCYK2Vr45nDqr73V1awOfL7kSXTs,11526
22
+ novel_downloader/core/downloaders/common.py,sha256=hqffXUjci3CLvs9d0jCYwrYvDHdJUDpzWn2wjHTuS50,10062
23
+ novel_downloader/core/downloaders/qianbi.py,sha256=sqil69--GhAqfFzZxQG3ZeKZavWEy8qTcM0Li4FCJy4,12506
24
+ novel_downloader/core/downloaders/qidian.py,sha256=LEFx1F5GS62qpDKMa_z7CxT0txUEQ-vY51vgAEQG5o0,11924
25
+ novel_downloader/core/downloaders/registry.py,sha256=7Fahoix4SeWOgN5D0D8TSiXRsRX4XmQKuaDvFn7fK5s,1887
26
+ novel_downloader/core/downloaders/signals.py,sha256=fgiSH8iRqkNqyI7pZX-hfJEOMY1KbXB1lT49eSJyHqQ,1093
27
+ novel_downloader/core/exporters/__init__.py,sha256=Kobscd3cnOeXZg7M7trOoN_xmx-y517VN2Atsosx0LM,433
28
+ novel_downloader/core/exporters/base.py,sha256=kYUU2kMP3E1u0bczG4FCIogoJHlgKkRp7MdHtnsi4wI,8486
29
+ novel_downloader/core/exporters/epub_util.py,sha256=eFig6ZNCl95NkbLDmz8z-ZEmmJ9OECwlTZSfUwFVThU,6048
30
+ novel_downloader/core/exporters/qidian.py,sha256=cRVrFhntaM0nXHZUzn40SzsFrUQakPBK9wRD06VpLOc,747
31
+ novel_downloader/core/exporters/registry.py,sha256=kWy6zxTwGQ8kBto0h3lNIDj2a0pdHPaTwJyldGalICA,1552
32
+ novel_downloader/core/exporters/txt_util.py,sha256=-pkwMFh-69FHEziTW4LiW3-u6f1GqV973F7zH8fXZxA,1987
33
+ novel_downloader/core/exporters/common/__init__.py,sha256=8qVMdtM_hLo3D3bMMQYYL10I0evHy1BgaceqOMTu9OE,259
34
+ novel_downloader/core/exporters/common/epub.py,sha256=OZV8KCE9otYLjlDKEogFQ5KElUAXGJwV5zSCtm59FOw,5961
35
+ novel_downloader/core/exporters/common/main_exporter.py,sha256=uBx67rBaeijZWt3cZDR7xipf-P_3ShyypZROxe8CjEQ,2165
36
+ novel_downloader/core/exporters/common/txt.py,sha256=Nzzo60ksECYkBvjSooZYPUFNbeD7hbz6jmTUSYVhHxk,4721
37
+ novel_downloader/core/exporters/linovelib/__init__.py,sha256=AFjdUyFalrU8n_OjxqYENZ5zVcfYPONgWbvFkI0Sgls,250
38
+ novel_downloader/core/exporters/linovelib/epub.py,sha256=BiYgX61lZdgYeipnNuzMHmAjjSXnofs1eKoPR9UduDg,10703
39
+ novel_downloader/core/exporters/linovelib/main_exporter.py,sha256=qFMKfPobNWTDzW8CLr6FcNpkdqAuH5PMjqAQA_Jb78w,1938
40
+ novel_downloader/core/exporters/linovelib/txt.py,sha256=5k7ZKVPOtalOeTr9xFca3zkofNKa4Wg0NdKk-lujC58,4433
41
+ novel_downloader/core/fetchers/__init__.py,sha256=V0BXwjULLODbS69YRRfvivEB4HVdUxo4tFMZ44qT6mU,1982
42
+ novel_downloader/core/fetchers/aaatxt.py,sha256=fupx1NLqHc3PH61_cSbZ0lafkmLmcs2R3FI5z56YyC4,2417
43
+ novel_downloader/core/fetchers/b520.py,sha256=IuIci62rHLtad3eIU-iR9be56vw7w3W4ctpvQpkOg3I,2458
44
+ novel_downloader/core/fetchers/base.py,sha256=33PCJH08hnkEo1szJdpX0FpL_karIo1QgGp3ID0972E,13179
45
+ novel_downloader/core/fetchers/biquyuedu.py,sha256=Q1jR4lvAOVfE9HahHAWpSXdPcTUAJD5SpO_82b3xVKo,2473
46
+ novel_downloader/core/fetchers/dxmwx.py,sha256=JDbUHCOxuvXA6kNxoJLVUgiOOPSbemes-g6TZX6I1uE,3442
47
+ novel_downloader/core/fetchers/eightnovel.py,sha256=gtQZshH_VMu6HTWOH-CcdCGkkV3PlpX4bXDxAjMxUlE,4322
48
+ novel_downloader/core/fetchers/esjzone.py,sha256=8vNQX58iYIcrwQINcC0XdP0bKfdoxUPRotmLOkAF5D0,7594
49
+ novel_downloader/core/fetchers/guidaye.py,sha256=e7we3KSrzCTEbYv8bre3pyU78OsdNYbjA03V2D5S7Eg,2535
50
+ novel_downloader/core/fetchers/hetushu.py,sha256=v7cxBy6GrQIC9O8LqGHDyJlVB2oCwREbO3A-qI3vzyw,2773
51
+ novel_downloader/core/fetchers/i25zw.py,sha256=fcCFqSfPgFhgdk7DrTxPqgpJDDzmP79VzoverAwFNvw,3086
52
+ novel_downloader/core/fetchers/ixdzs8.py,sha256=DFI6qPu_xkb6zMLi1KkBZFxCbAvQzVPb8SHlAARoRGI,3530
53
+ novel_downloader/core/fetchers/jpxs123.py,sha256=BPomuCmvOGlKQZ-SR6TonB9YjTCFiPbdflkB-nw_-V0,3120
54
+ novel_downloader/core/fetchers/lewenn.py,sha256=W_2DiHsfeTNs5d2ZkjO907OMQyQVXGAL-nUJ-Ml0n2k,2457
55
+ novel_downloader/core/fetchers/linovelib.py,sha256=5oUji6UkM0XXkDmOPiWelhSo6C0NkD7JeJvNxVQG7IY,6136
56
+ novel_downloader/core/fetchers/piaotia.py,sha256=DPtBSBFmrU3Y3ha7u83sx5S9GXTpNxFj5VZtsP6pkmk,3220
57
+ novel_downloader/core/fetchers/qbtr.py,sha256=EGw8p-J01wu1iJmz4Vm6wjXPuTgVt6Y4BIY8Aun7zsQ,3094
58
+ novel_downloader/core/fetchers/qianbi.py,sha256=sWMpF78ZXBBVYs-DdUp0LG7khO84AMJzFYkDu_GSqfA,3174
59
+ novel_downloader/core/fetchers/qidian.py,sha256=pk_uLdCCnCYRD_OaJNhR17UCwmI6iH7mKMeKfEofgZY,10330
60
+ novel_downloader/core/fetchers/quanben5.py,sha256=TkLFJOfpMOpKNkq2D9R0HI33zzAV-KuHccXquu6CZZ0,2776
61
+ novel_downloader/core/fetchers/rate_limiter.py,sha256=Z05dZOATi_-Su14qRmhVinArfLJ0QWpzgDShs2jHSR8,2714
62
+ novel_downloader/core/fetchers/registry.py,sha256=z9DDTUjc2r-Xiq3MqaPfV_3EmQBXr2TK_G8eARnblkA,1580
63
+ novel_downloader/core/fetchers/sfacg.py,sha256=V4GM51JhH0MQl0RBw06XHXoJ_lPNS_2rqcreNhKM0OQ,5150
64
+ novel_downloader/core/fetchers/shencou.py,sha256=Ygb5WRyZJUzq8ex7edvDJGbgdWeV2N8_0P-wPcfYqKc,3269
65
+ novel_downloader/core/fetchers/shuhaige.py,sha256=mBG1xBMtjkFjBwpuY7KjIieJYPxlEyjDknXrYYyHaHo,2471
66
+ novel_downloader/core/fetchers/tongrenquan.py,sha256=kkpfUoqjldaBtWA9Kk5sDBI_ul2h8l6-uvugo-qE-mg,2547
67
+ novel_downloader/core/fetchers/ttkan.py,sha256=inxXEETJlyy2aw3kl6Z8ww_Trwx36u4EZOCjJrDfGeU,2812
68
+ novel_downloader/core/fetchers/wanbengo.py,sha256=9Qva9bbrzDdQn3qjGiOEgCjtdGIWRG2zXC5gJYmSdzI,2461
69
+ novel_downloader/core/fetchers/xiaoshuowu.py,sha256=nVF-dikPOsx3WUnjhUXdEASsW_lJiN0TVOSBXRsL6JI,3310
70
+ novel_downloader/core/fetchers/xiguashuwu.py,sha256=e_Gv5_GYBbq1vVvv9QTc0Nmp61xi2My66NoYbSZGE_M,5783
71
+ novel_downloader/core/fetchers/xs63b.py,sha256=7qyJLpmJ2H5oQOSsLqD-QoZMCOKtZiylVxg2qO8aMno,5216
72
+ novel_downloader/core/fetchers/xshbook.py,sha256=jCkarSZ5bknYTrDnY9dieKfX29wKwvfUyFdjWE9SeXw,2538
73
+ novel_downloader/core/fetchers/yamibo.py,sha256=d5F6EKXZfKjWkMqPGQO6sXmU9ki79YOHN4wdGIO4rsU,7573
74
+ novel_downloader/core/fetchers/yibige.py,sha256=CJO26gMj_36XQMFVVnXDr8aoTQAqBA6A5HTOMmrrdUc,3569
75
+ novel_downloader/core/interfaces/__init__.py,sha256=YwDOPw_UCjuAE5u_LpUYxXjOH4X2kNMXrmUoBa5jp2Q,490
76
+ novel_downloader/core/interfaces/downloader.py,sha256=nGY2LYCCBzrKhs612L5tevGG8kJp_XfCyKvqjXEIeoI,1763
77
+ novel_downloader/core/interfaces/exporter.py,sha256=R62GPGzfGQu0B-7nu6y-PTnYF_TkrGir3XG19AW6jNE,1649
78
+ novel_downloader/core/interfaces/fetcher.py,sha256=XZ320Fi72nDORQKFUBbtybWmQ2ZoJ63gpVXBurodOrQ,3669
79
+ novel_downloader/core/interfaces/parser.py,sha256=NzpKjh-P2IwNE0BUmaEKU49qhPNbLhodZMCj2uSkOkg,1317
80
+ novel_downloader/core/interfaces/searcher.py,sha256=1orneqFtwcqM5sFBKmhpWFbHk5bV7oEp0mN_77lgy6E,587
81
+ novel_downloader/core/parsers/__init__.py,sha256=VfGEMS0PUQLkmc32xiz7l5rCPgzuy3Vz-1ZDxaYNp1Q,1927
82
+ novel_downloader/core/parsers/aaatxt.py,sha256=1NCrhbbpd5FUi0ybMX2LYf6Sss4pY3eDXTXk7MEkrkk,3633
83
+ novel_downloader/core/parsers/b520.py,sha256=SUiY1IYOZmu-tY-owbQHMKUyDFxwwOI6bgdjyNw_daM,3254
84
+ novel_downloader/core/parsers/base.py,sha256=tdq7MuNezN5xwZJ5DUYKUOki9hisPJ_wyt9LdG3ocVo,4634
85
+ novel_downloader/core/parsers/biquyuedu.py,sha256=IpZfL2AC0oUq5Gx8iqwTH8sItxtzpxvDRKaMmtYf_xU,3867
86
+ novel_downloader/core/parsers/dxmwx.py,sha256=uj3tj36d8lnXbgFvmpHzrvv9oDYuMXWZCb0d8I32GfA,5006
87
+ novel_downloader/core/parsers/eightnovel.py,sha256=Yw9tt24SsAe3Y6xyXVgo1EUAs36_twPhoF1toUZZjAc,7290
88
+ novel_downloader/core/parsers/esjzone.py,sha256=vGcziiCmrkJeNO0BUBrFJOKg83k4buvysqInUVIJXJ4,7958
89
+ novel_downloader/core/parsers/guidaye.py,sha256=o1d987B5hkCEIVHYhszSavwKJFAErZVwpDaUPkSNUh4,3879
90
+ novel_downloader/core/parsers/hetushu.py,sha256=WUG4E9lvDJsa_l1xezYt0epPPJ4V9y_C4wwqWB8sxJs,4047
91
+ novel_downloader/core/parsers/i25zw.py,sha256=qILX6HQifu0hLJDNFc7XCqUNSQpfALhVgPC9jEGQt4g,4221
92
+ novel_downloader/core/parsers/ixdzs8.py,sha256=IyT9xoiyzghRuHg9-VASdEkmj-OMrrOBDWhjRNNmrVg,5690
93
+ novel_downloader/core/parsers/jpxs123.py,sha256=YwZAayPe_N2HJvioKifb3TJmk_EMsaRnPlknCCxHmrA,4211
94
+ novel_downloader/core/parsers/lewenn.py,sha256=YNk1Jl8eHwFFAAn-NyB1t0cVTZgl-Gkyy1SjGnKYSAU,4225
95
+ novel_downloader/core/parsers/linovelib.py,sha256=7d4nw6XowcRLGA_BY9q_3tJ8o19JS6_qAIl2vJoVelg,7083
96
+ novel_downloader/core/parsers/piaotia.py,sha256=VGj10yVGzNK_TwUmo-5tVbCgbQA2FlJDv67m-KMxfIo,6086
97
+ novel_downloader/core/parsers/qbtr.py,sha256=0sae3Ms68Z7XaHav7_5Eid8sqlW1VBn0zZsy1WmVu64,4241
98
+ novel_downloader/core/parsers/qianbi.py,sha256=ULRLFE-bwnHU8Eifa7egD-cNk_-ea4vyFSCZwGAVTWM,4811
99
+ novel_downloader/core/parsers/quanben5.py,sha256=wr8QgIYk8FBcJBwm_wjXDdG0yMnodHHzBqnaPn1JETE,3075
100
+ novel_downloader/core/parsers/registry.py,sha256=2L6yRew4hxN04UUB4xm4E4v8R5RUldawF-Xkg8nXBPI,1534
101
+ novel_downloader/core/parsers/sfacg.py,sha256=7FuiLgN2SuDTkVmClQe4I8oU35RuLlPEEAHLSLEWqwk,5598
102
+ novel_downloader/core/parsers/shencou.py,sha256=pdkBCU7n6NmNs64cD6jfbDtEHNSuGqLOiQaIYhLeNr8,6775
103
+ novel_downloader/core/parsers/shuhaige.py,sha256=rlHXcpKil8anKMi6OVvoPAqGuQdA15hMLlCuSr6C5tM,3128
104
+ novel_downloader/core/parsers/tongrenquan.py,sha256=y3ok9g-BzA2YVM4KqoNPPpclE0wdNL5mVY3GRQ9FshM,3399
105
+ novel_downloader/core/parsers/ttkan.py,sha256=_8nc6diogbb9uGHm_lXYJT-RHR9p76o7ARn4NPom2-E,3564
106
+ novel_downloader/core/parsers/wanbengo.py,sha256=boEnK1gLLpqmf5EUFY9gVEhBxqxYrVka9ou_mDGZ4co,6407
107
+ novel_downloader/core/parsers/xiaoshuowu.py,sha256=k8j0TY5t7s0n1f-FWuRTZ-eN3A8p-_xnKy7-kp2deK4,5328
108
+ novel_downloader/core/parsers/xiguashuwu.py,sha256=i_CpFKjfcGviOjT3fveDvDsaMmxHub9MOrCbWRySbH8,14448
109
+ novel_downloader/core/parsers/xs63b.py,sha256=A02abnMtsnWTomx-Hcfr97HFnNO38X9mmqKxHKrS610,5312
110
+ novel_downloader/core/parsers/xshbook.py,sha256=WwIGXEBAY8h-MLeApB1oVko_g3HF1Uj0X-Hko3TTrJ8,3995
111
+ novel_downloader/core/parsers/yamibo.py,sha256=B2ijBHCS0JW0I387LH8gDjevwakOE0RRKaKRsV4zo7A,5018
112
+ novel_downloader/core/parsers/yibige.py,sha256=K_nQ1SwVKLndgzlRvoTd2wd0tWXKb-T02c0sE6-bS5M,4846
113
+ novel_downloader/core/parsers/qidian/__init__.py,sha256=ScY9penE8b1m5HZGu6C1XwbzuqKbeGVCvli0J-xzzKs,173
114
+ novel_downloader/core/parsers/qidian/book_info_parser.py,sha256=RTg6Z2jaLEUVJXKzcdxG1rqBdAhu_gmxsq0zcD9vyAE,3043
115
+ novel_downloader/core/parsers/qidian/chapter_encrypted.py,sha256=eTIOTwlu_7DiAkul58tPOOlCSxMymcSfr_m4AlnkEdU,15386
116
+ novel_downloader/core/parsers/qidian/chapter_normal.py,sha256=JitsHCz9FSvslAbFLPdtF0FNr5V311Uj7K0zq7MUDwA,3738
117
+ novel_downloader/core/parsers/qidian/chapter_router.py,sha256=foVMlWtE-qUOvJD_4EDiuAVaNkFdeV_ZTCvS5IL7Orc,1957
118
+ novel_downloader/core/parsers/qidian/main_parser.py,sha256=w6s9RkcatA34chyzi4buFKew4-bIexlSHAIR1zBGIxE,2754
119
+ novel_downloader/core/parsers/qidian/utils/__init__.py,sha256=FuV7f-h76sk1g5BaqWOhsgh9uTykXA7MZ97kmkOB_lY,664
120
+ novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py,sha256=idwsRx9Er5SRb3b_tmKwNxfOmUWR0QwpVf_zpDRJxuw,4687
121
+ novel_downloader/core/parsers/qidian/utils/fontmap_recover.py,sha256=kuEPRnGn4GHVh3uQ8u8sg55LUaYYuavftxO9gyAR3ZM,4918
122
+ novel_downloader/core/parsers/qidian/utils/helpers.py,sha256=_HAOWW3HHtq2FtYlYU1FIebZdRmCo1Rfmh_WC9p_ZLU,3325
123
+ novel_downloader/core/parsers/qidian/utils/node_decryptor.py,sha256=MQQUI9nNpM23K0sA9bRVhs7pbQX6OvMc1NgvM28gHsU,5949
124
+ novel_downloader/core/searchers/__init__.py,sha256=pCCK1rxfQP8djdsRnpxoVgANe6CTpbP7DNbNond_1P4,1379
125
+ novel_downloader/core/searchers/aaatxt.py,sha256=KHaX1dpDBaAJz-_7UlaTtnMbFlTplWHaFyOfCkn4gX4,3717
126
+ novel_downloader/core/searchers/b520.py,sha256=L2fkf1_LxUREdPJJXbSN5c00EXwWVeMwWpXKN144k9c,2621
127
+ novel_downloader/core/searchers/base.py,sha256=dwXF5KwU1GAnKo5BY5H6X5xkpDiP72KpGd4Q-dn9DFg,5166
128
+ novel_downloader/core/searchers/dxmwx.py,sha256=ZaeFSU2T3Yl9x6hquila7cF4wYdwm9d82cTjFT9byCQ,3225
129
+ novel_downloader/core/searchers/eightnovel.py,sha256=xJKPdAeyhNLn0U8Ip_DY0BJOiTT3s5ajBz0nh4SaKY0,2528
130
+ novel_downloader/core/searchers/esjzone.py,sha256=zw7bQalTfYjp9an0Ghk0ZDsWEOOh-fNsR4Lsoi4u7xA,3199
131
+ novel_downloader/core/searchers/hetushu.py,sha256=qhX6-QdvzPCXHh7hO6tHXFd3dpbcff_1PL7YvqgOQho,2829
132
+ novel_downloader/core/searchers/i25zw.py,sha256=1h3IZxjFO8XirDYN7x7fc96XjuspuTdkAUNHf1xVeBM,2827
133
+ novel_downloader/core/searchers/ixdzs8.py,sha256=Q-tZk5czA-wTSDQ4jnJEITfWWnsMXre5nPTjwJxGl6s,3454
134
+ novel_downloader/core/searchers/jpxs123.py,sha256=BeEa7wkE0KGwZ3HPIKSh7I8wpF_V8Z2L87eWjzphzwk,3345
135
+ novel_downloader/core/searchers/piaotia.py,sha256=dGueBh819EvxgL-cyBITud3DGXJhebhZkExVxcPcH6E,3510
136
+ novel_downloader/core/searchers/qbtr.py,sha256=yokdCqlhlfJYy6HDhMZS4nGNzHGYwTy36glXq_AlSDw,3231
137
+ novel_downloader/core/searchers/qianbi.py,sha256=UK7znw9RZkhpsDTy3_wavi3aBLnaLVUGd9E_Epq5c20,5404
138
+ novel_downloader/core/searchers/quanben5.py,sha256=xDKtDsZ8e4bhmA9rIG-cdIkbtnaUUxSxJRqZrad1u3g,4265
139
+ novel_downloader/core/searchers/registry.py,sha256=VFtvtbAqLBSYO7CvXrVya-85t-jOUmyth30wls-6noY,2441
140
+ novel_downloader/core/searchers/shuhaige.py,sha256=8XW39aIdyHzWwG8r_hsr7YhOEGQLLTIXObe2HlAW8D4,3841
141
+ novel_downloader/core/searchers/tongrenquan.py,sha256=NE0BN4gutipfBPMm5TJP3YyI29ce6ERpmC1mqfQNgdc,3471
142
+ novel_downloader/core/searchers/ttkan.py,sha256=Y-qjePD7zQx8RUgASTuz4yu5fzT5MOJg7Qh9_SaP1z0,2851
143
+ novel_downloader/core/searchers/xiaoshuowu.py,sha256=gAS3OpoMwfksEtlXPL5XPrfD7KVprl8YA7HGn3gGANg,4132
144
+ novel_downloader/core/searchers/xiguashuwu.py,sha256=YWxOQpXUhMMsgxt7zc51rtdbe6mn9yv5Vzeg63OCJlQ,2952
145
+ novel_downloader/core/searchers/xs63b.py,sha256=T4QUQphYFvnbnENxFbYVNtZMi2QhXypxOJU-FjjVYwU,3443
146
+ novel_downloader/locales/en.json,sha256=T0Apt75RC9Uua6quGckZPMzkh0XB3uy_JkXzRxwRllk,3948
147
+ novel_downloader/locales/zh.json,sha256=LU691ypbrR903ie2BKHLgI1U4G6_fYpT4kcztMYO5-8,3785
148
+ novel_downloader/models/__init__.py,sha256=U7ks1ieTm-VzmH3NcH0Fym7c1zfywIZcBGPOUBWuVLo,690
149
+ novel_downloader/models/book.py,sha256=kim6Tt0pDDvOhGx6jnRp28BP79yhhsyNiUp56I0cAP8,875
150
+ novel_downloader/models/config.py,sha256=QNiw1XhbzjAYbfLAZ1bTIQ21nciNxnYszGVtXVG3Uk0,2211
151
+ novel_downloader/models/login.py,sha256=VpTKfistRmlEJ67bzRpnAeQFBqs8R7VeGXZ74BZvTF0,355
152
+ novel_downloader/models/search.py,sha256=NSAXbQJvUY1Zdp1HfAt6JJ-mTFw2aX4-Je-JLeMG8ZY,351
153
+ novel_downloader/resources/config/settings.toml,sha256=uHgL5sUBPIz17Jwlc8WPQZ6Vn8PjatZ3OIiDaS0f-h8,3081
154
+ novel_downloader/resources/css_styles/intro.css,sha256=Nqzp-A5we92d90CCiGL8h2FeuMnCz-G0TLevMF_Pl2U,1271
155
+ novel_downloader/resources/css_styles/main.css,sha256=1nsDTr698eY3furWDHuQMDKP1Vqd2h5x40eJMZpktNE,559
156
+ novel_downloader/resources/images/volume_border.png,sha256=2dEVimnTHKOfLMhi7bhkh_5joWNnrqg8duomLSNOZx4,28613
157
+ novel_downloader/resources/js_scripts/qidian_decrypt_node.js,sha256=spNrk_gXI7pPW9abr4XGc2LASMe1UuN4BUe4cH24L8s,2195
158
+ novel_downloader/resources/json/linovelib_font_map.json,sha256=F1IlEcvXGcagnZCu4Gw2vQ2NLnhy6cJOLhabukqnftw,67854
159
+ novel_downloader/resources/json/xiguashuwu.json,sha256=AT8KSFBWuiHj4Ggz3O1LqED0Tw22k0A4-V4OziHbqfo,16471
160
+ novel_downloader/utils/__init__.py,sha256=Mu3FyLH_9wp7zHtIHfSTWvdNkXYzOAHYMoGMDJKk4cg,920
161
+ novel_downloader/utils/chapter_storage.py,sha256=2l5mRHYQd7rarBB4UeUo4Lwood-cqY0LHvXb2KPyFqQ,10365
162
+ novel_downloader/utils/constants.py,sha256=KeTL_MygD0VdvEUeDFaHuqITIzU_LdD5huNQHC7uCDM,3312
163
+ novel_downloader/utils/cookies.py,sha256=diWQj-cMvH7eT2P1X-lzGzsWLcfhaPW2wvMVnwCQwkQ,1735
164
+ novel_downloader/utils/fontocr.py,sha256=gaNH4isYY7zFE--gqtM1YN6bIjWTA-G-60XCAsbja8o,6494
165
+ novel_downloader/utils/i18n.py,sha256=86Wz4zT0_YTnmOSS6cliqO_uMgJJdfC-hNLyqZnXgvU,1050
166
+ novel_downloader/utils/logger.py,sha256=exOM7pUb8n_AchmIxLNlaZySqsMQjViL4KEMilZ8t04,3013
167
+ novel_downloader/utils/network.py,sha256=UzqK6xuQQfV4gFFbmNgy09L3QAlqX-CFeF6urfKRJyg,4675
168
+ novel_downloader/utils/state.py,sha256=QHfvS9CrO08fRZLNM0B_s0n5XIz7ap20NdAfesQI0Ek,1852
169
+ novel_downloader/utils/crypto_utils/__init__.py,sha256=33j0dezsuX3LhkfXj-FImEgU7G1IVmjjZW-4FrDDT0o,196
170
+ novel_downloader/utils/crypto_utils/aes_util.py,sha256=46vKY1CxEnHgJE9t2CRzsrGyUoLRjBysCJCeSF5AiqU,2878
171
+ novel_downloader/utils/crypto_utils/aes_v1.py,sha256=_jW86_WyUTJfOzqYbZ6QvNPF-V8YRaqaOsyLjMsO610,34247
172
+ novel_downloader/utils/crypto_utils/aes_v2.py,sha256=OAsMnsztkJilqo8jM6nkrPMyujPqgGhohd-TcwW6fVA,48945
173
+ novel_downloader/utils/crypto_utils/rc4.py,sha256=3h9PBLraTow7TGiV60jI3zh4ZQH2ohaizJ8LThB55Pk,1934
174
+ novel_downloader/utils/epub/__init__.py,sha256=SaygR4gIuUWhFxgmmSzv4unRMxNMZPyIX4x2-_26yvc,722
175
+ novel_downloader/utils/epub/builder.py,sha256=apuzG7UzYcEEreMpf9Dez06-laQQg6EGGvl3PQGpBFA,11664
176
+ novel_downloader/utils/epub/constants.py,sha256=3fjJIr-5msO1sV2hjYHBiUpEvm0mQm5AsUlMOR03O_M,3080
177
+ novel_downloader/utils/epub/documents.py,sha256=8IgznHBLzaLgzxWJCHGDM4QuE8JdEDI7T3zuA9IHAbE,9868
178
+ novel_downloader/utils/epub/models.py,sha256=x9la6RKmhOTUkcsLSzM7qzThmRbyWZxqaRf39kY6IPo,2479
179
+ novel_downloader/utils/epub/utils.py,sha256=Jg1Xjii6KMVNMKbp6IkWxbwq_ILaEpgqp2vHN8i7P40,5084
180
+ novel_downloader/utils/file_utils/__init__.py,sha256=PIE96UKkI73wNr5v8kbP159BIbkEwsOQa9iEFr5RGUw,366
181
+ novel_downloader/utils/file_utils/io.py,sha256=Q5s2p4-HIAEV1_PLrpmHkGuXGVYPWkKoHOwjRVgru-w,3397
182
+ novel_downloader/utils/file_utils/normalize.py,sha256=v0ZRGcuZ9KMj0GTgAMPCwSBnYkEz8LCnW5dJYjf_jQk,2023
183
+ novel_downloader/utils/file_utils/sanitize.py,sha256=2hoBAleu6n3VhL6IP1df2x0-7mLVAxg1ef6Ogg-ZLu4,1922
184
+ novel_downloader/utils/text_utils/__init__.py,sha256=cr0HCvgQFJE2ZEXqjkkmrOA7PnH50dKegrjdpIytUJs,601
185
+ novel_downloader/utils/text_utils/diff_display.py,sha256=5zvVtzsLbRxmUnn_dWUsXFaq6hch02OlOpqKYP8GB3g,2491
186
+ novel_downloader/utils/text_utils/numeric_conversion.py,sha256=RJ3L5GBxgNEQYJ7xFoihLVsjGcObBfpUAk_Gz5MxlkA,6627
187
+ novel_downloader/utils/text_utils/text_cleaner.py,sha256=9-Ymi6H9BDBv1Sjk2gE9fCG4G3A8Lut-n2sfAyeyH2I,6124
188
+ novel_downloader/utils/text_utils/truncate_utils.py,sha256=GeQCczW0jAHSeDMxx0qCRtnvT-CH1-KjqJq2JBpIv7U,1483
189
+ novel_downloader/utils/time_utils/__init__.py,sha256=XbBeSbpNqiJy7Lsv-_udz29hPnIY53F0Drbuh730y44,331
190
+ novel_downloader/utils/time_utils/datetime_utils.py,sha256=ECidI5yvWVia8BWWLu7U0O0YYMIKgJwzWQmOuA_un3U,4499
191
+ novel_downloader/utils/time_utils/sleep_utils.py,sha256=g31qs1Uyng8GBhyqrvMpxBK2Xqr054xDlA1g8X5cZhk,3062
192
+ novel_downloader/web/__init__.py,sha256=ga8qRQhYcGEiL0WKhSSyldLxkOEfrq-UU71T7MYv7EU,174
193
+ novel_downloader/web/main.py,sha256=p8iq5VejxuvcJsgM20qDahBsrxK4PeL96O7_65Fa3JI,1779
194
+ novel_downloader/web/components/__init__.py,sha256=fxBI7rpAQvdZU3obR6_-bFqgmA7nzvRpW05Rw3b4jp8,193
195
+ novel_downloader/web/components/navigation.py,sha256=m-rjbNRlYjqXsu2dq5PdCzpqy7oW6_otra2ZufRsh1c,1156
196
+ novel_downloader/web/pages/__init__.py,sha256=KP_aH8y8dtCeRze8jDJ4tC3Ft7UTGhlW8ZKDdKPdwcM,383
197
+ novel_downloader/web/pages/download.py,sha256=Qqq4GAZaiMRAuCjBvWiof6kwzSz0yrAj5LWN5EEldqo,2600
198
+ novel_downloader/web/pages/progress.py,sha256=whWduqLvQ1PPZpDNVfvFCVaFgFhD87LT4CDb8JuqD_w,5207
199
+ novel_downloader/web/pages/search.py,sha256=Tgy4XgMoD2tovkGvSj9mMWBzWtO_FUGQATHEpzCSgx0,10235
200
+ novel_downloader/web/services/__init__.py,sha256=kLW0uyqudnlHtSsMrrghmL6P1-VDrseggNdB3cR5jLA,316
201
+ novel_downloader/web/services/client_dialog.py,sha256=JwYV8bjxPxLQsuheC8rk_jaeODolz5X9Wo64MsXZoyc,5679
202
+ novel_downloader/web/services/cred_broker.py,sha256=_R2Szqg5qRBHrFujTlPxrrMpQsnfNozjLUxJ5HhD8_c,2939
203
+ novel_downloader/web/services/cred_models.py,sha256=8nXbVoAIz3QokctrCVm-8lSnKgCIFhMM6TuaNq6bFGU,846
204
+ novel_downloader/web/services/task_manager.py,sha256=V6Pp92ZB9aNlliZbdwcaNUojioY1_BGAMGCo9Okob7w,8624
205
+ novel_downloader-2.0.0.dist-info/licenses/LICENSE,sha256=XgmnH0mBf-qEiizoVAfJQAKzPB9y3rBa-ni7M0Aqv4A,1066
206
+ novel_downloader-2.0.0.dist-info/METADATA,sha256=V1Xc8HvvlY-J2S6aqP2Hll5vVxZs3aUwrPVQXOGsXV0,6454
207
+ novel_downloader-2.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
208
+ novel_downloader-2.0.0.dist-info/entry_points.txt,sha256=nIgnurS4J6_ce3oIBFV87I1pPwBofuRQvxkoRGn4yEU,112
209
+ novel_downloader-2.0.0.dist-info/top_level.txt,sha256=hP4jYWM2LTm1jxsW4hqEB8N0dsRvldO2QdhggJT917I,17
210
+ novel_downloader-2.0.0.dist-info/RECORD,,
@@ -1,3 +1,3 @@
1
1
  [console_scripts]
2
2
  novel-cli = novel_downloader.cli.main:cli_main
3
- novel-tui = novel_downloader.tui.main:tui_main
3
+ novel-web = novel_downloader.web.main:web_main
@@ -1,94 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.config.site_rules
4
- ----------------------------------
5
-
6
- Handles loading, saving, and caching of site-specific scraping rules.
7
-
8
- This module provides functionality to:
9
- - Load site rules from JSON, YAML, or TOML formats.
10
- - Save rules into a standard JSON format.
11
- """
12
-
13
- import json
14
- import logging
15
- from pathlib import Path
16
-
17
- from novel_downloader.models import SiteRulesDict
18
- from novel_downloader.utils.cache import cached_load_config
19
- from novel_downloader.utils.constants import SITE_RULES_FILE
20
- from novel_downloader.utils.file_utils import save_as_json
21
-
22
- logger = logging.getLogger(__name__)
23
-
24
-
25
- def save_rules_as_json(
26
- source_path: str | Path, output_path: str | Path = SITE_RULES_FILE
27
- ) -> None:
28
- """
29
- Load rules from source_path (toml, yaml, or json) and save as JSON.
30
-
31
- :param source_path: Path to the source rules file
32
- (supports .toml, .yaml, .yml, .json).
33
- :param output_path: Path where the JSON output will be saved.
34
- Defaults to SITE_RULES_FILE.
35
- :raises FileNotFoundError: If the source_path does not exist.
36
- :raises ValueError: If the source file format is not supported.
37
- :raises Exception: If file loading or saving fails.
38
- """
39
- TAG = "[Config]"
40
- source_path = Path(source_path)
41
- output_path = Path(output_path)
42
-
43
- if not source_path.exists():
44
- raise FileNotFoundError(f"Source file {source_path} not found.")
45
-
46
- suffix = source_path.suffix.lower()
47
-
48
- logger.debug("%s Loading rules from %s (format: %s)", TAG, source_path, suffix)
49
-
50
- try:
51
- if suffix == ".toml":
52
- import tomllib
53
-
54
- with source_path.open("rb") as f:
55
- rules_data = tomllib.load(f)
56
- elif suffix in {".yaml", ".yml"}:
57
- import yaml
58
-
59
- with source_path.open("r", encoding="utf-8") as f:
60
- rules_data = yaml.safe_load(f)
61
- elif suffix == ".json":
62
- with source_path.open("r", encoding="utf-8") as f:
63
- rules_data = json.load(f)
64
- else:
65
- raise ValueError(f"Unsupported input format: {suffix}")
66
-
67
- except Exception as e:
68
- logger.error("%s Failed to load rules from %s: %s", TAG, source_path, str(e))
69
- raise
70
-
71
- logger.info("%s Saving rules to %s as JSON", TAG, output_path)
72
-
73
- save_as_json(rules_data, output_path)
74
- return
75
-
76
-
77
- @cached_load_config
78
- def load_site_rules(json_path: str | Path = SITE_RULES_FILE) -> SiteRulesDict:
79
- """
80
- Loads site scraping rules from a JSON file and caches the result for future access.
81
-
82
- :param json_path: Path to the site rules JSON file. Defaults to SITE_RULES_FILE.
83
- :return: A dictionary containing all site-specific scraping rules.
84
- """
85
- json_path = Path(json_path)
86
- site_rules: SiteRulesDict = {}
87
-
88
- if not json_path.exists():
89
- return site_rules
90
-
91
- with json_path.open("r", encoding="utf-8") as f:
92
- site_rules = json.load(f)
93
-
94
- return site_rules
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.downloaders.biquge
4
- ----------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.core.downloaders.common import CommonDownloader
9
- from novel_downloader.core.interfaces import (
10
- FetcherProtocol,
11
- ParserProtocol,
12
- )
13
- from novel_downloader.models import DownloaderConfig
14
-
15
-
16
- class BiqugeDownloader(CommonDownloader):
17
- """"""
18
-
19
- def __init__(
20
- self,
21
- fetcher: FetcherProtocol,
22
- parser: ParserProtocol,
23
- config: DownloaderConfig,
24
- ):
25
- super().__init__(fetcher, parser, config, "biquge")
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.downloaders.esjzone
4
- -----------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.core.downloaders.common import CommonDownloader
9
- from novel_downloader.core.interfaces import (
10
- FetcherProtocol,
11
- ParserProtocol,
12
- )
13
- from novel_downloader.models import DownloaderConfig
14
-
15
-
16
- class EsjzoneDownloader(CommonDownloader):
17
- """"""
18
-
19
- def __init__(
20
- self,
21
- fetcher: FetcherProtocol,
22
- parser: ParserProtocol,
23
- config: DownloaderConfig,
24
- ):
25
- super().__init__(fetcher, parser, config, "esjzone")
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.downloaders.linovelib
4
- -------------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.core.downloaders.common import CommonDownloader
9
- from novel_downloader.core.interfaces import (
10
- FetcherProtocol,
11
- ParserProtocol,
12
- )
13
- from novel_downloader.models import DownloaderConfig
14
-
15
-
16
- class LinovelibDownloader(CommonDownloader):
17
- """"""
18
-
19
- def __init__(
20
- self,
21
- fetcher: FetcherProtocol,
22
- parser: ParserProtocol,
23
- config: DownloaderConfig,
24
- ):
25
- super().__init__(fetcher, parser, config, "linovelib")
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.downloaders.sfacg
4
- ---------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.core.downloaders.common import CommonDownloader
9
- from novel_downloader.core.interfaces import (
10
- FetcherProtocol,
11
- ParserProtocol,
12
- )
13
- from novel_downloader.models import DownloaderConfig
14
-
15
-
16
- class SfacgDownloader(CommonDownloader):
17
- """"""
18
-
19
- def __init__(
20
- self,
21
- fetcher: FetcherProtocol,
22
- parser: ParserProtocol,
23
- config: DownloaderConfig,
24
- ):
25
- super().__init__(fetcher, parser, config, "sfacg")
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.downloaders.yamibo
4
- ----------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.core.downloaders.common import CommonDownloader
9
- from novel_downloader.core.interfaces import (
10
- FetcherProtocol,
11
- ParserProtocol,
12
- )
13
- from novel_downloader.models import DownloaderConfig
14
-
15
-
16
- class YamiboDownloader(CommonDownloader):
17
- """"""
18
-
19
- def __init__(
20
- self,
21
- fetcher: FetcherProtocol,
22
- parser: ParserProtocol,
23
- config: DownloaderConfig,
24
- ):
25
- super().__init__(fetcher, parser, config, "yamibo")
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.exporters.biquge
4
- --------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.models import ExporterConfig
9
-
10
- from .common import CommonExporter
11
-
12
-
13
- class BiqugeExporter(CommonExporter):
14
- def __init__(
15
- self,
16
- config: ExporterConfig,
17
- ):
18
- super().__init__(
19
- config,
20
- site="biquge",
21
- chap_folders=["chapters"],
22
- )
23
-
24
-
25
- __all__ = ["BiqugeExporter"]