novel-downloader 1.4.5__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.
- novel_downloader-2.0.0/PKG-INFO +171 -0
- novel_downloader-2.0.0/README.md +105 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/pyproject.toml +14 -20
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/__init__.py +1 -1
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/cli/__init__.py +2 -4
- novel_downloader-2.0.0/src/novel_downloader/cli/clean.py +78 -0
- novel_downloader-2.0.0/src/novel_downloader/cli/config.py +100 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/cli/download.py +78 -66
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/cli/export.py +20 -21
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/cli/main.py +3 -1
- novel_downloader-2.0.0/src/novel_downloader/cli/search.py +120 -0
- novel_downloader-2.0.0/src/novel_downloader/cli/ui.py +156 -0
- novel_downloader-2.0.0/src/novel_downloader/config/__init__.py +23 -0
- novel_downloader-2.0.0/src/novel_downloader/config/adapter.py +320 -0
- novel_downloader-1.4.5/src/novel_downloader/config/loader.py → novel_downloader-2.0.0/src/novel_downloader/config/file_io.py +53 -27
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/__init__.py +14 -13
- novel_downloader-2.0.0/src/novel_downloader/core/archived/deqixs/fetcher.py +115 -0
- novel_downloader-2.0.0/src/novel_downloader/core/archived/deqixs/parser.py +132 -0
- novel_downloader-2.0.0/src/novel_downloader/core/archived/deqixs/searcher.py +89 -0
- novel_downloader-2.0.0/src/novel_downloader/core/archived/qidian/searcher.py +79 -0
- novel_downloader-2.0.0/src/novel_downloader/core/archived/wanbengo/searcher.py +98 -0
- novel_downloader-2.0.0/src/novel_downloader/core/archived/xshbook/searcher.py +93 -0
- novel_downloader-2.0.0/src/novel_downloader/core/downloaders/__init__.py +19 -0
- novel_downloader-2.0.0/src/novel_downloader/core/downloaders/base.py +382 -0
- novel_downloader-2.0.0/src/novel_downloader/core/downloaders/common.py +281 -0
- novel_downloader-2.0.0/src/novel_downloader/core/downloaders/qianbi.py +353 -0
- novel_downloader-2.0.0/src/novel_downloader/core/downloaders/qidian.py +336 -0
- novel_downloader-2.0.0/src/novel_downloader/core/downloaders/registry.py +69 -0
- novel_downloader-2.0.0/src/novel_downloader/core/downloaders/signals.py +46 -0
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/__init__.py +19 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/base.py +107 -31
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/common/__init__.py +3 -4
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/common/epub.py +198 -0
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/common/main_exporter.py +64 -0
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/common/txt.py +146 -0
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/epub_util.py +215 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/linovelib/__init__.py +3 -2
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/linovelib/epub.py +349 -0
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/linovelib/main_exporter.py +66 -0
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/linovelib/txt.py +139 -0
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/qidian.py +32 -0
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/registry.py +55 -0
- novel_downloader-2.0.0/src/novel_downloader/core/exporters/txt_util.py +67 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/__init__.py +73 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/aaatxt.py +83 -0
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/biquge/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/b520.py +10 -10
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/base/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/base.py +63 -47
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/biquyuedu.py +83 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/dxmwx.py +110 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/eightnovel.py +139 -0
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/esjzone/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/esjzone.py +23 -11
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/guidaye.py +85 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/hetushu.py +92 -0
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/qianbi/browser.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/i25zw.py +22 -26
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/ixdzs8.py +113 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/jpxs123.py +101 -0
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/biquge/browser.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/lewenn.py +15 -15
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/linovelib/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/linovelib.py +16 -12
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/piaotia.py +105 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/qbtr.py +101 -0
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/qianbi/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/qianbi.py +9 -9
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/qidian/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/qidian.py +55 -40
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/quanben5.py +92 -0
- {novel_downloader-1.4.5/src/novel_downloader/core/fetchers/base → novel_downloader-2.0.0/src/novel_downloader/core/fetchers}/rate_limiter.py +2 -2
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/registry.py +60 -0
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/sfacg/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/sfacg.py +11 -9
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/shencou.py +106 -0
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/common/browser.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/shuhaige.py +24 -19
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/tongrenquan.py +84 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/ttkan.py +95 -0
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/common/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/wanbengo.py +21 -17
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/xiaoshuowu.py +106 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/xiguashuwu.py +177 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/xs63b.py +171 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/xshbook.py +85 -0
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/yamibo/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/yamibo.py +23 -11
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/yibige.py +114 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/__init__.py +8 -14
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/downloader.py +6 -2
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/exporter.py +7 -7
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/fetcher.py +4 -17
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/parser.py +5 -6
- novel_downloader-2.0.0/src/novel_downloader/core/interfaces/searcher.py +26 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/__init__.py +74 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/aaatxt.py +132 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/b520.py +116 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/base.py +63 -12
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/biquyuedu.py +133 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/dxmwx.py +162 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/eightnovel.py +224 -0
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/esjzone/main_parser.py → novel_downloader-2.0.0/src/novel_downloader/core/parsers/esjzone.py +67 -67
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/guidaye.py +128 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/hetushu.py +139 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/i25zw.py +137 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/ixdzs8.py +186 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/jpxs123.py +137 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/lewenn.py +142 -0
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/linovelib/main_parser.py → novel_downloader-2.0.0/src/novel_downloader/core/parsers/linovelib.py +54 -65
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/piaotia.py +189 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/qbtr.py +136 -0
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/qianbi/main_parser.py → novel_downloader-2.0.0/src/novel_downloader/core/parsers/qianbi.py +54 -51
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/qidian/book_info_parser.py +89 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/qidian/chapter_encrypted.py +470 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/chapter_normal.py +25 -56
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/qidian/main_parser.py +101 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/__init__.py +12 -11
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py +6 -7
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/qidian/utils/fontmap_recover.py +143 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/helpers.py +0 -4
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/node_decryptor.py +2 -2
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/quanben5.py +103 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/registry.py +57 -0
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/sfacg/main_parser.py → novel_downloader-2.0.0/src/novel_downloader/core/parsers/sfacg.py +46 -48
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/shencou.py +215 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/shuhaige.py +111 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/tongrenquan.py +116 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/ttkan.py +132 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/wanbengo.py +191 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/xiaoshuowu.py +173 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/xiguashuwu.py +435 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/xs63b.py +161 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/xshbook.py +134 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/yamibo.py +155 -0
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/yibige.py +166 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/__init__.py +51 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/aaatxt.py +107 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/b520.py +84 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/base.py +168 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/dxmwx.py +105 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/eightnovel.py +84 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/esjzone.py +102 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/hetushu.py +92 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/i25zw.py +93 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/ixdzs8.py +107 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/jpxs123.py +107 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/piaotia.py +100 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/qbtr.py +106 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/qianbi.py +165 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/quanben5.py +144 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/registry.py +79 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/shuhaige.py +124 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/tongrenquan.py +110 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/ttkan.py +92 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/xiaoshuowu.py +122 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/xiguashuwu.py +95 -0
- novel_downloader-2.0.0/src/novel_downloader/core/searchers/xs63b.py +104 -0
- novel_downloader-2.0.0/src/novel_downloader/locales/en.json +75 -0
- novel_downloader-2.0.0/src/novel_downloader/locales/zh.json +75 -0
- novel_downloader-2.0.0/src/novel_downloader/models/__init__.py +39 -0
- novel_downloader-2.0.0/src/novel_downloader/models/book.py +44 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/models/config.py +16 -43
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/models/login.py +1 -1
- novel_downloader-2.0.0/src/novel_downloader/models/search.py +21 -0
- novel_downloader-2.0.0/src/novel_downloader/resources/config/settings.toml +96 -0
- novel_downloader-2.0.0/src/novel_downloader/resources/css_styles/intro.css +83 -0
- novel_downloader-2.0.0/src/novel_downloader/resources/css_styles/main.css +45 -0
- novel_downloader-2.0.0/src/novel_downloader/resources/json/xiguashuwu.json +718 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/__init__.py +49 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/chapter_storage.py +348 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/utils/constants.py +5 -50
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/utils/cookies.py +6 -18
- novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/__init__.py +13 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/aes_util.py +90 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/aes_v1.py +619 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/aes_v2.py +1143 -0
- novel_downloader-1.4.5/src/novel_downloader/utils/crypto_utils.py → novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/rc4.py +3 -10
- novel_downloader-2.0.0/src/novel_downloader/utils/epub/__init__.py +34 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/epub/builder.py +377 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/epub/constants.py +118 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/epub/documents.py +297 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/epub/models.py +120 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/epub/utils.py +179 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/file_utils/__init__.py +17 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/file_utils/io.py +106 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/utils/file_utils/sanitize.py +2 -7
- novel_downloader-2.0.0/src/novel_downloader/utils/fontocr.py +207 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/utils/i18n.py +2 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/utils/logger.py +10 -16
- novel_downloader-2.0.0/src/novel_downloader/utils/network.py +159 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/state.py +70 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/text_utils/__init__.py +28 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/diff_display.py +6 -9
- novel_downloader-2.0.0/src/novel_downloader/utils/text_utils/numeric_conversion.py +253 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/text_utils/text_cleaner.py +179 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/text_utils/truncate_utils.py +62 -0
- novel_downloader-2.0.0/src/novel_downloader/utils/time_utils/__init__.py +16 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/utils/time_utils/datetime_utils.py +23 -33
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/utils/time_utils/sleep_utils.py +5 -10
- novel_downloader-2.0.0/src/novel_downloader/web/__init__.py +13 -0
- novel_downloader-2.0.0/src/novel_downloader/web/components/__init__.py +11 -0
- novel_downloader-2.0.0/src/novel_downloader/web/components/navigation.py +35 -0
- novel_downloader-2.0.0/src/novel_downloader/web/main.py +66 -0
- novel_downloader-2.0.0/src/novel_downloader/web/pages/__init__.py +17 -0
- novel_downloader-2.0.0/src/novel_downloader/web/pages/download.py +78 -0
- novel_downloader-2.0.0/src/novel_downloader/web/pages/progress.py +147 -0
- novel_downloader-2.0.0/src/novel_downloader/web/pages/search.py +329 -0
- novel_downloader-2.0.0/src/novel_downloader/web/services/__init__.py +17 -0
- novel_downloader-2.0.0/src/novel_downloader/web/services/client_dialog.py +164 -0
- novel_downloader-2.0.0/src/novel_downloader/web/services/cred_broker.py +113 -0
- novel_downloader-2.0.0/src/novel_downloader/web/services/cred_models.py +35 -0
- novel_downloader-2.0.0/src/novel_downloader/web/services/task_manager.py +264 -0
- novel_downloader-2.0.0/src/novel_downloader.egg-info/PKG-INFO +171 -0
- novel_downloader-2.0.0/src/novel_downloader.egg-info/SOURCES.txt +213 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/entry_points.txt +1 -1
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/requires.txt +2 -7
- novel_downloader-1.4.5/PKG-INFO +0 -196
- novel_downloader-1.4.5/README.md +0 -125
- novel_downloader-1.4.5/src/novel_downloader/cli/clean.py +0 -145
- novel_downloader-1.4.5/src/novel_downloader/cli/config.py +0 -177
- novel_downloader-1.4.5/src/novel_downloader/config/__init__.py +0 -27
- novel_downloader-1.4.5/src/novel_downloader/config/adapter.py +0 -224
- novel_downloader-1.4.5/src/novel_downloader/config/site_rules.py +0 -94
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/__init__.py +0 -41
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/base.py +0 -230
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/biquge.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/common.py +0 -448
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/esjzone.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/linovelib.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/qianbi.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/qidian.py +0 -376
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/sfacg.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/downloaders/yamibo.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/__init__.py +0 -37
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/biquge.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/common/epub.py +0 -277
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/common/main_exporter.py +0 -117
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/common/txt.py +0 -142
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/epub_util.py +0 -1358
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/esjzone.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/linovelib/epub.py +0 -406
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/linovelib/main_exporter.py +0 -127
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/linovelib/txt.py +0 -129
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/qianbi.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/qidian.py +0 -28
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/sfacg.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/exporters/yamibo.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/core/factory/__init__.py +0 -20
- novel_downloader-1.4.5/src/novel_downloader/core/factory/downloader.py +0 -73
- novel_downloader-1.4.5/src/novel_downloader/core/factory/exporter.py +0 -58
- novel_downloader-1.4.5/src/novel_downloader/core/factory/fetcher.py +0 -96
- novel_downloader-1.4.5/src/novel_downloader/core/factory/parser.py +0 -86
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/__init__.py +0 -72
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/base/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/base/browser.py +0 -403
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/biquge/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/common/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/esjzone/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/esjzone/browser.py +0 -204
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/linovelib/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/linovelib/browser.py +0 -193
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/qianbi/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/qidian/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/qidian/browser.py +0 -318
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/sfacg/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/sfacg/browser.py +0 -189
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/yamibo/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/core/fetchers/yamibo/browser.py +0 -229
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/__init__.py +0 -38
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/biquge/__init__.py +0 -10
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/biquge/main_parser.py +0 -134
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/common/__init__.py +0 -13
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/common/helper.py +0 -323
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/common/main_parser.py +0 -106
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/esjzone/__init__.py +0 -10
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/linovelib/__init__.py +0 -10
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/qianbi/__init__.py +0 -10
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/qidian/book_info_parser.py +0 -90
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/qidian/chapter_encrypted.py +0 -526
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/qidian/main_parser.py +0 -139
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/sfacg/__init__.py +0 -10
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/yamibo/__init__.py +0 -10
- novel_downloader-1.4.5/src/novel_downloader/core/parsers/yamibo/main_parser.py +0 -194
- novel_downloader-1.4.5/src/novel_downloader/locales/en.json +0 -118
- novel_downloader-1.4.5/src/novel_downloader/locales/zh.json +0 -118
- novel_downloader-1.4.5/src/novel_downloader/models/__init__.py +0 -66
- novel_downloader-1.4.5/src/novel_downloader/models/browser.py +0 -21
- novel_downloader-1.4.5/src/novel_downloader/models/chapter.py +0 -25
- novel_downloader-1.4.5/src/novel_downloader/models/site_rules.py +0 -99
- novel_downloader-1.4.5/src/novel_downloader/models/tasks.py +0 -33
- novel_downloader-1.4.5/src/novel_downloader/models/types.py +0 -15
- novel_downloader-1.4.5/src/novel_downloader/resources/config/settings.toml +0 -131
- novel_downloader-1.4.5/src/novel_downloader/resources/css_styles/main.css +0 -104
- novel_downloader-1.4.5/src/novel_downloader/resources/css_styles/volume-intro.css +0 -56
- novel_downloader-1.4.5/src/novel_downloader/resources/json/replace_word_map.json +0 -4
- novel_downloader-1.4.5/src/novel_downloader/resources/text/blacklist.txt +0 -22
- novel_downloader-1.4.5/src/novel_downloader/tui/__init__.py +0 -7
- novel_downloader-1.4.5/src/novel_downloader/tui/app.py +0 -32
- novel_downloader-1.4.5/src/novel_downloader/tui/main.py +0 -17
- novel_downloader-1.4.5/src/novel_downloader/tui/screens/__init__.py +0 -14
- novel_downloader-1.4.5/src/novel_downloader/tui/screens/home.py +0 -198
- novel_downloader-1.4.5/src/novel_downloader/tui/screens/login.py +0 -74
- novel_downloader-1.4.5/src/novel_downloader/tui/styles/home_layout.tcss +0 -79
- novel_downloader-1.4.5/src/novel_downloader/tui/widgets/richlog_handler.py +0 -24
- novel_downloader-1.4.5/src/novel_downloader/utils/__init__.py +0 -6
- novel_downloader-1.4.5/src/novel_downloader/utils/cache.py +0 -24
- novel_downloader-1.4.5/src/novel_downloader/utils/chapter_storage.py +0 -327
- novel_downloader-1.4.5/src/novel_downloader/utils/file_utils/__init__.py +0 -42
- novel_downloader-1.4.5/src/novel_downloader/utils/file_utils/io.py +0 -247
- novel_downloader-1.4.5/src/novel_downloader/utils/fontocr/__init__.py +0 -22
- novel_downloader-1.4.5/src/novel_downloader/utils/fontocr/model_loader.py +0 -69
- novel_downloader-1.4.5/src/novel_downloader/utils/fontocr/ocr_v1.py +0 -303
- novel_downloader-1.4.5/src/novel_downloader/utils/fontocr/ocr_v2.py +0 -752
- novel_downloader-1.4.5/src/novel_downloader/utils/hash_store.py +0 -279
- novel_downloader-1.4.5/src/novel_downloader/utils/hash_utils.py +0 -103
- novel_downloader-1.4.5/src/novel_downloader/utils/network.py +0 -300
- novel_downloader-1.4.5/src/novel_downloader/utils/state.py +0 -155
- novel_downloader-1.4.5/src/novel_downloader/utils/text_utils/__init__.py +0 -33
- novel_downloader-1.4.5/src/novel_downloader/utils/text_utils/chapter_formatting.py +0 -46
- novel_downloader-1.4.5/src/novel_downloader/utils/text_utils/font_mapping.py +0 -28
- novel_downloader-1.4.5/src/novel_downloader/utils/text_utils/text_cleaning.py +0 -107
- novel_downloader-1.4.5/src/novel_downloader/utils/time_utils/__init__.py +0 -22
- novel_downloader-1.4.5/src/novel_downloader.egg-info/PKG-INFO +0 -196
- novel_downloader-1.4.5/src/novel_downloader.egg-info/SOURCES.txt +0 -168
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/LICENSE +0 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/setup.cfg +0 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/__init__.py +2 -2
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/chapter_router.py +0 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/resources/images/volume_border.png +0 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/resources/js_scripts/qidian_decrypt_node.js +0 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/resources/json/linovelib_font_map.json +0 -0
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader/utils/file_utils/normalize.py +2 -2
- {novel_downloader-1.4.5 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/dependency_links.txt +0 -0
- {novel_downloader-1.4.5 → 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", "
|
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
|
-
"
|
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-
|
55
|
+
novel-web = "novel_downloader.web.main:web_main"
|
61
56
|
|
62
57
|
[project.urls]
|
63
|
-
Homepage = "https://github.com/
|
64
|
-
Source = "https://github.com/
|
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 = "
|
113
|
+
version = "2.0.0"
|
120
114
|
version_files = [
|
121
115
|
"src/novel_downloader/__init__.py"
|
122
116
|
]
|
@@ -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}")
|
@@ -0,0 +1,100 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
novel_downloader.cli.config
|
4
|
+
---------------------------
|
5
|
+
|
6
|
+
CLI subcommands for configuration file management.
|
7
|
+
"""
|
8
|
+
|
9
|
+
from __future__ import annotations
|
10
|
+
|
11
|
+
import shutil
|
12
|
+
from argparse import Namespace, _SubParsersAction
|
13
|
+
from importlib.resources import as_file
|
14
|
+
from pathlib import Path
|
15
|
+
|
16
|
+
from novel_downloader.cli import ui
|
17
|
+
from novel_downloader.config import save_config_file
|
18
|
+
from novel_downloader.utils.constants import DEFAULT_SETTINGS_PATHS
|
19
|
+
from novel_downloader.utils.i18n import t
|
20
|
+
from novel_downloader.utils.state import state_mgr
|
21
|
+
|
22
|
+
|
23
|
+
def register_config_subcommand(subparsers: _SubParsersAction) -> None: # type: ignore
|
24
|
+
"""Register `config` with `init`, `set-lang`, and `set-config` subcommands."""
|
25
|
+
parser = subparsers.add_parser("config", help=t("help_config"))
|
26
|
+
config_subparsers = parser.add_subparsers(dest="subcommand", required=True)
|
27
|
+
|
28
|
+
_register_init(config_subparsers)
|
29
|
+
_register_set_lang(config_subparsers)
|
30
|
+
_register_set_config(config_subparsers)
|
31
|
+
|
32
|
+
|
33
|
+
def _register_init(subparsers: _SubParsersAction) -> None: # type: ignore
|
34
|
+
parser = subparsers.add_parser("init", help=t("config_init_help"))
|
35
|
+
parser.add_argument(
|
36
|
+
"--force", action="store_true", help=t("config_init_force_help")
|
37
|
+
)
|
38
|
+
parser.set_defaults(func=_handle_init)
|
39
|
+
|
40
|
+
|
41
|
+
def _register_set_lang(subparsers: _SubParsersAction) -> None: # type: ignore
|
42
|
+
parser = subparsers.add_parser("set-lang", help=t("config_set_lang_help"))
|
43
|
+
parser.add_argument("lang", choices=["zh", "en"], help="Language code")
|
44
|
+
parser.set_defaults(func=_handle_set_lang)
|
45
|
+
|
46
|
+
|
47
|
+
def _register_set_config(subparsers: _SubParsersAction) -> None: # type: ignore
|
48
|
+
parser = subparsers.add_parser("set-config", help=t("config_set_config_help"))
|
49
|
+
parser.add_argument("path", type=str, help="Path to YAML config file")
|
50
|
+
parser.set_defaults(func=_handle_set_config)
|
51
|
+
|
52
|
+
|
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
|
+
"""
|
58
|
+
cwd = Path.cwd()
|
59
|
+
|
60
|
+
for resource in DEFAULT_SETTINGS_PATHS:
|
61
|
+
target_path = cwd / resource.name
|
62
|
+
should_copy = True
|
63
|
+
|
64
|
+
if target_path.exists():
|
65
|
+
if args.force:
|
66
|
+
ui.warn(t("config_init_overwrite", filename=resource.name))
|
67
|
+
else:
|
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,
|
72
|
+
)
|
73
|
+
|
74
|
+
if not should_copy:
|
75
|
+
ui.warn(t("config_init_skip", filename=resource.name))
|
76
|
+
continue
|
77
|
+
|
78
|
+
try:
|
79
|
+
with as_file(resource) as actual_path:
|
80
|
+
shutil.copy(actual_path, target_path)
|
81
|
+
ui.success(t("config_init_copy", filename=resource.name))
|
82
|
+
except Exception as e:
|
83
|
+
ui.error(t("config_init_error", filename=resource.name, err=str(e)))
|
84
|
+
raise
|
85
|
+
|
86
|
+
|
87
|
+
def _handle_set_lang(args: Namespace) -> None:
|
88
|
+
"""Set the UI language and persist in state manager."""
|
89
|
+
state_mgr.set_language(args.lang)
|
90
|
+
ui.success(t("config_set_lang", lang=args.lang))
|
91
|
+
|
92
|
+
|
93
|
+
def _handle_set_config(args: Namespace) -> None:
|
94
|
+
"""Persist a user-supplied TOML config path into the app config."""
|
95
|
+
try:
|
96
|
+
save_config_file(args.path)
|
97
|
+
ui.success(t("config_set_config", path=args.path))
|
98
|
+
except Exception as e:
|
99
|
+
ui.error(t("config_set_config_fail", err=str(e)))
|
100
|
+
raise
|