novel-downloader 1.5.0__tar.gz → 2.0.1__tar.gz

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 (293) hide show
  1. novel_downloader-2.0.1/PKG-INFO +172 -0
  2. novel_downloader-2.0.1/README.md +105 -0
  3. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/pyproject.toml +15 -20
  4. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/__init__.py +1 -1
  5. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/cli/__init__.py +1 -3
  6. novel_downloader-2.0.1/src/novel_downloader/cli/clean.py +78 -0
  7. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/cli/config.py +26 -21
  8. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/cli/download.py +79 -66
  9. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/cli/export.py +17 -21
  10. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/cli/main.py +1 -1
  11. novel_downloader-2.0.1/src/novel_downloader/cli/search.py +120 -0
  12. novel_downloader-2.0.1/src/novel_downloader/cli/ui.py +156 -0
  13. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/config/__init__.py +8 -5
  14. novel_downloader-2.0.1/src/novel_downloader/config/adapter.py +357 -0
  15. novel_downloader-1.5.0/src/novel_downloader/config/loader.py → novel_downloader-2.0.1/src/novel_downloader/config/file_io.py +53 -26
  16. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/__init__.py +5 -5
  17. novel_downloader-2.0.1/src/novel_downloader/core/archived/deqixs/fetcher.py +115 -0
  18. novel_downloader-2.0.1/src/novel_downloader/core/archived/deqixs/parser.py +132 -0
  19. novel_downloader-2.0.1/src/novel_downloader/core/archived/deqixs/searcher.py +89 -0
  20. novel_downloader-1.5.0/src/novel_downloader/core/searchers/qidian.py → novel_downloader-2.0.1/src/novel_downloader/core/archived/qidian/searcher.py +12 -20
  21. novel_downloader-2.0.1/src/novel_downloader/core/archived/wanbengo/searcher.py +98 -0
  22. novel_downloader-2.0.1/src/novel_downloader/core/archived/xshbook/searcher.py +93 -0
  23. novel_downloader-2.0.1/src/novel_downloader/core/downloaders/__init__.py +19 -0
  24. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/downloaders/base.py +49 -23
  25. novel_downloader-2.0.1/src/novel_downloader/core/downloaders/common.py +281 -0
  26. novel_downloader-2.0.1/src/novel_downloader/core/downloaders/qianbi.py +353 -0
  27. novel_downloader-2.0.1/src/novel_downloader/core/downloaders/qidian.py +336 -0
  28. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/downloaders/registry.py +4 -2
  29. novel_downloader-2.0.1/src/novel_downloader/core/downloaders/signals.py +46 -0
  30. novel_downloader-2.0.1/src/novel_downloader/core/exporters/__init__.py +19 -0
  31. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/base.py +33 -37
  32. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/common/__init__.py +1 -2
  33. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/common/epub.py +15 -10
  34. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/common/main_exporter.py +19 -12
  35. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/common/txt.py +17 -12
  36. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/epub_util.py +59 -29
  37. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/linovelib/__init__.py +1 -0
  38. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/linovelib/epub.py +23 -25
  39. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/linovelib/main_exporter.py +8 -12
  40. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/linovelib/txt.py +20 -14
  41. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/qidian.py +2 -8
  42. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/registry.py +4 -2
  43. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/exporters/txt_util.py +7 -7
  44. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/__init__.py +73 -0
  45. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/aaatxt.py +83 -0
  46. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/biquge/session.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/b520.py +6 -11
  47. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/base/session.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/base.py +37 -46
  48. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/biquge/browser.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/biquyuedu.py +12 -17
  49. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/dxmwx.py +110 -0
  50. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/eightnovel.py +139 -0
  51. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/esjzone/session.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/esjzone.py +19 -12
  52. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/guidaye.py +85 -0
  53. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/hetushu.py +92 -0
  54. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qianbi/browser.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/i25zw.py +19 -28
  55. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/ixdzs8.py +113 -0
  56. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/jpxs123.py +101 -0
  57. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/lewenn.py +83 -0
  58. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/linovelib/session.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/linovelib.py +12 -13
  59. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/piaotia.py +105 -0
  60. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/qbtr.py +101 -0
  61. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qianbi/session.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/qianbi.py +5 -10
  62. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qidian/session.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/qidian.py +56 -64
  63. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/quanben5.py +92 -0
  64. {novel_downloader-1.5.0/src/novel_downloader/core/fetchers/base → novel_downloader-2.0.1/src/novel_downloader/core/fetchers}/rate_limiter.py +2 -2
  65. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/fetchers/registry.py +5 -16
  66. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/sfacg/session.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/sfacg.py +7 -10
  67. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/shencou.py +106 -0
  68. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/shuhaige.py +84 -0
  69. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/tongrenquan.py +84 -0
  70. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/ttkan.py +95 -0
  71. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/wanbengo.py +83 -0
  72. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/xiaoshuowu.py +106 -0
  73. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/xiguashuwu.py +177 -0
  74. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/xs63b.py +171 -0
  75. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/xshbook.py +85 -0
  76. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/yamibo/session.py → novel_downloader-2.0.1/src/novel_downloader/core/fetchers/yamibo.py +19 -12
  77. novel_downloader-2.0.1/src/novel_downloader/core/fetchers/yibige.py +114 -0
  78. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/interfaces/__init__.py +1 -9
  79. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/interfaces/downloader.py +6 -2
  80. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/interfaces/exporter.py +7 -7
  81. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/interfaces/fetcher.py +6 -19
  82. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/interfaces/parser.py +7 -8
  83. novel_downloader-2.0.1/src/novel_downloader/core/interfaces/searcher.py +26 -0
  84. novel_downloader-2.0.1/src/novel_downloader/core/parsers/__init__.py +74 -0
  85. novel_downloader-2.0.1/src/novel_downloader/core/parsers/aaatxt.py +132 -0
  86. novel_downloader-2.0.1/src/novel_downloader/core/parsers/b520.py +116 -0
  87. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/parsers/base.py +64 -12
  88. novel_downloader-2.0.1/src/novel_downloader/core/parsers/biquyuedu.py +133 -0
  89. novel_downloader-2.0.1/src/novel_downloader/core/parsers/dxmwx.py +162 -0
  90. novel_downloader-2.0.1/src/novel_downloader/core/parsers/eightnovel.py +224 -0
  91. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/parsers/esjzone.py +64 -69
  92. novel_downloader-2.0.1/src/novel_downloader/core/parsers/guidaye.py +128 -0
  93. novel_downloader-2.0.1/src/novel_downloader/core/parsers/hetushu.py +139 -0
  94. novel_downloader-2.0.1/src/novel_downloader/core/parsers/i25zw.py +137 -0
  95. novel_downloader-2.0.1/src/novel_downloader/core/parsers/ixdzs8.py +186 -0
  96. novel_downloader-2.0.1/src/novel_downloader/core/parsers/jpxs123.py +137 -0
  97. novel_downloader-2.0.1/src/novel_downloader/core/parsers/lewenn.py +142 -0
  98. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/parsers/linovelib.py +48 -64
  99. novel_downloader-2.0.1/src/novel_downloader/core/parsers/piaotia.py +189 -0
  100. novel_downloader-2.0.1/src/novel_downloader/core/parsers/qbtr.py +136 -0
  101. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/parsers/qianbi.py +48 -50
  102. novel_downloader-2.0.1/src/novel_downloader/core/parsers/qidian/main_parser.py +836 -0
  103. novel_downloader-2.0.1/src/novel_downloader/core/parsers/qidian/utils/__init__.py +11 -0
  104. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py +1 -1
  105. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/parsers/qidian/utils/node_decryptor.py +4 -4
  106. novel_downloader-2.0.1/src/novel_downloader/core/parsers/quanben5.py +103 -0
  107. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/parsers/registry.py +5 -16
  108. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/parsers/sfacg.py +38 -45
  109. novel_downloader-2.0.1/src/novel_downloader/core/parsers/shencou.py +215 -0
  110. novel_downloader-2.0.1/src/novel_downloader/core/parsers/shuhaige.py +111 -0
  111. novel_downloader-2.0.1/src/novel_downloader/core/parsers/tongrenquan.py +116 -0
  112. novel_downloader-2.0.1/src/novel_downloader/core/parsers/ttkan.py +132 -0
  113. novel_downloader-2.0.1/src/novel_downloader/core/parsers/wanbengo.py +191 -0
  114. novel_downloader-2.0.1/src/novel_downloader/core/parsers/xiaoshuowu.py +173 -0
  115. novel_downloader-2.0.1/src/novel_downloader/core/parsers/xiguashuwu.py +429 -0
  116. novel_downloader-2.0.1/src/novel_downloader/core/parsers/xs63b.py +161 -0
  117. novel_downloader-2.0.1/src/novel_downloader/core/parsers/xshbook.py +134 -0
  118. novel_downloader-2.0.1/src/novel_downloader/core/parsers/yamibo.py +155 -0
  119. novel_downloader-2.0.1/src/novel_downloader/core/parsers/yibige.py +166 -0
  120. novel_downloader-2.0.1/src/novel_downloader/core/searchers/__init__.py +51 -0
  121. novel_downloader-2.0.1/src/novel_downloader/core/searchers/aaatxt.py +107 -0
  122. novel_downloader-1.5.0/src/novel_downloader/core/searchers/biquge.py → novel_downloader-2.0.1/src/novel_downloader/core/searchers/b520.py +29 -28
  123. novel_downloader-2.0.1/src/novel_downloader/core/searchers/base.py +168 -0
  124. novel_downloader-2.0.1/src/novel_downloader/core/searchers/dxmwx.py +105 -0
  125. novel_downloader-2.0.1/src/novel_downloader/core/searchers/eightnovel.py +84 -0
  126. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/searchers/esjzone.py +43 -25
  127. novel_downloader-2.0.1/src/novel_downloader/core/searchers/hetushu.py +92 -0
  128. novel_downloader-2.0.1/src/novel_downloader/core/searchers/i25zw.py +93 -0
  129. novel_downloader-2.0.1/src/novel_downloader/core/searchers/ixdzs8.py +107 -0
  130. novel_downloader-2.0.1/src/novel_downloader/core/searchers/jpxs123.py +107 -0
  131. novel_downloader-2.0.1/src/novel_downloader/core/searchers/piaotia.py +100 -0
  132. novel_downloader-2.0.1/src/novel_downloader/core/searchers/qbtr.py +106 -0
  133. novel_downloader-2.0.1/src/novel_downloader/core/searchers/qianbi.py +165 -0
  134. novel_downloader-2.0.1/src/novel_downloader/core/searchers/quanben5.py +144 -0
  135. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/searchers/registry.py +24 -8
  136. novel_downloader-2.0.1/src/novel_downloader/core/searchers/shuhaige.py +124 -0
  137. novel_downloader-2.0.1/src/novel_downloader/core/searchers/tongrenquan.py +110 -0
  138. novel_downloader-2.0.1/src/novel_downloader/core/searchers/ttkan.py +92 -0
  139. novel_downloader-2.0.1/src/novel_downloader/core/searchers/xiaoshuowu.py +122 -0
  140. novel_downloader-2.0.1/src/novel_downloader/core/searchers/xiguashuwu.py +95 -0
  141. novel_downloader-2.0.1/src/novel_downloader/core/searchers/xs63b.py +104 -0
  142. novel_downloader-2.0.1/src/novel_downloader/locales/en.json +75 -0
  143. novel_downloader-2.0.1/src/novel_downloader/locales/zh.json +75 -0
  144. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/models/__init__.py +21 -22
  145. novel_downloader-2.0.1/src/novel_downloader/models/book.py +44 -0
  146. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/models/config.py +4 -37
  147. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/models/login.py +1 -1
  148. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/models/search.py +5 -0
  149. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/resources/config/settings.toml +8 -70
  150. novel_downloader-2.0.1/src/novel_downloader/resources/json/xiguashuwu.json +718 -0
  151. novel_downloader-2.0.1/src/novel_downloader/utils/__init__.py +47 -0
  152. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/chapter_storage.py +5 -5
  153. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/constants.py +4 -31
  154. novel_downloader-2.0.1/src/novel_downloader/utils/cookies.py +69 -0
  155. novel_downloader-2.0.1/src/novel_downloader/utils/crypto_utils/__init__.py +7 -0
  156. novel_downloader-2.0.1/src/novel_downloader/utils/crypto_utils/aes_util.py +90 -0
  157. novel_downloader-2.0.1/src/novel_downloader/utils/crypto_utils/aes_v1.py +619 -0
  158. novel_downloader-2.0.1/src/novel_downloader/utils/crypto_utils/aes_v2.py +1143 -0
  159. novel_downloader-2.0.1/src/novel_downloader/utils/crypto_utils/rc4.py +54 -0
  160. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/epub/__init__.py +3 -4
  161. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/epub/builder.py +6 -6
  162. novel_downloader-2.0.1/src/novel_downloader/utils/epub/constants.py +118 -0
  163. novel_downloader-2.0.1/src/novel_downloader/utils/epub/documents.py +297 -0
  164. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/epub/models.py +8 -22
  165. novel_downloader-2.0.1/src/novel_downloader/utils/epub/utils.py +179 -0
  166. novel_downloader-2.0.1/src/novel_downloader/utils/file_utils/__init__.py +17 -0
  167. novel_downloader-2.0.1/src/novel_downloader/utils/file_utils/io.py +81 -0
  168. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/file_utils/normalize.py +1 -7
  169. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/file_utils/sanitize.py +4 -15
  170. novel_downloader-2.0.1/src/novel_downloader/utils/fontocr/__init__.py +13 -0
  171. novel_downloader-2.0.1/src/novel_downloader/utils/fontocr/core.py +216 -0
  172. novel_downloader-2.0.1/src/novel_downloader/utils/fontocr/loader.py +50 -0
  173. novel_downloader-2.0.1/src/novel_downloader/utils/logger.py +120 -0
  174. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/network.py +17 -41
  175. novel_downloader-2.0.1/src/novel_downloader/utils/state.py +70 -0
  176. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/text_utils/__init__.py +1 -7
  177. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/text_utils/diff_display.py +5 -7
  178. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/text_utils/text_cleaner.py +39 -30
  179. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/text_utils/truncate_utils.py +3 -14
  180. novel_downloader-2.0.1/src/novel_downloader/utils/time_utils/__init__.py +16 -0
  181. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/time_utils/datetime_utils.py +20 -29
  182. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/time_utils/sleep_utils.py +55 -49
  183. novel_downloader-2.0.1/src/novel_downloader/web/__init__.py +13 -0
  184. novel_downloader-2.0.1/src/novel_downloader/web/components/__init__.py +11 -0
  185. novel_downloader-2.0.1/src/novel_downloader/web/components/navigation.py +35 -0
  186. novel_downloader-2.0.1/src/novel_downloader/web/main.py +66 -0
  187. novel_downloader-2.0.1/src/novel_downloader/web/pages/__init__.py +17 -0
  188. novel_downloader-2.0.1/src/novel_downloader/web/pages/download.py +78 -0
  189. novel_downloader-2.0.1/src/novel_downloader/web/pages/progress.py +147 -0
  190. novel_downloader-2.0.1/src/novel_downloader/web/pages/search.py +329 -0
  191. novel_downloader-2.0.1/src/novel_downloader/web/services/__init__.py +17 -0
  192. novel_downloader-2.0.1/src/novel_downloader/web/services/client_dialog.py +164 -0
  193. novel_downloader-2.0.1/src/novel_downloader/web/services/cred_broker.py +113 -0
  194. novel_downloader-2.0.1/src/novel_downloader/web/services/cred_models.py +35 -0
  195. novel_downloader-2.0.1/src/novel_downloader/web/services/task_manager.py +264 -0
  196. novel_downloader-2.0.1/src/novel_downloader.egg-info/PKG-INFO +172 -0
  197. novel_downloader-2.0.1/src/novel_downloader.egg-info/SOURCES.txt +209 -0
  198. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader.egg-info/entry_points.txt +1 -1
  199. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader.egg-info/requires.txt +3 -7
  200. novel_downloader-1.5.0/PKG-INFO +0 -196
  201. novel_downloader-1.5.0/README.md +0 -125
  202. novel_downloader-1.5.0/src/novel_downloader/cli/clean.py +0 -145
  203. novel_downloader-1.5.0/src/novel_downloader/cli/search.py +0 -123
  204. novel_downloader-1.5.0/src/novel_downloader/config/adapter.py +0 -360
  205. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/__init__.py +0 -40
  206. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/biquge.py +0 -29
  207. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/common.py +0 -227
  208. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/esjzone.py +0 -29
  209. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/linovelib.py +0 -29
  210. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/qianbi.py +0 -312
  211. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/qidian.py +0 -290
  212. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/sfacg.py +0 -29
  213. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/yamibo.py +0 -29
  214. novel_downloader-1.5.0/src/novel_downloader/core/exporters/__init__.py +0 -36
  215. novel_downloader-1.5.0/src/novel_downloader/core/exporters/biquge.py +0 -22
  216. novel_downloader-1.5.0/src/novel_downloader/core/exporters/esjzone.py +0 -22
  217. novel_downloader-1.5.0/src/novel_downloader/core/exporters/qianbi.py +0 -22
  218. novel_downloader-1.5.0/src/novel_downloader/core/exporters/sfacg.py +0 -22
  219. novel_downloader-1.5.0/src/novel_downloader/core/exporters/yamibo.py +0 -22
  220. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/__init__.py +0 -67
  221. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/base/__init__.py +0 -14
  222. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/base/browser.py +0 -422
  223. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/biquge/__init__.py +0 -14
  224. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/esjzone/__init__.py +0 -14
  225. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/esjzone/browser.py +0 -209
  226. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/linovelib/__init__.py +0 -14
  227. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/linovelib/browser.py +0 -198
  228. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qianbi/__init__.py +0 -14
  229. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qidian/__init__.py +0 -14
  230. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qidian/browser.py +0 -326
  231. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/sfacg/__init__.py +0 -14
  232. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/sfacg/browser.py +0 -194
  233. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/yamibo/__init__.py +0 -14
  234. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/yamibo/browser.py +0 -234
  235. novel_downloader-1.5.0/src/novel_downloader/core/interfaces/searcher.py +0 -18
  236. novel_downloader-1.5.0/src/novel_downloader/core/parsers/__init__.py +0 -37
  237. novel_downloader-1.5.0/src/novel_downloader/core/parsers/biquge.py +0 -139
  238. novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/book_info_parser.py +0 -90
  239. novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/chapter_encrypted.py +0 -528
  240. novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/chapter_normal.py +0 -157
  241. novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/chapter_router.py +0 -68
  242. novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/main_parser.py +0 -128
  243. novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/utils/__init__.py +0 -29
  244. novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/utils/helpers.py +0 -114
  245. novel_downloader-1.5.0/src/novel_downloader/core/parsers/yamibo.py +0 -199
  246. novel_downloader-1.5.0/src/novel_downloader/core/searchers/__init__.py +0 -20
  247. novel_downloader-1.5.0/src/novel_downloader/core/searchers/base.py +0 -92
  248. novel_downloader-1.5.0/src/novel_downloader/core/searchers/qianbi.py +0 -131
  249. novel_downloader-1.5.0/src/novel_downloader/locales/en.json +0 -126
  250. novel_downloader-1.5.0/src/novel_downloader/locales/zh.json +0 -126
  251. novel_downloader-1.5.0/src/novel_downloader/models/chapter.py +0 -25
  252. novel_downloader-1.5.0/src/novel_downloader/models/types.py +0 -13
  253. novel_downloader-1.5.0/src/novel_downloader/tui/__init__.py +0 -7
  254. novel_downloader-1.5.0/src/novel_downloader/tui/app.py +0 -32
  255. novel_downloader-1.5.0/src/novel_downloader/tui/main.py +0 -17
  256. novel_downloader-1.5.0/src/novel_downloader/tui/screens/__init__.py +0 -14
  257. novel_downloader-1.5.0/src/novel_downloader/tui/screens/home.py +0 -198
  258. novel_downloader-1.5.0/src/novel_downloader/tui/screens/login.py +0 -74
  259. novel_downloader-1.5.0/src/novel_downloader/tui/styles/home_layout.tcss +0 -79
  260. novel_downloader-1.5.0/src/novel_downloader/tui/widgets/richlog_handler.py +0 -24
  261. novel_downloader-1.5.0/src/novel_downloader/utils/__init__.py +0 -58
  262. novel_downloader-1.5.0/src/novel_downloader/utils/cache.py +0 -24
  263. novel_downloader-1.5.0/src/novel_downloader/utils/cookies.py +0 -66
  264. novel_downloader-1.5.0/src/novel_downloader/utils/crypto_utils.py +0 -71
  265. novel_downloader-1.5.0/src/novel_downloader/utils/epub/constants.py +0 -77
  266. novel_downloader-1.5.0/src/novel_downloader/utils/epub/documents.py +0 -403
  267. novel_downloader-1.5.0/src/novel_downloader/utils/epub/utils.py +0 -212
  268. novel_downloader-1.5.0/src/novel_downloader/utils/file_utils/__init__.py +0 -38
  269. novel_downloader-1.5.0/src/novel_downloader/utils/file_utils/io.py +0 -216
  270. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/__init__.py +0 -22
  271. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/hash_store.py +0 -280
  272. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/hash_utils.py +0 -103
  273. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/model_loader.py +0 -69
  274. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/ocr_v1.py +0 -315
  275. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/ocr_v2.py +0 -764
  276. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/ocr_v3.py +0 -744
  277. novel_downloader-1.5.0/src/novel_downloader/utils/logger.py +0 -104
  278. novel_downloader-1.5.0/src/novel_downloader/utils/state.py +0 -156
  279. novel_downloader-1.5.0/src/novel_downloader/utils/time_utils/__init__.py +0 -22
  280. novel_downloader-1.5.0/src/novel_downloader.egg-info/PKG-INFO +0 -196
  281. novel_downloader-1.5.0/src/novel_downloader.egg-info/SOURCES.txt +0 -167
  282. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/LICENSE +0 -0
  283. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/setup.cfg +0 -0
  284. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/core/parsers/qidian/__init__.py +0 -0
  285. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/resources/css_styles/intro.css +0 -0
  286. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/resources/css_styles/main.css +0 -0
  287. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/resources/images/volume_border.png +0 -0
  288. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/resources/js_scripts/qidian_decrypt_node.js +0 -0
  289. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/resources/json/linovelib_font_map.json +0 -0
  290. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/i18n.py +0 -0
  291. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader/utils/text_utils/numeric_conversion.py +0 -0
  292. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader.egg-info/dependency_links.txt +0 -0
  293. {novel_downloader-1.5.0 → novel_downloader-2.0.1}/src/novel_downloader.egg-info/top_level.txt +0 -0
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: novel-downloader
3
+ Version: 2.0.1
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: brotli; extra == "font-recovery"
51
+ Requires-Dist: numpy; extra == "font-recovery"
52
+ Requires-Dist: fonttools; extra == "font-recovery"
53
+ Requires-Dist: pillow; extra == "font-recovery"
54
+ Provides-Extra: dev
55
+ Requires-Dist: black; extra == "dev"
56
+ Requires-Dist: mypy; extra == "dev"
57
+ Requires-Dist: ruff; extra == "dev"
58
+ Requires-Dist: pytest; extra == "dev"
59
+ Requires-Dist: pytest-cov; extra == "dev"
60
+ Requires-Dist: pytest-mock; extra == "dev"
61
+ Requires-Dist: types-requests; extra == "dev"
62
+ Requires-Dist: types-lxml; extra == "dev"
63
+ Requires-Dist: types-PyYAML; extra == "dev"
64
+ Requires-Dist: pre-commit; extra == "dev"
65
+ Requires-Dist: commitizen; extra == "dev"
66
+ Dynamic: license-file
67
+
68
+ # novel-downloader
69
+
70
+ 基于 [aiohttp](https://github.com/aio-libs/aiohttp) 的异步小说下载工具 / 库。支持断点续传、广告过滤与 TXT/EPUB 导出, 提供 CLI 与 Web 图形界面。
71
+
72
+ > 运行要求: **Python 3.11+** (开发环境: Python 3.12)
73
+
74
+ ## 功能特性
75
+
76
+ * **可恢复下载**: 运行时自动检测本地已完成的部分, 跳过已下载内容
77
+ * **多格式导出**: 合并所有章节为
78
+ * `TXT`
79
+ * `EPUB` (可选打包章节插图)
80
+ * **广告/活动过滤**:
81
+ * [x] 章节标题过滤
82
+ * [x] 章节正文过滤
83
+ * **可选字体混淆还原**: `decode_font`
84
+ * **双形态使用**: 命令行 (CLI) 与 Web 图形界面 (GUI)
85
+
86
+ ---
87
+
88
+ ## 安装
89
+
90
+ 使用 `pip` 安装稳定版:
91
+
92
+ ```bash
93
+ pip install novel-downloader
94
+ ```
95
+
96
+ 启用字体解密功能 (`decode_font`):
97
+
98
+ ```bash
99
+ pip install "novel-downloader[font-recovery]"
100
+ ```
101
+
102
+ > 参见: [安装](https://github.com/saudadez21/novel-downloader/blob/main/docs/1-installation.md)
103
+
104
+ ---
105
+
106
+ ## 快速开始
107
+
108
+ ### 1. 初始化配置
109
+
110
+ ```bash
111
+ # 生成默认配置 ./settings.toml
112
+ novel-cli config init
113
+ ```
114
+
115
+ 编辑生成的 `./settings.toml`, 可修改 `request_interval`、`book_ids` 等配置 (参考 [settings.toml 配置说明](https://github.com/saudadez21/novel-downloader/blob/main/docs/3-settings-schema.md))
116
+
117
+ ### 2. 命令行 (CLI)
118
+
119
+ ```bash
120
+ # 执行下载任务 (示例: 书籍 ID 为 123456, 默认站点为起点)
121
+ novel-cli download 123456
122
+ ```
123
+
124
+ * 支持站点见: [支持站点列表](https://github.com/saudadez21/novel-downloader/blob/main/docs/4-supported-sites.md)
125
+ * 更多示例见: [CLI 使用示例](https://github.com/saudadez21/novel-downloader/blob/main/docs/5-cli-usage-examples.md)
126
+
127
+ ### 3. 图形界面 (GUI / Web)
128
+
129
+ ```bash
130
+ # 启动 Web 界面 (基于当前 settings.toml)
131
+ novel-web
132
+
133
+ # 如需提供局域网/外网访问 (请自行留意安全与网络环境)
134
+ # novel-web --listen public
135
+ ```
136
+
137
+ ---
138
+
139
+ ## 从源码安装 (开发版)
140
+
141
+ 体验最新开发功能:
142
+
143
+ ```bash
144
+ git clone https://github.com/saudadez21/novel-downloader.git
145
+ cd novel-downloader
146
+ pip install .
147
+ # 或安装带可选功能:
148
+ # pip install .[font-recovery]
149
+ ```
150
+
151
+ ---
152
+
153
+ ## 文档导航
154
+
155
+ * [安装](https://github.com/saudadez21/novel-downloader/blob/main/docs/1-installation.md)
156
+ * [配置](https://github.com/saudadez21/novel-downloader/blob/main/docs/2-configuration.md)
157
+ * [settings.toml 配置说明](https://github.com/saudadez21/novel-downloader/blob/main/docs/3-settings-schema.md)
158
+ * [支持站点列表](https://github.com/saudadez21/novel-downloader/blob/main/docs/4-supported-sites.md)
159
+ * [CLI 使用示例](https://github.com/saudadez21/novel-downloader/blob/main/docs/5-cli-usage-examples.md)
160
+ * [复制 Cookies](https://github.com/saudadez21/novel-downloader/blob/main/docs/copy-cookies.md)
161
+ * [文件保存](https://github.com/saudadez21/novel-downloader/blob/main/docs/file-saving.md)
162
+ * [模块与接口文档](https://github.com/saudadez21/novel-downloader/blob/main/docs/api/README.md)
163
+ * [TODO](https://github.com/saudadez21/novel-downloader/blob/main/docs/todo.md)
164
+ * [开发](https://github.com/saudadez21/novel-downloader/blob/main/docs/develop.md)
165
+
166
+ ---
167
+
168
+ ## 项目说明
169
+
170
+ * 本项目仅供学习和研究使用, **不得**用于任何商业或违法用途; 请遵守目标网站的 `robots.txt` 及相关法律法规
171
+ * 由于网站结构可能变化或其他问题, 可能导致无法正常工作, 请按需自行调整代码或寻找其他解决方案
172
+ * 使用本项目造成的任何法律责任由使用者自行承担, 项目作者不承担相关责任
@@ -0,0 +1,105 @@
1
+ # novel-downloader
2
+
3
+ 基于 [aiohttp](https://github.com/aio-libs/aiohttp) 的异步小说下载工具 / 库。支持断点续传、广告过滤与 TXT/EPUB 导出, 提供 CLI 与 Web 图形界面。
4
+
5
+ > 运行要求: **Python 3.11+** (开发环境: Python 3.12)
6
+
7
+ ## 功能特性
8
+
9
+ * **可恢复下载**: 运行时自动检测本地已完成的部分, 跳过已下载内容
10
+ * **多格式导出**: 合并所有章节为
11
+ * `TXT`
12
+ * `EPUB` (可选打包章节插图)
13
+ * **广告/活动过滤**:
14
+ * [x] 章节标题过滤
15
+ * [x] 章节正文过滤
16
+ * **可选字体混淆还原**: `decode_font`
17
+ * **双形态使用**: 命令行 (CLI) 与 Web 图形界面 (GUI)
18
+
19
+ ---
20
+
21
+ ## 安装
22
+
23
+ 使用 `pip` 安装稳定版:
24
+
25
+ ```bash
26
+ pip install novel-downloader
27
+ ```
28
+
29
+ 启用字体解密功能 (`decode_font`):
30
+
31
+ ```bash
32
+ pip install "novel-downloader[font-recovery]"
33
+ ```
34
+
35
+ > 参见: [安装](https://github.com/saudadez21/novel-downloader/blob/main/docs/1-installation.md)
36
+
37
+ ---
38
+
39
+ ## 快速开始
40
+
41
+ ### 1. 初始化配置
42
+
43
+ ```bash
44
+ # 生成默认配置 ./settings.toml
45
+ novel-cli config init
46
+ ```
47
+
48
+ 编辑生成的 `./settings.toml`, 可修改 `request_interval`、`book_ids` 等配置 (参考 [settings.toml 配置说明](https://github.com/saudadez21/novel-downloader/blob/main/docs/3-settings-schema.md))
49
+
50
+ ### 2. 命令行 (CLI)
51
+
52
+ ```bash
53
+ # 执行下载任务 (示例: 书籍 ID 为 123456, 默认站点为起点)
54
+ novel-cli download 123456
55
+ ```
56
+
57
+ * 支持站点见: [支持站点列表](https://github.com/saudadez21/novel-downloader/blob/main/docs/4-supported-sites.md)
58
+ * 更多示例见: [CLI 使用示例](https://github.com/saudadez21/novel-downloader/blob/main/docs/5-cli-usage-examples.md)
59
+
60
+ ### 3. 图形界面 (GUI / Web)
61
+
62
+ ```bash
63
+ # 启动 Web 界面 (基于当前 settings.toml)
64
+ novel-web
65
+
66
+ # 如需提供局域网/外网访问 (请自行留意安全与网络环境)
67
+ # novel-web --listen public
68
+ ```
69
+
70
+ ---
71
+
72
+ ## 从源码安装 (开发版)
73
+
74
+ 体验最新开发功能:
75
+
76
+ ```bash
77
+ git clone https://github.com/saudadez21/novel-downloader.git
78
+ cd novel-downloader
79
+ pip install .
80
+ # 或安装带可选功能:
81
+ # pip install .[font-recovery]
82
+ ```
83
+
84
+ ---
85
+
86
+ ## 文档导航
87
+
88
+ * [安装](https://github.com/saudadez21/novel-downloader/blob/main/docs/1-installation.md)
89
+ * [配置](https://github.com/saudadez21/novel-downloader/blob/main/docs/2-configuration.md)
90
+ * [settings.toml 配置说明](https://github.com/saudadez21/novel-downloader/blob/main/docs/3-settings-schema.md)
91
+ * [支持站点列表](https://github.com/saudadez21/novel-downloader/blob/main/docs/4-supported-sites.md)
92
+ * [CLI 使用示例](https://github.com/saudadez21/novel-downloader/blob/main/docs/5-cli-usage-examples.md)
93
+ * [复制 Cookies](https://github.com/saudadez21/novel-downloader/blob/main/docs/copy-cookies.md)
94
+ * [文件保存](https://github.com/saudadez21/novel-downloader/blob/main/docs/file-saving.md)
95
+ * [模块与接口文档](https://github.com/saudadez21/novel-downloader/blob/main/docs/api/README.md)
96
+ * [TODO](https://github.com/saudadez21/novel-downloader/blob/main/docs/todo.md)
97
+ * [开发](https://github.com/saudadez21/novel-downloader/blob/main/docs/develop.md)
98
+
99
+ ---
100
+
101
+ ## 项目说明
102
+
103
+ * 本项目仅供学习和研究使用, **不得**用于任何商业或违法用途; 请遵守目标网站的 `robots.txt` 及相关法律法规
104
+ * 由于网站结构可能变化或其他问题, 可能导致无法正常工作, 请按需自行调整代码或寻找其他解决方案
105
+ * 使用本项目造成的任何法律责任由使用者自行承担, 项目作者不承担相关责任
@@ -7,7 +7,7 @@ authors = [
7
7
  license = {file = "LICENSE"}
8
8
  readme = {file = "README.md", content-type = "text/markdown"}
9
9
  requires-python = ">=3.11"
10
- keywords = ["novel", "web novel", "qidian", "biquge", "downloader", "parser", "fiction", "cli", "automation", "ebook"]
10
+ keywords = ["novel", "web novel", "qidian", "biquge", "ebook"]
11
11
  classifiers = [
12
12
  "Development Status :: 3 - Alpha",
13
13
  "Environment :: Console",
@@ -21,15 +21,22 @@ classifiers = [
21
21
  ]
22
22
  dynamic = ["version"]
23
23
  dependencies = [
24
- "textual",
24
+ "rich",
25
+ "nicegui",
25
26
  "requests",
26
27
  "aiohttp",
27
- "playwright",
28
28
  "lxml",
29
- "platformdirs"
29
+ "platformdirs",
30
30
  ]
31
31
 
32
32
  [project.optional-dependencies]
33
+ font-recovery = [
34
+ "brotli",
35
+ "numpy",
36
+ "fonttools",
37
+ "pillow",
38
+ ]
39
+
33
40
  dev = [
34
41
  "black",
35
42
  "mypy",
@@ -44,24 +51,13 @@ dev = [
44
51
  "commitizen"
45
52
  ]
46
53
 
47
- font-recovery = [
48
- "scipy",
49
- "numpy",
50
- "tinycss2",
51
- "fonttools",
52
- "brotli",
53
- "opencv-python",
54
- "pillow",
55
- "huggingface_hub"
56
- ]
57
-
58
54
  [project.scripts]
59
55
  novel-cli = "novel_downloader.cli.main:cli_main"
60
- novel-tui = "novel_downloader.tui.main:tui_main"
56
+ novel-web = "novel_downloader.web.main:web_main"
61
57
 
62
58
  [project.urls]
63
- Homepage = "https://github.com/BowenZ217/novel-downloader"
64
- Source = "https://github.com/BowenZ217/novel-downloader"
59
+ Homepage = "https://github.com/saudadez21/novel-downloader"
60
+ Source = "https://github.com/saudadez21/novel-downloader"
65
61
 
66
62
  [build-system]
67
63
  requires = ["setuptools>=61.0", "wheel"]
@@ -79,7 +75,6 @@ include = ["novel_downloader", "novel_downloader.*"]
79
75
  "novel_downloader.locales" = ["*.json"]
80
76
  "novel_downloader.resources.css_styles" = ["*.css"]
81
77
  "novel_downloader.resources.images" = ["*.png"]
82
- "novel_downloader.tui.styles" = ["*.tcss"]
83
78
 
84
79
  [tool.setuptools.dynamic]
85
80
  version = {attr = "novel_downloader.__version__"}
@@ -116,7 +111,7 @@ testpaths = ["tests"]
116
111
 
117
112
  [tool.commitizen]
118
113
  name = "cz_conventional_commits"
119
- version = "1.5.0"
114
+ version = "2.0.1"
120
115
  version_files = [
121
116
  "src/novel_downloader/__init__.py"
122
117
  ]
@@ -6,7 +6,7 @@ novel_downloader
6
6
  Core package for the Novel Downloader project.
7
7
  """
8
8
 
9
- __version__ = "1.5.0"
9
+ __version__ = "2.0.1"
10
10
 
11
11
  __author__ = "Saudade Z"
12
12
  __email__ = "saudadez217@gmail.com"
@@ -6,8 +6,6 @@ novel_downloader.cli
6
6
  This module exposes the CLI entry point.
7
7
  """
8
8
 
9
- __all__ = [
10
- "cli_main",
11
- ]
9
+ __all__ = ["cli_main"]
12
10
 
13
11
  from .main import cli_main
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ novel_downloader.cli.clean
4
+ --------------------------
5
+
6
+ CLI subcommands for clean resources.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import shutil
12
+ from argparse import Namespace, _SubParsersAction
13
+ from pathlib import Path
14
+
15
+ from novel_downloader.cli import ui
16
+ from novel_downloader.utils.constants import (
17
+ CONFIG_DIR,
18
+ DATA_DIR,
19
+ JS_SCRIPT_DIR,
20
+ LOGGER_DIR,
21
+ )
22
+ from novel_downloader.utils.i18n import t
23
+
24
+
25
+ def register_clean_subcommand(subparsers: _SubParsersAction) -> None: # type: ignore
26
+ """Register the `clean` subcommand and its options."""
27
+ parser = subparsers.add_parser("clean", help=t("help_clean"))
28
+
29
+ parser.add_argument("--logs", action="store_true", help=t("clean_logs"))
30
+ parser.add_argument("--cache", action="store_true", help=t("clean_cache"))
31
+ parser.add_argument("--data", action="store_true", help=t("clean_data"))
32
+ parser.add_argument("--config", action="store_true", help=t("clean_config"))
33
+ parser.add_argument("--all", action="store_true", help=t("clean_all"))
34
+ parser.add_argument("-y", "--yes", action="store_true", help=t("clean_yes"))
35
+
36
+ parser.set_defaults(func=handle_clean)
37
+
38
+
39
+ def handle_clean(args: Namespace) -> None:
40
+ """Handle the `clean` subcommand."""
41
+ targets: list[Path] = []
42
+
43
+ if args.all:
44
+ if not args.yes and not ui.confirm(t("clean_confirm"), default=False):
45
+ ui.warn(t("clean_cancelled"))
46
+ return
47
+ targets = [LOGGER_DIR, JS_SCRIPT_DIR, DATA_DIR, CONFIG_DIR]
48
+ else:
49
+ if args.logs:
50
+ targets.append(LOGGER_DIR)
51
+ if args.cache:
52
+ targets.append(JS_SCRIPT_DIR)
53
+ if args.data:
54
+ targets.append(DATA_DIR)
55
+ if args.config:
56
+ targets.append(CONFIG_DIR)
57
+
58
+ if not targets:
59
+ ui.warn(t("clean_nothing"))
60
+ return
61
+
62
+ for path in targets:
63
+ _delete_path(path)
64
+
65
+
66
+ def _delete_path(p: Path) -> None:
67
+ """Delete file or directory at `p`, printing a colored result line."""
68
+ if p.exists():
69
+ try:
70
+ if p.is_file():
71
+ p.unlink()
72
+ else:
73
+ shutil.rmtree(p, ignore_errors=True)
74
+ ui.success(f"[clean] {t('clean_deleted')}: {p}")
75
+ except Exception as e:
76
+ ui.error(f"[clean] {t('clean_failed', path=p)}: {p} -> {e}")
77
+ else:
78
+ ui.warn(f"[clean] {t('clean_not_found')}: {p}")
@@ -3,14 +3,17 @@
3
3
  novel_downloader.cli.config
4
4
  ---------------------------
5
5
 
6
- CLI subcommands for configuration management.
6
+ CLI subcommands for configuration file management.
7
7
  """
8
8
 
9
+ from __future__ import annotations
10
+
9
11
  import shutil
10
12
  from argparse import Namespace, _SubParsersAction
11
13
  from importlib.resources import as_file
12
14
  from pathlib import Path
13
15
 
16
+ from novel_downloader.cli import ui
14
17
  from novel_downloader.config import save_config_file
15
18
  from novel_downloader.utils.constants import DEFAULT_SETTINGS_PATHS
16
19
  from novel_downloader.utils.i18n import t
@@ -18,6 +21,7 @@ from novel_downloader.utils.state import state_mgr
18
21
 
19
22
 
20
23
  def register_config_subcommand(subparsers: _SubParsersAction) -> None: # type: ignore
24
+ """Register `config` with `init`, `set-lang`, and `set-config` subcommands."""
21
25
  parser = subparsers.add_parser("config", help=t("help_config"))
22
26
  config_subparsers = parser.add_subparsers(dest="subcommand", required=True)
23
27
 
@@ -27,26 +31,30 @@ def register_config_subcommand(subparsers: _SubParsersAction) -> None: # type:
27
31
 
28
32
 
29
33
  def _register_init(subparsers: _SubParsersAction) -> None: # type: ignore
30
- parser = subparsers.add_parser("init", help=t("settings_init_help"))
34
+ parser = subparsers.add_parser("init", help=t("config_init_help"))
31
35
  parser.add_argument(
32
- "--force", action="store_true", help=t("settings_init_force_help")
36
+ "--force", action="store_true", help=t("config_init_force_help")
33
37
  )
34
38
  parser.set_defaults(func=_handle_init)
35
39
 
36
40
 
37
41
  def _register_set_lang(subparsers: _SubParsersAction) -> None: # type: ignore
38
- parser = subparsers.add_parser("set-lang", help=t("settings_set_lang_help"))
42
+ parser = subparsers.add_parser("set-lang", help=t("config_set_lang_help"))
39
43
  parser.add_argument("lang", choices=["zh", "en"], help="Language code")
40
44
  parser.set_defaults(func=_handle_set_lang)
41
45
 
42
46
 
43
47
  def _register_set_config(subparsers: _SubParsersAction) -> None: # type: ignore
44
- parser = subparsers.add_parser("set-config", help=t("settings_set_config_help"))
48
+ parser = subparsers.add_parser("set-config", help=t("config_set_config_help"))
45
49
  parser.add_argument("path", type=str, help="Path to YAML config file")
46
50
  parser.set_defaults(func=_handle_set_config)
47
51
 
48
52
 
49
53
  def _handle_init(args: Namespace) -> None:
54
+ """
55
+ Copy template settings files from package resources into the current working dir.
56
+ If the target file exists, optionally confirm overwrite (unless --force).
57
+ """
50
58
  cwd = Path.cwd()
51
59
 
52
60
  for resource in DEFAULT_SETTINGS_PATHS:
@@ -55,41 +63,38 @@ def _handle_init(args: Namespace) -> None:
55
63
 
56
64
  if target_path.exists():
57
65
  if args.force:
58
- print(t("settings_init_overwrite", filename=resource.name))
66
+ ui.warn(t("config_init_overwrite", filename=resource.name))
59
67
  else:
60
- print(t("settings_init_exists", filename=resource.name))
61
- resp = (
62
- input(
63
- t("settings_init_confirm_overwrite", filename=resource.name)
64
- + " [y/N]: "
65
- )
66
- .strip()
67
- .lower()
68
+ ui.info(t("config_init_exists", filename=resource.name))
69
+ should_copy = ui.confirm(
70
+ t("config_init_confirm_overwrite", filename=resource.name),
71
+ default=False,
68
72
  )
69
- should_copy = resp == "y"
70
73
 
71
74
  if not should_copy:
72
- print(t("settings_init_skip", filename=resource.name))
75
+ ui.warn(t("config_init_skip", filename=resource.name))
73
76
  continue
74
77
 
75
78
  try:
76
79
  with as_file(resource) as actual_path:
77
80
  shutil.copy(actual_path, target_path)
78
- print(t("settings_init_copy", filename=resource.name))
81
+ ui.success(t("config_init_copy", filename=resource.name))
79
82
  except Exception as e:
80
- print(t("settings_init_error", filename=resource.name, err=str(e)))
83
+ ui.error(t("config_init_error", filename=resource.name, err=str(e)))
81
84
  raise
82
85
 
83
86
 
84
87
  def _handle_set_lang(args: Namespace) -> None:
88
+ """Set the UI language and persist in state manager."""
85
89
  state_mgr.set_language(args.lang)
86
- print(t("settings_set_lang", lang=args.lang))
90
+ ui.success(t("config_set_lang", lang=args.lang))
87
91
 
88
92
 
89
93
  def _handle_set_config(args: Namespace) -> None:
94
+ """Persist a user-supplied TOML config path into the app config."""
90
95
  try:
91
96
  save_config_file(args.path)
92
- print(t("settings_set_config", path=args.path))
97
+ ui.success(t("config_set_config", path=args.path))
93
98
  except Exception as e:
94
- print(t("settings_set_config_fail", err=str(e)))
99
+ ui.error(t("config_set_config_fail", err=str(e)))
95
100
  raise