novel-downloader 1.5.0__tar.gz → 2.0.0__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 (283) hide show
  1. novel_downloader-2.0.0/PKG-INFO +171 -0
  2. novel_downloader-2.0.0/README.md +105 -0
  3. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/pyproject.toml +14 -20
  4. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/__init__.py +1 -1
  5. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/__init__.py +1 -3
  6. novel_downloader-2.0.0/src/novel_downloader/cli/clean.py +78 -0
  7. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/config.py +26 -21
  8. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/download.py +77 -64
  9. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/export.py +16 -20
  10. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/main.py +1 -1
  11. novel_downloader-2.0.0/src/novel_downloader/cli/search.py +120 -0
  12. novel_downloader-2.0.0/src/novel_downloader/cli/ui.py +156 -0
  13. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/config/__init__.py +8 -5
  14. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/config/adapter.py +65 -105
  15. novel_downloader-1.5.0/src/novel_downloader/config/loader.py → novel_downloader-2.0.0/src/novel_downloader/config/file_io.py +53 -26
  16. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/__init__.py +1 -0
  17. novel_downloader-2.0.0/src/novel_downloader/core/archived/deqixs/fetcher.py +115 -0
  18. novel_downloader-2.0.0/src/novel_downloader/core/archived/deqixs/parser.py +132 -0
  19. novel_downloader-2.0.0/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.0/src/novel_downloader/core/archived/qidian/searcher.py +12 -20
  21. novel_downloader-2.0.0/src/novel_downloader/core/archived/wanbengo/searcher.py +98 -0
  22. novel_downloader-2.0.0/src/novel_downloader/core/archived/xshbook/searcher.py +93 -0
  23. novel_downloader-2.0.0/src/novel_downloader/core/downloaders/__init__.py +19 -0
  24. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/downloaders/base.py +49 -23
  25. novel_downloader-2.0.0/src/novel_downloader/core/downloaders/common.py +281 -0
  26. novel_downloader-2.0.0/src/novel_downloader/core/downloaders/qianbi.py +353 -0
  27. novel_downloader-2.0.0/src/novel_downloader/core/downloaders/qidian.py +336 -0
  28. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/downloaders/registry.py +4 -2
  29. novel_downloader-2.0.0/src/novel_downloader/core/downloaders/signals.py +46 -0
  30. novel_downloader-2.0.0/src/novel_downloader/core/exporters/__init__.py +19 -0
  31. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/base.py +33 -37
  32. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/common/__init__.py +1 -2
  33. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/common/epub.py +15 -10
  34. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/common/main_exporter.py +19 -12
  35. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/common/txt.py +14 -9
  36. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/epub_util.py +59 -29
  37. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/linovelib/__init__.py +1 -0
  38. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/linovelib/epub.py +23 -25
  39. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/linovelib/main_exporter.py +8 -12
  40. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/linovelib/txt.py +17 -11
  41. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/qidian.py +2 -8
  42. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/registry.py +4 -2
  43. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/txt_util.py +7 -7
  44. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/__init__.py +73 -0
  45. novel_downloader-2.0.0/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.0/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.0/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.0/src/novel_downloader/core/fetchers/biquyuedu.py +12 -17
  49. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/dxmwx.py +110 -0
  50. novel_downloader-2.0.0/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.0/src/novel_downloader/core/fetchers/esjzone.py +19 -12
  52. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/guidaye.py +85 -0
  53. novel_downloader-2.0.0/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.0/src/novel_downloader/core/fetchers/i25zw.py +19 -28
  55. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/ixdzs8.py +113 -0
  56. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/jpxs123.py +101 -0
  57. novel_downloader-2.0.0/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.0/src/novel_downloader/core/fetchers/linovelib.py +12 -13
  59. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/piaotia.py +105 -0
  60. novel_downloader-2.0.0/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.0/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.0/src/novel_downloader/core/fetchers/qidian.py +46 -39
  63. novel_downloader-2.0.0/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.0/src/novel_downloader/core/fetchers}/rate_limiter.py +2 -2
  65. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/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.0/src/novel_downloader/core/fetchers/sfacg.py +7 -10
  67. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/shencou.py +106 -0
  68. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/shuhaige.py +84 -0
  69. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/tongrenquan.py +84 -0
  70. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/ttkan.py +95 -0
  71. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/wanbengo.py +83 -0
  72. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/xiaoshuowu.py +106 -0
  73. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/xiguashuwu.py +177 -0
  74. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/xs63b.py +171 -0
  75. novel_downloader-2.0.0/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.0/src/novel_downloader/core/fetchers/yamibo.py +19 -12
  77. novel_downloader-2.0.0/src/novel_downloader/core/fetchers/yibige.py +114 -0
  78. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/__init__.py +1 -9
  79. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/downloader.py +6 -2
  80. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/exporter.py +7 -7
  81. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/fetcher.py +4 -17
  82. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/parser.py +5 -6
  83. novel_downloader-2.0.0/src/novel_downloader/core/interfaces/searcher.py +26 -0
  84. novel_downloader-2.0.0/src/novel_downloader/core/parsers/__init__.py +74 -0
  85. novel_downloader-2.0.0/src/novel_downloader/core/parsers/aaatxt.py +132 -0
  86. novel_downloader-2.0.0/src/novel_downloader/core/parsers/b520.py +116 -0
  87. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/base.py +63 -12
  88. novel_downloader-2.0.0/src/novel_downloader/core/parsers/biquyuedu.py +133 -0
  89. novel_downloader-2.0.0/src/novel_downloader/core/parsers/dxmwx.py +162 -0
  90. novel_downloader-2.0.0/src/novel_downloader/core/parsers/eightnovel.py +224 -0
  91. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/esjzone.py +61 -66
  92. novel_downloader-2.0.0/src/novel_downloader/core/parsers/guidaye.py +128 -0
  93. novel_downloader-2.0.0/src/novel_downloader/core/parsers/hetushu.py +139 -0
  94. novel_downloader-2.0.0/src/novel_downloader/core/parsers/i25zw.py +137 -0
  95. novel_downloader-2.0.0/src/novel_downloader/core/parsers/ixdzs8.py +186 -0
  96. novel_downloader-2.0.0/src/novel_downloader/core/parsers/jpxs123.py +137 -0
  97. novel_downloader-2.0.0/src/novel_downloader/core/parsers/lewenn.py +142 -0
  98. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/linovelib.py +48 -64
  99. novel_downloader-2.0.0/src/novel_downloader/core/parsers/piaotia.py +189 -0
  100. novel_downloader-2.0.0/src/novel_downloader/core/parsers/qbtr.py +136 -0
  101. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qianbi.py +48 -50
  102. novel_downloader-2.0.0/src/novel_downloader/core/parsers/qidian/book_info_parser.py +89 -0
  103. novel_downloader-2.0.0/src/novel_downloader/core/parsers/qidian/chapter_encrypted.py +470 -0
  104. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/chapter_normal.py +24 -55
  105. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/main_parser.py +11 -38
  106. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/__init__.py +1 -0
  107. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py +1 -1
  108. novel_downloader-2.0.0/src/novel_downloader/core/parsers/qidian/utils/fontmap_recover.py +143 -0
  109. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/helpers.py +0 -4
  110. novel_downloader-2.0.0/src/novel_downloader/core/parsers/quanben5.py +103 -0
  111. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/registry.py +5 -16
  112. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/sfacg.py +38 -45
  113. novel_downloader-2.0.0/src/novel_downloader/core/parsers/shencou.py +215 -0
  114. novel_downloader-2.0.0/src/novel_downloader/core/parsers/shuhaige.py +111 -0
  115. novel_downloader-2.0.0/src/novel_downloader/core/parsers/tongrenquan.py +116 -0
  116. novel_downloader-2.0.0/src/novel_downloader/core/parsers/ttkan.py +132 -0
  117. novel_downloader-2.0.0/src/novel_downloader/core/parsers/wanbengo.py +191 -0
  118. novel_downloader-2.0.0/src/novel_downloader/core/parsers/xiaoshuowu.py +173 -0
  119. novel_downloader-2.0.0/src/novel_downloader/core/parsers/xiguashuwu.py +435 -0
  120. novel_downloader-2.0.0/src/novel_downloader/core/parsers/xs63b.py +161 -0
  121. novel_downloader-2.0.0/src/novel_downloader/core/parsers/xshbook.py +134 -0
  122. novel_downloader-2.0.0/src/novel_downloader/core/parsers/yamibo.py +155 -0
  123. novel_downloader-2.0.0/src/novel_downloader/core/parsers/yibige.py +166 -0
  124. novel_downloader-2.0.0/src/novel_downloader/core/searchers/__init__.py +51 -0
  125. novel_downloader-2.0.0/src/novel_downloader/core/searchers/aaatxt.py +107 -0
  126. novel_downloader-1.5.0/src/novel_downloader/core/searchers/biquge.py → novel_downloader-2.0.0/src/novel_downloader/core/searchers/b520.py +29 -28
  127. novel_downloader-2.0.0/src/novel_downloader/core/searchers/base.py +168 -0
  128. novel_downloader-2.0.0/src/novel_downloader/core/searchers/dxmwx.py +105 -0
  129. novel_downloader-2.0.0/src/novel_downloader/core/searchers/eightnovel.py +84 -0
  130. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/searchers/esjzone.py +43 -25
  131. novel_downloader-2.0.0/src/novel_downloader/core/searchers/hetushu.py +92 -0
  132. novel_downloader-2.0.0/src/novel_downloader/core/searchers/i25zw.py +93 -0
  133. novel_downloader-2.0.0/src/novel_downloader/core/searchers/ixdzs8.py +107 -0
  134. novel_downloader-2.0.0/src/novel_downloader/core/searchers/jpxs123.py +107 -0
  135. novel_downloader-2.0.0/src/novel_downloader/core/searchers/piaotia.py +100 -0
  136. novel_downloader-2.0.0/src/novel_downloader/core/searchers/qbtr.py +106 -0
  137. novel_downloader-2.0.0/src/novel_downloader/core/searchers/qianbi.py +165 -0
  138. novel_downloader-2.0.0/src/novel_downloader/core/searchers/quanben5.py +144 -0
  139. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/searchers/registry.py +24 -8
  140. novel_downloader-2.0.0/src/novel_downloader/core/searchers/shuhaige.py +124 -0
  141. novel_downloader-2.0.0/src/novel_downloader/core/searchers/tongrenquan.py +110 -0
  142. novel_downloader-2.0.0/src/novel_downloader/core/searchers/ttkan.py +92 -0
  143. novel_downloader-2.0.0/src/novel_downloader/core/searchers/xiaoshuowu.py +122 -0
  144. novel_downloader-2.0.0/src/novel_downloader/core/searchers/xiguashuwu.py +95 -0
  145. novel_downloader-2.0.0/src/novel_downloader/core/searchers/xs63b.py +104 -0
  146. novel_downloader-2.0.0/src/novel_downloader/locales/en.json +75 -0
  147. novel_downloader-2.0.0/src/novel_downloader/locales/zh.json +75 -0
  148. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/models/__init__.py +21 -22
  149. novel_downloader-2.0.0/src/novel_downloader/models/book.py +44 -0
  150. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/models/config.py +4 -37
  151. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/models/login.py +1 -1
  152. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/models/search.py +5 -0
  153. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/config/settings.toml +8 -70
  154. novel_downloader-2.0.0/src/novel_downloader/resources/json/xiguashuwu.json +718 -0
  155. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/__init__.py +13 -22
  156. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/chapter_storage.py +3 -2
  157. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/constants.py +4 -29
  158. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/cookies.py +6 -18
  159. novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/__init__.py +13 -0
  160. novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/aes_util.py +90 -0
  161. novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/aes_v1.py +619 -0
  162. novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/aes_v2.py +1143 -0
  163. novel_downloader-1.5.0/src/novel_downloader/utils/crypto_utils.py → novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/rc4.py +3 -10
  164. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/__init__.py +1 -1
  165. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/constants.py +57 -16
  166. novel_downloader-2.0.0/src/novel_downloader/utils/epub/documents.py +297 -0
  167. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/models.py +0 -14
  168. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/utils.py +63 -96
  169. novel_downloader-2.0.0/src/novel_downloader/utils/file_utils/__init__.py +17 -0
  170. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/file_utils/io.py +3 -113
  171. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/file_utils/sanitize.py +0 -4
  172. novel_downloader-2.0.0/src/novel_downloader/utils/fontocr.py +207 -0
  173. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/logger.py +8 -16
  174. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/network.py +2 -2
  175. novel_downloader-2.0.0/src/novel_downloader/utils/state.py +70 -0
  176. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/__init__.py +1 -7
  177. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/diff_display.py +5 -7
  178. novel_downloader-2.0.0/src/novel_downloader/utils/time_utils/__init__.py +16 -0
  179. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/time_utils/datetime_utils.py +20 -29
  180. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/time_utils/sleep_utils.py +4 -8
  181. novel_downloader-2.0.0/src/novel_downloader/web/__init__.py +13 -0
  182. novel_downloader-2.0.0/src/novel_downloader/web/components/__init__.py +11 -0
  183. novel_downloader-2.0.0/src/novel_downloader/web/components/navigation.py +35 -0
  184. novel_downloader-2.0.0/src/novel_downloader/web/main.py +66 -0
  185. novel_downloader-2.0.0/src/novel_downloader/web/pages/__init__.py +17 -0
  186. novel_downloader-2.0.0/src/novel_downloader/web/pages/download.py +78 -0
  187. novel_downloader-2.0.0/src/novel_downloader/web/pages/progress.py +147 -0
  188. novel_downloader-2.0.0/src/novel_downloader/web/pages/search.py +329 -0
  189. novel_downloader-2.0.0/src/novel_downloader/web/services/__init__.py +17 -0
  190. novel_downloader-2.0.0/src/novel_downloader/web/services/client_dialog.py +164 -0
  191. novel_downloader-2.0.0/src/novel_downloader/web/services/cred_broker.py +113 -0
  192. novel_downloader-2.0.0/src/novel_downloader/web/services/cred_models.py +35 -0
  193. novel_downloader-2.0.0/src/novel_downloader/web/services/task_manager.py +264 -0
  194. novel_downloader-2.0.0/src/novel_downloader.egg-info/PKG-INFO +171 -0
  195. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/SOURCES.txt +105 -59
  196. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/entry_points.txt +1 -1
  197. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/requires.txt +2 -7
  198. novel_downloader-1.5.0/PKG-INFO +0 -196
  199. novel_downloader-1.5.0/README.md +0 -125
  200. novel_downloader-1.5.0/src/novel_downloader/cli/clean.py +0 -145
  201. novel_downloader-1.5.0/src/novel_downloader/cli/search.py +0 -123
  202. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/__init__.py +0 -40
  203. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/biquge.py +0 -29
  204. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/common.py +0 -227
  205. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/esjzone.py +0 -29
  206. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/linovelib.py +0 -29
  207. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/qianbi.py +0 -312
  208. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/qidian.py +0 -290
  209. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/sfacg.py +0 -29
  210. novel_downloader-1.5.0/src/novel_downloader/core/downloaders/yamibo.py +0 -29
  211. novel_downloader-1.5.0/src/novel_downloader/core/exporters/__init__.py +0 -36
  212. novel_downloader-1.5.0/src/novel_downloader/core/exporters/biquge.py +0 -22
  213. novel_downloader-1.5.0/src/novel_downloader/core/exporters/esjzone.py +0 -22
  214. novel_downloader-1.5.0/src/novel_downloader/core/exporters/qianbi.py +0 -22
  215. novel_downloader-1.5.0/src/novel_downloader/core/exporters/sfacg.py +0 -22
  216. novel_downloader-1.5.0/src/novel_downloader/core/exporters/yamibo.py +0 -22
  217. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/__init__.py +0 -67
  218. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/base/__init__.py +0 -14
  219. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/base/browser.py +0 -422
  220. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/biquge/__init__.py +0 -14
  221. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/esjzone/__init__.py +0 -14
  222. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/esjzone/browser.py +0 -209
  223. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/linovelib/__init__.py +0 -14
  224. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/linovelib/browser.py +0 -198
  225. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qianbi/__init__.py +0 -14
  226. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qidian/__init__.py +0 -14
  227. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qidian/browser.py +0 -326
  228. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/sfacg/__init__.py +0 -14
  229. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/sfacg/browser.py +0 -194
  230. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/yamibo/__init__.py +0 -14
  231. novel_downloader-1.5.0/src/novel_downloader/core/fetchers/yamibo/browser.py +0 -234
  232. novel_downloader-1.5.0/src/novel_downloader/core/interfaces/searcher.py +0 -18
  233. novel_downloader-1.5.0/src/novel_downloader/core/parsers/__init__.py +0 -37
  234. novel_downloader-1.5.0/src/novel_downloader/core/parsers/biquge.py +0 -139
  235. novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/book_info_parser.py +0 -90
  236. novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/chapter_encrypted.py +0 -528
  237. novel_downloader-1.5.0/src/novel_downloader/core/parsers/yamibo.py +0 -199
  238. novel_downloader-1.5.0/src/novel_downloader/core/searchers/__init__.py +0 -20
  239. novel_downloader-1.5.0/src/novel_downloader/core/searchers/base.py +0 -92
  240. novel_downloader-1.5.0/src/novel_downloader/core/searchers/qianbi.py +0 -131
  241. novel_downloader-1.5.0/src/novel_downloader/locales/en.json +0 -126
  242. novel_downloader-1.5.0/src/novel_downloader/locales/zh.json +0 -126
  243. novel_downloader-1.5.0/src/novel_downloader/models/chapter.py +0 -25
  244. novel_downloader-1.5.0/src/novel_downloader/models/types.py +0 -13
  245. novel_downloader-1.5.0/src/novel_downloader/tui/__init__.py +0 -7
  246. novel_downloader-1.5.0/src/novel_downloader/tui/app.py +0 -32
  247. novel_downloader-1.5.0/src/novel_downloader/tui/main.py +0 -17
  248. novel_downloader-1.5.0/src/novel_downloader/tui/screens/__init__.py +0 -14
  249. novel_downloader-1.5.0/src/novel_downloader/tui/screens/home.py +0 -198
  250. novel_downloader-1.5.0/src/novel_downloader/tui/screens/login.py +0 -74
  251. novel_downloader-1.5.0/src/novel_downloader/tui/styles/home_layout.tcss +0 -79
  252. novel_downloader-1.5.0/src/novel_downloader/tui/widgets/richlog_handler.py +0 -24
  253. novel_downloader-1.5.0/src/novel_downloader/utils/cache.py +0 -24
  254. novel_downloader-1.5.0/src/novel_downloader/utils/epub/documents.py +0 -403
  255. novel_downloader-1.5.0/src/novel_downloader/utils/file_utils/__init__.py +0 -38
  256. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/__init__.py +0 -22
  257. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/hash_store.py +0 -280
  258. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/hash_utils.py +0 -103
  259. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/model_loader.py +0 -69
  260. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/ocr_v1.py +0 -315
  261. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/ocr_v2.py +0 -764
  262. novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/ocr_v3.py +0 -744
  263. novel_downloader-1.5.0/src/novel_downloader/utils/state.py +0 -156
  264. novel_downloader-1.5.0/src/novel_downloader/utils/time_utils/__init__.py +0 -22
  265. novel_downloader-1.5.0/src/novel_downloader.egg-info/PKG-INFO +0 -196
  266. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/LICENSE +0 -0
  267. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/setup.cfg +0 -0
  268. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/__init__.py +0 -0
  269. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/chapter_router.py +0 -0
  270. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/node_decryptor.py +0 -0
  271. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/css_styles/intro.css +0 -0
  272. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/css_styles/main.css +0 -0
  273. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/images/volume_border.png +0 -0
  274. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/js_scripts/qidian_decrypt_node.js +0 -0
  275. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/json/linovelib_font_map.json +0 -0
  276. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/builder.py +0 -0
  277. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/file_utils/normalize.py +0 -0
  278. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/i18n.py +0 -0
  279. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/numeric_conversion.py +0 -0
  280. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/text_cleaner.py +0 -0
  281. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/truncate_utils.py +0 -0
  282. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/dependency_links.txt +0 -0
  283. {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader.egg-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,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,21 @@ 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
+ "numpy",
35
+ "fonttools",
36
+ "pillow",
37
+ ]
38
+
33
39
  dev = [
34
40
  "black",
35
41
  "mypy",
@@ -44,24 +50,13 @@ dev = [
44
50
  "commitizen"
45
51
  ]
46
52
 
47
- font-recovery = [
48
- "scipy",
49
- "numpy",
50
- "tinycss2",
51
- "fonttools",
52
- "brotli",
53
- "opencv-python",
54
- "pillow",
55
- "huggingface_hub"
56
- ]
57
-
58
53
  [project.scripts]
59
54
  novel-cli = "novel_downloader.cli.main:cli_main"
60
- novel-tui = "novel_downloader.tui.main:tui_main"
55
+ novel-web = "novel_downloader.web.main:web_main"
61
56
 
62
57
  [project.urls]
63
- Homepage = "https://github.com/BowenZ217/novel-downloader"
64
- Source = "https://github.com/BowenZ217/novel-downloader"
58
+ Homepage = "https://github.com/saudadez21/novel-downloader"
59
+ Source = "https://github.com/saudadez21/novel-downloader"
65
60
 
66
61
  [build-system]
67
62
  requires = ["setuptools>=61.0", "wheel"]
@@ -79,7 +74,6 @@ include = ["novel_downloader", "novel_downloader.*"]
79
74
  "novel_downloader.locales" = ["*.json"]
80
75
  "novel_downloader.resources.css_styles" = ["*.css"]
81
76
  "novel_downloader.resources.images" = ["*.png"]
82
- "novel_downloader.tui.styles" = ["*.tcss"]
83
77
 
84
78
  [tool.setuptools.dynamic]
85
79
  version = {attr = "novel_downloader.__version__"}
@@ -116,7 +110,7 @@ testpaths = ["tests"]
116
110
 
117
111
  [tool.commitizen]
118
112
  name = "cz_conventional_commits"
119
- version = "1.5.0"
113
+ version = "2.0.0"
120
114
  version_files = [
121
115
  "src/novel_downloader/__init__.py"
122
116
  ]
@@ -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.0"
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