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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. novel_downloader/__init__.py +1 -1
  2. novel_downloader/cli/__init__.py +2 -4
  3. novel_downloader/cli/clean.py +21 -88
  4. novel_downloader/cli/config.py +27 -104
  5. novel_downloader/cli/download.py +78 -66
  6. novel_downloader/cli/export.py +20 -21
  7. novel_downloader/cli/main.py +3 -1
  8. novel_downloader/cli/search.py +120 -0
  9. novel_downloader/cli/ui.py +156 -0
  10. novel_downloader/config/__init__.py +10 -14
  11. novel_downloader/config/adapter.py +195 -99
  12. novel_downloader/config/{loader.py → file_io.py} +53 -27
  13. novel_downloader/core/__init__.py +14 -13
  14. novel_downloader/core/archived/deqixs/fetcher.py +115 -0
  15. novel_downloader/core/archived/deqixs/parser.py +132 -0
  16. novel_downloader/core/archived/deqixs/searcher.py +89 -0
  17. novel_downloader/core/archived/qidian/searcher.py +79 -0
  18. novel_downloader/core/archived/wanbengo/searcher.py +98 -0
  19. novel_downloader/core/archived/xshbook/searcher.py +93 -0
  20. novel_downloader/core/downloaders/__init__.py +8 -30
  21. novel_downloader/core/downloaders/base.py +182 -30
  22. novel_downloader/core/downloaders/common.py +217 -384
  23. novel_downloader/core/downloaders/qianbi.py +332 -4
  24. novel_downloader/core/downloaders/qidian.py +250 -290
  25. novel_downloader/core/downloaders/registry.py +69 -0
  26. novel_downloader/core/downloaders/signals.py +46 -0
  27. novel_downloader/core/exporters/__init__.py +8 -26
  28. novel_downloader/core/exporters/base.py +107 -31
  29. novel_downloader/core/exporters/common/__init__.py +3 -4
  30. novel_downloader/core/exporters/common/epub.py +92 -171
  31. novel_downloader/core/exporters/common/main_exporter.py +14 -67
  32. novel_downloader/core/exporters/common/txt.py +90 -86
  33. novel_downloader/core/exporters/epub_util.py +184 -1327
  34. novel_downloader/core/exporters/linovelib/__init__.py +3 -2
  35. novel_downloader/core/exporters/linovelib/epub.py +165 -222
  36. novel_downloader/core/exporters/linovelib/main_exporter.py +10 -71
  37. novel_downloader/core/exporters/linovelib/txt.py +76 -66
  38. novel_downloader/core/exporters/qidian.py +15 -11
  39. novel_downloader/core/exporters/registry.py +55 -0
  40. novel_downloader/core/exporters/txt_util.py +67 -0
  41. novel_downloader/core/fetchers/__init__.py +57 -56
  42. novel_downloader/core/fetchers/aaatxt.py +83 -0
  43. novel_downloader/core/fetchers/{biquge/session.py → b520.py} +10 -10
  44. novel_downloader/core/fetchers/{base/session.py → base.py} +63 -47
  45. novel_downloader/core/fetchers/biquyuedu.py +83 -0
  46. novel_downloader/core/fetchers/dxmwx.py +110 -0
  47. novel_downloader/core/fetchers/eightnovel.py +139 -0
  48. novel_downloader/core/fetchers/{esjzone/session.py → esjzone.py} +23 -11
  49. novel_downloader/core/fetchers/guidaye.py +85 -0
  50. novel_downloader/core/fetchers/hetushu.py +92 -0
  51. novel_downloader/core/fetchers/{qianbi/browser.py → i25zw.py} +22 -26
  52. novel_downloader/core/fetchers/ixdzs8.py +113 -0
  53. novel_downloader/core/fetchers/jpxs123.py +101 -0
  54. novel_downloader/core/fetchers/{biquge/browser.py → lewenn.py} +15 -15
  55. novel_downloader/core/fetchers/{linovelib/session.py → linovelib.py} +16 -12
  56. novel_downloader/core/fetchers/piaotia.py +105 -0
  57. novel_downloader/core/fetchers/qbtr.py +101 -0
  58. novel_downloader/core/fetchers/{qianbi/session.py → qianbi.py} +9 -9
  59. novel_downloader/core/fetchers/{qidian/session.py → qidian.py} +55 -40
  60. novel_downloader/core/fetchers/quanben5.py +92 -0
  61. novel_downloader/core/fetchers/{base/rate_limiter.py → rate_limiter.py} +2 -2
  62. novel_downloader/core/fetchers/registry.py +60 -0
  63. novel_downloader/core/fetchers/{sfacg/session.py → sfacg.py} +11 -9
  64. novel_downloader/core/fetchers/shencou.py +106 -0
  65. novel_downloader/core/fetchers/{common/browser.py → shuhaige.py} +24 -19
  66. novel_downloader/core/fetchers/tongrenquan.py +84 -0
  67. novel_downloader/core/fetchers/ttkan.py +95 -0
  68. novel_downloader/core/fetchers/{common/session.py → wanbengo.py} +21 -17
  69. novel_downloader/core/fetchers/xiaoshuowu.py +106 -0
  70. novel_downloader/core/fetchers/xiguashuwu.py +177 -0
  71. novel_downloader/core/fetchers/xs63b.py +171 -0
  72. novel_downloader/core/fetchers/xshbook.py +85 -0
  73. novel_downloader/core/fetchers/{yamibo/session.py → yamibo.py} +23 -11
  74. novel_downloader/core/fetchers/yibige.py +114 -0
  75. novel_downloader/core/interfaces/__init__.py +8 -14
  76. novel_downloader/core/interfaces/downloader.py +6 -2
  77. novel_downloader/core/interfaces/exporter.py +7 -7
  78. novel_downloader/core/interfaces/fetcher.py +4 -17
  79. novel_downloader/core/interfaces/parser.py +5 -6
  80. novel_downloader/core/interfaces/searcher.py +26 -0
  81. novel_downloader/core/parsers/__init__.py +58 -22
  82. novel_downloader/core/parsers/aaatxt.py +132 -0
  83. novel_downloader/core/parsers/b520.py +116 -0
  84. novel_downloader/core/parsers/base.py +63 -12
  85. novel_downloader/core/parsers/biquyuedu.py +133 -0
  86. novel_downloader/core/parsers/dxmwx.py +162 -0
  87. novel_downloader/core/parsers/eightnovel.py +224 -0
  88. novel_downloader/core/parsers/{esjzone/main_parser.py → esjzone.py} +67 -67
  89. novel_downloader/core/parsers/guidaye.py +128 -0
  90. novel_downloader/core/parsers/hetushu.py +139 -0
  91. novel_downloader/core/parsers/i25zw.py +137 -0
  92. novel_downloader/core/parsers/ixdzs8.py +186 -0
  93. novel_downloader/core/parsers/jpxs123.py +137 -0
  94. novel_downloader/core/parsers/lewenn.py +142 -0
  95. novel_downloader/core/parsers/{linovelib/main_parser.py → linovelib.py} +54 -65
  96. novel_downloader/core/parsers/piaotia.py +189 -0
  97. novel_downloader/core/parsers/qbtr.py +136 -0
  98. novel_downloader/core/parsers/{qianbi/main_parser.py → qianbi.py} +54 -51
  99. novel_downloader/core/parsers/qidian/__init__.py +2 -2
  100. novel_downloader/core/parsers/qidian/book_info_parser.py +58 -59
  101. novel_downloader/core/parsers/qidian/chapter_encrypted.py +290 -346
  102. novel_downloader/core/parsers/qidian/chapter_normal.py +25 -56
  103. novel_downloader/core/parsers/qidian/main_parser.py +19 -57
  104. novel_downloader/core/parsers/qidian/utils/__init__.py +12 -11
  105. novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py +6 -7
  106. novel_downloader/core/parsers/qidian/utils/fontmap_recover.py +143 -0
  107. novel_downloader/core/parsers/qidian/utils/helpers.py +0 -4
  108. novel_downloader/core/parsers/qidian/utils/node_decryptor.py +2 -2
  109. novel_downloader/core/parsers/quanben5.py +103 -0
  110. novel_downloader/core/parsers/registry.py +57 -0
  111. novel_downloader/core/parsers/{sfacg/main_parser.py → sfacg.py} +46 -48
  112. novel_downloader/core/parsers/shencou.py +215 -0
  113. novel_downloader/core/parsers/shuhaige.py +111 -0
  114. novel_downloader/core/parsers/tongrenquan.py +116 -0
  115. novel_downloader/core/parsers/ttkan.py +132 -0
  116. novel_downloader/core/parsers/wanbengo.py +191 -0
  117. novel_downloader/core/parsers/xiaoshuowu.py +173 -0
  118. novel_downloader/core/parsers/xiguashuwu.py +435 -0
  119. novel_downloader/core/parsers/xs63b.py +161 -0
  120. novel_downloader/core/parsers/xshbook.py +134 -0
  121. novel_downloader/core/parsers/yamibo.py +155 -0
  122. novel_downloader/core/parsers/yibige.py +166 -0
  123. novel_downloader/core/searchers/__init__.py +51 -0
  124. novel_downloader/core/searchers/aaatxt.py +107 -0
  125. novel_downloader/core/searchers/b520.py +84 -0
  126. novel_downloader/core/searchers/base.py +168 -0
  127. novel_downloader/core/searchers/dxmwx.py +105 -0
  128. novel_downloader/core/searchers/eightnovel.py +84 -0
  129. novel_downloader/core/searchers/esjzone.py +102 -0
  130. novel_downloader/core/searchers/hetushu.py +92 -0
  131. novel_downloader/core/searchers/i25zw.py +93 -0
  132. novel_downloader/core/searchers/ixdzs8.py +107 -0
  133. novel_downloader/core/searchers/jpxs123.py +107 -0
  134. novel_downloader/core/searchers/piaotia.py +100 -0
  135. novel_downloader/core/searchers/qbtr.py +106 -0
  136. novel_downloader/core/searchers/qianbi.py +165 -0
  137. novel_downloader/core/searchers/quanben5.py +144 -0
  138. novel_downloader/core/searchers/registry.py +79 -0
  139. novel_downloader/core/searchers/shuhaige.py +124 -0
  140. novel_downloader/core/searchers/tongrenquan.py +110 -0
  141. novel_downloader/core/searchers/ttkan.py +92 -0
  142. novel_downloader/core/searchers/xiaoshuowu.py +122 -0
  143. novel_downloader/core/searchers/xiguashuwu.py +95 -0
  144. novel_downloader/core/searchers/xs63b.py +104 -0
  145. novel_downloader/locales/en.json +36 -79
  146. novel_downloader/locales/zh.json +37 -80
  147. novel_downloader/models/__init__.py +23 -50
  148. novel_downloader/models/book.py +44 -0
  149. novel_downloader/models/config.py +16 -43
  150. novel_downloader/models/login.py +1 -1
  151. novel_downloader/models/search.py +21 -0
  152. novel_downloader/resources/config/settings.toml +39 -74
  153. novel_downloader/resources/css_styles/intro.css +83 -0
  154. novel_downloader/resources/css_styles/main.css +30 -89
  155. novel_downloader/resources/json/xiguashuwu.json +718 -0
  156. novel_downloader/utils/__init__.py +43 -0
  157. novel_downloader/utils/chapter_storage.py +247 -226
  158. novel_downloader/utils/constants.py +5 -50
  159. novel_downloader/utils/cookies.py +6 -18
  160. novel_downloader/utils/crypto_utils/__init__.py +13 -0
  161. novel_downloader/utils/crypto_utils/aes_util.py +90 -0
  162. novel_downloader/utils/crypto_utils/aes_v1.py +619 -0
  163. novel_downloader/utils/crypto_utils/aes_v2.py +1143 -0
  164. novel_downloader/utils/{crypto_utils.py → crypto_utils/rc4.py} +3 -10
  165. novel_downloader/utils/epub/__init__.py +34 -0
  166. novel_downloader/utils/epub/builder.py +377 -0
  167. novel_downloader/utils/epub/constants.py +118 -0
  168. novel_downloader/utils/epub/documents.py +297 -0
  169. novel_downloader/utils/epub/models.py +120 -0
  170. novel_downloader/utils/epub/utils.py +179 -0
  171. novel_downloader/utils/file_utils/__init__.py +5 -30
  172. novel_downloader/utils/file_utils/io.py +9 -150
  173. novel_downloader/utils/file_utils/normalize.py +2 -2
  174. novel_downloader/utils/file_utils/sanitize.py +2 -7
  175. novel_downloader/utils/fontocr.py +207 -0
  176. novel_downloader/utils/i18n.py +2 -0
  177. novel_downloader/utils/logger.py +10 -16
  178. novel_downloader/utils/network.py +111 -252
  179. novel_downloader/utils/state.py +5 -90
  180. novel_downloader/utils/text_utils/__init__.py +16 -21
  181. novel_downloader/utils/text_utils/diff_display.py +6 -9
  182. novel_downloader/utils/text_utils/numeric_conversion.py +253 -0
  183. novel_downloader/utils/text_utils/text_cleaner.py +179 -0
  184. novel_downloader/utils/text_utils/truncate_utils.py +62 -0
  185. novel_downloader/utils/time_utils/__init__.py +6 -12
  186. novel_downloader/utils/time_utils/datetime_utils.py +23 -33
  187. novel_downloader/utils/time_utils/sleep_utils.py +5 -10
  188. novel_downloader/web/__init__.py +13 -0
  189. novel_downloader/web/components/__init__.py +11 -0
  190. novel_downloader/web/components/navigation.py +35 -0
  191. novel_downloader/web/main.py +66 -0
  192. novel_downloader/web/pages/__init__.py +17 -0
  193. novel_downloader/web/pages/download.py +78 -0
  194. novel_downloader/web/pages/progress.py +147 -0
  195. novel_downloader/web/pages/search.py +329 -0
  196. novel_downloader/web/services/__init__.py +17 -0
  197. novel_downloader/web/services/client_dialog.py +164 -0
  198. novel_downloader/web/services/cred_broker.py +113 -0
  199. novel_downloader/web/services/cred_models.py +35 -0
  200. novel_downloader/web/services/task_manager.py +264 -0
  201. novel_downloader-2.0.0.dist-info/METADATA +171 -0
  202. novel_downloader-2.0.0.dist-info/RECORD +210 -0
  203. {novel_downloader-1.4.5.dist-info → novel_downloader-2.0.0.dist-info}/entry_points.txt +1 -1
  204. novel_downloader/config/site_rules.py +0 -94
  205. novel_downloader/core/downloaders/biquge.py +0 -25
  206. novel_downloader/core/downloaders/esjzone.py +0 -25
  207. novel_downloader/core/downloaders/linovelib.py +0 -25
  208. novel_downloader/core/downloaders/sfacg.py +0 -25
  209. novel_downloader/core/downloaders/yamibo.py +0 -25
  210. novel_downloader/core/exporters/biquge.py +0 -25
  211. novel_downloader/core/exporters/esjzone.py +0 -25
  212. novel_downloader/core/exporters/qianbi.py +0 -25
  213. novel_downloader/core/exporters/sfacg.py +0 -25
  214. novel_downloader/core/exporters/yamibo.py +0 -25
  215. novel_downloader/core/factory/__init__.py +0 -20
  216. novel_downloader/core/factory/downloader.py +0 -73
  217. novel_downloader/core/factory/exporter.py +0 -58
  218. novel_downloader/core/factory/fetcher.py +0 -96
  219. novel_downloader/core/factory/parser.py +0 -86
  220. novel_downloader/core/fetchers/base/__init__.py +0 -14
  221. novel_downloader/core/fetchers/base/browser.py +0 -403
  222. novel_downloader/core/fetchers/biquge/__init__.py +0 -14
  223. novel_downloader/core/fetchers/common/__init__.py +0 -14
  224. novel_downloader/core/fetchers/esjzone/__init__.py +0 -14
  225. novel_downloader/core/fetchers/esjzone/browser.py +0 -204
  226. novel_downloader/core/fetchers/linovelib/__init__.py +0 -14
  227. novel_downloader/core/fetchers/linovelib/browser.py +0 -193
  228. novel_downloader/core/fetchers/qianbi/__init__.py +0 -14
  229. novel_downloader/core/fetchers/qidian/__init__.py +0 -14
  230. novel_downloader/core/fetchers/qidian/browser.py +0 -318
  231. novel_downloader/core/fetchers/sfacg/__init__.py +0 -14
  232. novel_downloader/core/fetchers/sfacg/browser.py +0 -189
  233. novel_downloader/core/fetchers/yamibo/__init__.py +0 -14
  234. novel_downloader/core/fetchers/yamibo/browser.py +0 -229
  235. novel_downloader/core/parsers/biquge/__init__.py +0 -10
  236. novel_downloader/core/parsers/biquge/main_parser.py +0 -134
  237. novel_downloader/core/parsers/common/__init__.py +0 -13
  238. novel_downloader/core/parsers/common/helper.py +0 -323
  239. novel_downloader/core/parsers/common/main_parser.py +0 -106
  240. novel_downloader/core/parsers/esjzone/__init__.py +0 -10
  241. novel_downloader/core/parsers/linovelib/__init__.py +0 -10
  242. novel_downloader/core/parsers/qianbi/__init__.py +0 -10
  243. novel_downloader/core/parsers/sfacg/__init__.py +0 -10
  244. novel_downloader/core/parsers/yamibo/__init__.py +0 -10
  245. novel_downloader/core/parsers/yamibo/main_parser.py +0 -194
  246. novel_downloader/models/browser.py +0 -21
  247. novel_downloader/models/chapter.py +0 -25
  248. novel_downloader/models/site_rules.py +0 -99
  249. novel_downloader/models/tasks.py +0 -33
  250. novel_downloader/models/types.py +0 -15
  251. novel_downloader/resources/css_styles/volume-intro.css +0 -56
  252. novel_downloader/resources/json/replace_word_map.json +0 -4
  253. novel_downloader/resources/text/blacklist.txt +0 -22
  254. novel_downloader/tui/__init__.py +0 -7
  255. novel_downloader/tui/app.py +0 -32
  256. novel_downloader/tui/main.py +0 -17
  257. novel_downloader/tui/screens/__init__.py +0 -14
  258. novel_downloader/tui/screens/home.py +0 -198
  259. novel_downloader/tui/screens/login.py +0 -74
  260. novel_downloader/tui/styles/home_layout.tcss +0 -79
  261. novel_downloader/tui/widgets/richlog_handler.py +0 -24
  262. novel_downloader/utils/cache.py +0 -24
  263. novel_downloader/utils/fontocr/__init__.py +0 -22
  264. novel_downloader/utils/fontocr/model_loader.py +0 -69
  265. novel_downloader/utils/fontocr/ocr_v1.py +0 -303
  266. novel_downloader/utils/fontocr/ocr_v2.py +0 -752
  267. novel_downloader/utils/hash_store.py +0 -279
  268. novel_downloader/utils/hash_utils.py +0 -103
  269. novel_downloader/utils/text_utils/chapter_formatting.py +0 -46
  270. novel_downloader/utils/text_utils/font_mapping.py +0 -28
  271. novel_downloader/utils/text_utils/text_cleaning.py +0 -107
  272. novel_downloader-1.4.5.dist-info/METADATA +0 -196
  273. novel_downloader-1.4.5.dist-info/RECORD +0 -165
  274. {novel_downloader-1.4.5.dist-info → novel_downloader-2.0.0.dist-info}/WHEEL +0 -0
  275. {novel_downloader-1.4.5.dist-info → novel_downloader-2.0.0.dist-info}/licenses/LICENSE +0 -0
  276. {novel_downloader-1.4.5.dist-info → novel_downloader-2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.exporters.esjzone
4
- ---------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.models import ExporterConfig
9
-
10
- from .common import CommonExporter
11
-
12
-
13
- class EsjzoneExporter(CommonExporter):
14
- def __init__(
15
- self,
16
- config: ExporterConfig,
17
- ):
18
- super().__init__(
19
- config,
20
- site="esjzone",
21
- chap_folders=["chapters"],
22
- )
23
-
24
-
25
- __all__ = ["EsjzoneExporter"]
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.exporters.qianbi
4
- --------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.models import ExporterConfig
9
-
10
- from .common import CommonExporter
11
-
12
-
13
- class QianbiExporter(CommonExporter):
14
- def __init__(
15
- self,
16
- config: ExporterConfig,
17
- ):
18
- super().__init__(
19
- config,
20
- site="qianbi",
21
- chap_folders=["chapters"],
22
- )
23
-
24
-
25
- __all__ = ["QianbiExporter"]
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.exporters.sfacg
4
- -------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.models import ExporterConfig
9
-
10
- from .common import CommonExporter
11
-
12
-
13
- class SfacgExporter(CommonExporter):
14
- def __init__(
15
- self,
16
- config: ExporterConfig,
17
- ):
18
- super().__init__(
19
- config,
20
- site="sfacg",
21
- chap_folders=["chapters"],
22
- )
23
-
24
-
25
- __all__ = ["SfacgExporter"]
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.exporters.yamibo
4
- --------------------------------------
5
-
6
- """
7
-
8
- from novel_downloader.models import ExporterConfig
9
-
10
- from .common import CommonExporter
11
-
12
-
13
- class YamiboExporter(CommonExporter):
14
- def __init__(
15
- self,
16
- config: ExporterConfig,
17
- ):
18
- super().__init__(
19
- config,
20
- site="yamibo",
21
- chap_folders=["chapters"],
22
- )
23
-
24
-
25
- __all__ = ["YamiboExporter"]
@@ -1,20 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.factory
4
- -----------------------------
5
-
6
- This package provides factory methods for dynamically retrieving components
7
- based on runtime parameters such as site name or content type.
8
- """
9
-
10
- from .downloader import get_downloader
11
- from .exporter import get_exporter
12
- from .fetcher import get_fetcher
13
- from .parser import get_parser
14
-
15
- __all__ = [
16
- "get_downloader",
17
- "get_exporter",
18
- "get_fetcher",
19
- "get_parser",
20
- ]
@@ -1,73 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.factory.downloader
4
- ----------------------------------------
5
-
6
- This module implements a factory function for creating downloader instances
7
- based on the site name and parser mode specified in the configuration.
8
- """
9
-
10
- from collections.abc import Callable
11
-
12
- from novel_downloader.config import load_site_rules
13
- from novel_downloader.core.downloaders import (
14
- BiqugeDownloader,
15
- CommonDownloader,
16
- EsjzoneDownloader,
17
- LinovelibDownloader,
18
- QianbiDownloader,
19
- QidianDownloader,
20
- SfacgDownloader,
21
- YamiboDownloader,
22
- )
23
- from novel_downloader.core.interfaces import (
24
- DownloaderProtocol,
25
- FetcherProtocol,
26
- ParserProtocol,
27
- )
28
- from novel_downloader.models import DownloaderConfig
29
-
30
- DownloaderBuilder = Callable[
31
- [FetcherProtocol, ParserProtocol, DownloaderConfig],
32
- DownloaderProtocol,
33
- ]
34
-
35
- _site_map: dict[str, DownloaderBuilder] = {
36
- "biquge": BiqugeDownloader,
37
- "esjzone": EsjzoneDownloader,
38
- "linovelib": LinovelibDownloader,
39
- "qianbi": QianbiDownloader,
40
- "qidian": QidianDownloader,
41
- "sfacg": SfacgDownloader,
42
- "yamibo": YamiboDownloader,
43
- }
44
-
45
-
46
- def get_downloader(
47
- fetcher: FetcherProtocol,
48
- parser: ParserProtocol,
49
- site: str,
50
- config: DownloaderConfig,
51
- ) -> DownloaderProtocol:
52
- """
53
- Returns an DownloaderProtocol for the given site.
54
-
55
- :param fetcher: Fetcher implementation
56
- :param parser: Parser implementation
57
- :param site: Site name (e.g., 'qidian')
58
- :param config: Downloader configuration
59
-
60
- :return: An instance of a downloader class
61
- """
62
- site_key = site.lower()
63
-
64
- # site-specific
65
- if site_key in _site_map:
66
- return _site_map[site_key](fetcher, parser, config)
67
-
68
- # fallback
69
- site_rules = load_site_rules()
70
- if site_key not in site_rules:
71
- raise ValueError(f"Unsupported site: {site}")
72
-
73
- return CommonDownloader(fetcher, parser, config, site_key)
@@ -1,58 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.factory.exporter
4
- --------------------------------------
5
-
6
- This module implements a factory function for creating exporter instances
7
- based on the site name.
8
- """
9
-
10
- from collections.abc import Callable
11
-
12
- from novel_downloader.config import load_site_rules
13
- from novel_downloader.core.exporters import (
14
- BiqugeExporter,
15
- CommonExporter,
16
- EsjzoneExporter,
17
- LinovelibExporter,
18
- QianbiExporter,
19
- QidianExporter,
20
- SfacgExporter,
21
- YamiboExporter,
22
- )
23
- from novel_downloader.core.interfaces import ExporterProtocol
24
- from novel_downloader.models import ExporterConfig
25
-
26
- ExporterBuilder = Callable[[ExporterConfig], ExporterProtocol]
27
-
28
- _site_map: dict[str, ExporterBuilder] = {
29
- "biquge": BiqugeExporter,
30
- "esjzone": EsjzoneExporter,
31
- "linovelib": LinovelibExporter,
32
- "qianbi": QianbiExporter,
33
- "qidian": QidianExporter,
34
- "sfacg": SfacgExporter,
35
- "yamibo": YamiboExporter,
36
- }
37
-
38
-
39
- def get_exporter(site: str, config: ExporterConfig) -> ExporterProtocol:
40
- """
41
- Returns a site-specific exporter instance.
42
-
43
- :param site: Site name (e.g., 'qidian')
44
- :param config: Configuration for the exporter
45
- :return: An instance of a exporter class
46
- """
47
- site_key = site.lower()
48
-
49
- # site-specific
50
- if site_key in _site_map:
51
- return _site_map[site_key](config)
52
-
53
- # Fallback
54
- site_rules = load_site_rules()
55
- if site_key not in site_rules:
56
- raise ValueError(f"Unsupported site: {site}")
57
-
58
- return CommonExporter(config, site_key)
@@ -1,96 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.factory.fetcher
4
- -------------------------------------
5
-
6
- This module implements a factory function for retrieving fetcher instances
7
- based on the target novel platform (site).
8
- """
9
-
10
- from collections.abc import Callable
11
-
12
- from novel_downloader.config import load_site_rules
13
- from novel_downloader.core.fetchers import (
14
- BiqugeBrowser,
15
- BiqugeSession,
16
- CommonBrowser,
17
- CommonSession,
18
- EsjzoneBrowser,
19
- EsjzoneSession,
20
- LinovelibBrowser,
21
- LinovelibSession,
22
- QianbiBrowser,
23
- QianbiSession,
24
- QidianBrowser,
25
- QidianSession,
26
- SfacgBrowser,
27
- SfacgSession,
28
- YamiboBrowser,
29
- YamiboSession,
30
- )
31
- from novel_downloader.core.interfaces import FetcherProtocol
32
- from novel_downloader.models import FetcherConfig
33
-
34
- FetcherBuilder = Callable[[FetcherConfig], FetcherProtocol]
35
-
36
- _site_map: dict[str, dict[str, FetcherBuilder]] = {
37
- "biquge": {
38
- "browser": BiqugeBrowser,
39
- "session": BiqugeSession,
40
- },
41
- "esjzone": {
42
- "browser": EsjzoneBrowser,
43
- "session": EsjzoneSession,
44
- },
45
- "linovelib": {
46
- "browser": LinovelibBrowser,
47
- "session": LinovelibSession,
48
- },
49
- "qianbi": {
50
- "browser": QianbiBrowser,
51
- "session": QianbiSession,
52
- },
53
- "qidian": {
54
- "browser": QidianBrowser,
55
- "session": QidianSession,
56
- },
57
- "sfacg": {
58
- "browser": SfacgBrowser,
59
- "session": SfacgSession,
60
- },
61
- "yamibo": {
62
- "browser": YamiboBrowser,
63
- "session": YamiboSession,
64
- },
65
- }
66
-
67
-
68
- def get_fetcher(
69
- site: str,
70
- config: FetcherConfig,
71
- ) -> FetcherProtocol:
72
- """
73
- Returns an FetcherProtocol for the given site.
74
-
75
- :param site: Site name (e.g., 'qidian')
76
- :param config: Configuration for the requester
77
- :return: An instance of a requester class
78
- """
79
- site_key = site.lower()
80
- mode = config.mode
81
-
82
- # site-specific
83
- fetcher_cls = _site_map.get(site_key, {}).get(mode)
84
- if fetcher_cls is not None:
85
- return fetcher_cls(config)
86
-
87
- # fallback: use Common based on mode
88
- site_rules = load_site_rules()
89
- site_rule = site_rules.get(site_key)
90
- if site_rule is None:
91
- raise ValueError(f"Unsupported site: {site}")
92
- profile = site_rule["profile"]
93
-
94
- if mode == "browser":
95
- return CommonBrowser(site_key, profile, config)
96
- return CommonSession(site_key, profile, config)
@@ -1,86 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.factory.parser
4
- ------------------------------------
5
-
6
- This module implements a factory function for creating parser instances
7
- based on the site name and parser mode specified in the configuration.
8
- """
9
-
10
- from collections.abc import Callable
11
-
12
- from novel_downloader.config import load_site_rules
13
- from novel_downloader.core.interfaces import ParserProtocol
14
- from novel_downloader.core.parsers import (
15
- BiqugeParser,
16
- CommonParser,
17
- EsjzoneParser,
18
- LinovelibParser,
19
- QianbiParser,
20
- QidianParser,
21
- SfacgParser,
22
- YamiboParser,
23
- )
24
- from novel_downloader.models import ParserConfig
25
-
26
- ParserBuilder = Callable[[ParserConfig], ParserProtocol]
27
-
28
- _site_map: dict[str, dict[str, ParserBuilder]] = {
29
- "biquge": {
30
- "browser": BiqugeParser,
31
- "session": BiqugeParser,
32
- },
33
- "esjzone": {
34
- "browser": EsjzoneParser,
35
- "session": EsjzoneParser,
36
- },
37
- "linovelib": {
38
- "browser": LinovelibParser,
39
- "session": LinovelibParser,
40
- },
41
- "qianbi": {
42
- "browser": QianbiParser,
43
- "session": QianbiParser,
44
- },
45
- "qidian": {
46
- "browser": QidianParser,
47
- "session": QidianParser,
48
- },
49
- "sfacg": {
50
- "browser": SfacgParser,
51
- "session": SfacgParser,
52
- },
53
- "yamibo": {
54
- "browser": YamiboParser,
55
- "session": YamiboParser,
56
- },
57
- }
58
-
59
-
60
- def get_parser(site: str, config: ParserConfig) -> ParserProtocol:
61
- """
62
- Returns a site-specific parser instance.
63
-
64
- :param site: Site name (e.g., 'qidian')
65
- :param config: Configuration for the parser
66
- :return: An instance of a parser class
67
- """
68
- site_key = site.lower()
69
-
70
- if site_key in _site_map:
71
- site_entry = _site_map[site_key]
72
- if isinstance(site_entry, dict):
73
- parser_class = site_entry.get(config.mode)
74
- else:
75
- parser_class = site_entry
76
-
77
- if parser_class:
78
- return parser_class(config)
79
-
80
- # Fallback: site not mapped specially, try to load rule
81
- site_rules = load_site_rules()
82
- site_rule = site_rules.get(site_key)
83
- if site_rule is None:
84
- raise ValueError(f"Unsupported site: {site}")
85
-
86
- return CommonParser(config, site_key, site_rule)
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.fetchers.base
4
- -----------------------------------
5
-
6
- """
7
-
8
- from .browser import BaseBrowser
9
- from .session import BaseSession
10
-
11
- __all__ = [
12
- "BaseBrowser",
13
- "BaseSession",
14
- ]