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.
- novel_downloader-2.0.0/PKG-INFO +171 -0
- novel_downloader-2.0.0/README.md +105 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/pyproject.toml +14 -20
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/__init__.py +1 -1
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/__init__.py +1 -3
- novel_downloader-2.0.0/src/novel_downloader/cli/clean.py +78 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/config.py +26 -21
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/download.py +77 -64
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/export.py +16 -20
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/cli/main.py +1 -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-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/config/__init__.py +8 -5
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/config/adapter.py +65 -105
- 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
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/__init__.py +1 -0
- 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-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
- 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-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/downloaders/base.py +49 -23
- 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-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/downloaders/registry.py +4 -2
- 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.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/base.py +33 -37
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/common/__init__.py +1 -2
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/common/epub.py +15 -10
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/common/main_exporter.py +19 -12
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/common/txt.py +14 -9
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/epub_util.py +59 -29
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/linovelib/__init__.py +1 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/linovelib/epub.py +23 -25
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/linovelib/main_exporter.py +8 -12
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/linovelib/txt.py +17 -11
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/qidian.py +2 -8
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/registry.py +4 -2
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/exporters/txt_util.py +7 -7
- 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.5.0/src/novel_downloader/core/fetchers/biquge/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/b520.py +6 -11
- 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
- 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
- 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.5.0/src/novel_downloader/core/fetchers/esjzone/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/esjzone.py +19 -12
- 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.5.0/src/novel_downloader/core/fetchers/qianbi/browser.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/i25zw.py +19 -28
- 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-2.0.0/src/novel_downloader/core/fetchers/lewenn.py +83 -0
- 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
- 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.5.0/src/novel_downloader/core/fetchers/qianbi/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/qianbi.py +5 -10
- 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
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/quanben5.py +92 -0
- {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
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/fetchers/registry.py +5 -16
- 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
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/shencou.py +106 -0
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/shuhaige.py +84 -0
- 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-2.0.0/src/novel_downloader/core/fetchers/wanbengo.py +83 -0
- 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.5.0/src/novel_downloader/core/fetchers/yamibo/session.py → novel_downloader-2.0.0/src/novel_downloader/core/fetchers/yamibo.py +19 -12
- novel_downloader-2.0.0/src/novel_downloader/core/fetchers/yibige.py +114 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/__init__.py +1 -9
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/downloader.py +6 -2
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/exporter.py +7 -7
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/interfaces/fetcher.py +4 -17
- {novel_downloader-1.5.0 → 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.5.0 → 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.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/esjzone.py +61 -66
- 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.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/linovelib.py +48 -64
- 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.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qianbi.py +48 -50
- 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.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/chapter_normal.py +24 -55
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/main_parser.py +11 -38
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/__init__.py +1 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py +1 -1
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/qidian/utils/fontmap_recover.py +143 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/helpers.py +0 -4
- novel_downloader-2.0.0/src/novel_downloader/core/parsers/quanben5.py +103 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/registry.py +5 -16
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/sfacg.py +38 -45
- 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-1.5.0/src/novel_downloader/core/searchers/biquge.py → novel_downloader-2.0.0/src/novel_downloader/core/searchers/b520.py +29 -28
- 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-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/searchers/esjzone.py +43 -25
- 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-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/searchers/registry.py +24 -8
- 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-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/models/__init__.py +21 -22
- novel_downloader-2.0.0/src/novel_downloader/models/book.py +44 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/models/config.py +4 -37
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/models/login.py +1 -1
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/models/search.py +5 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/config/settings.toml +8 -70
- novel_downloader-2.0.0/src/novel_downloader/resources/json/xiguashuwu.json +718 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/__init__.py +13 -22
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/chapter_storage.py +3 -2
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/constants.py +4 -29
- {novel_downloader-1.5.0 → 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.5.0/src/novel_downloader/utils/crypto_utils.py → novel_downloader-2.0.0/src/novel_downloader/utils/crypto_utils/rc4.py +3 -10
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/__init__.py +1 -1
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/constants.py +57 -16
- novel_downloader-2.0.0/src/novel_downloader/utils/epub/documents.py +297 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/models.py +0 -14
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/utils.py +63 -96
- novel_downloader-2.0.0/src/novel_downloader/utils/file_utils/__init__.py +17 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/file_utils/io.py +3 -113
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/file_utils/sanitize.py +0 -4
- novel_downloader-2.0.0/src/novel_downloader/utils/fontocr.py +207 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/logger.py +8 -16
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/network.py +2 -2
- novel_downloader-2.0.0/src/novel_downloader/utils/state.py +70 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/__init__.py +1 -7
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/diff_display.py +5 -7
- novel_downloader-2.0.0/src/novel_downloader/utils/time_utils/__init__.py +16 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/time_utils/datetime_utils.py +20 -29
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/time_utils/sleep_utils.py +4 -8
- 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-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/SOURCES.txt +105 -59
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/entry_points.txt +1 -1
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/requires.txt +2 -7
- novel_downloader-1.5.0/PKG-INFO +0 -196
- novel_downloader-1.5.0/README.md +0 -125
- novel_downloader-1.5.0/src/novel_downloader/cli/clean.py +0 -145
- novel_downloader-1.5.0/src/novel_downloader/cli/search.py +0 -123
- novel_downloader-1.5.0/src/novel_downloader/core/downloaders/__init__.py +0 -40
- novel_downloader-1.5.0/src/novel_downloader/core/downloaders/biquge.py +0 -29
- novel_downloader-1.5.0/src/novel_downloader/core/downloaders/common.py +0 -227
- novel_downloader-1.5.0/src/novel_downloader/core/downloaders/esjzone.py +0 -29
- novel_downloader-1.5.0/src/novel_downloader/core/downloaders/linovelib.py +0 -29
- novel_downloader-1.5.0/src/novel_downloader/core/downloaders/qianbi.py +0 -312
- novel_downloader-1.5.0/src/novel_downloader/core/downloaders/qidian.py +0 -290
- novel_downloader-1.5.0/src/novel_downloader/core/downloaders/sfacg.py +0 -29
- novel_downloader-1.5.0/src/novel_downloader/core/downloaders/yamibo.py +0 -29
- novel_downloader-1.5.0/src/novel_downloader/core/exporters/__init__.py +0 -36
- novel_downloader-1.5.0/src/novel_downloader/core/exporters/biquge.py +0 -22
- novel_downloader-1.5.0/src/novel_downloader/core/exporters/esjzone.py +0 -22
- novel_downloader-1.5.0/src/novel_downloader/core/exporters/qianbi.py +0 -22
- novel_downloader-1.5.0/src/novel_downloader/core/exporters/sfacg.py +0 -22
- novel_downloader-1.5.0/src/novel_downloader/core/exporters/yamibo.py +0 -22
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/__init__.py +0 -67
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/base/__init__.py +0 -14
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/base/browser.py +0 -422
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/biquge/__init__.py +0 -14
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/esjzone/__init__.py +0 -14
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/esjzone/browser.py +0 -209
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/linovelib/__init__.py +0 -14
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/linovelib/browser.py +0 -198
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qianbi/__init__.py +0 -14
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qidian/__init__.py +0 -14
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/qidian/browser.py +0 -326
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/sfacg/__init__.py +0 -14
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/sfacg/browser.py +0 -194
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/yamibo/__init__.py +0 -14
- novel_downloader-1.5.0/src/novel_downloader/core/fetchers/yamibo/browser.py +0 -234
- novel_downloader-1.5.0/src/novel_downloader/core/interfaces/searcher.py +0 -18
- novel_downloader-1.5.0/src/novel_downloader/core/parsers/__init__.py +0 -37
- novel_downloader-1.5.0/src/novel_downloader/core/parsers/biquge.py +0 -139
- novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/book_info_parser.py +0 -90
- novel_downloader-1.5.0/src/novel_downloader/core/parsers/qidian/chapter_encrypted.py +0 -528
- novel_downloader-1.5.0/src/novel_downloader/core/parsers/yamibo.py +0 -199
- novel_downloader-1.5.0/src/novel_downloader/core/searchers/__init__.py +0 -20
- novel_downloader-1.5.0/src/novel_downloader/core/searchers/base.py +0 -92
- novel_downloader-1.5.0/src/novel_downloader/core/searchers/qianbi.py +0 -131
- novel_downloader-1.5.0/src/novel_downloader/locales/en.json +0 -126
- novel_downloader-1.5.0/src/novel_downloader/locales/zh.json +0 -126
- novel_downloader-1.5.0/src/novel_downloader/models/chapter.py +0 -25
- novel_downloader-1.5.0/src/novel_downloader/models/types.py +0 -13
- novel_downloader-1.5.0/src/novel_downloader/tui/__init__.py +0 -7
- novel_downloader-1.5.0/src/novel_downloader/tui/app.py +0 -32
- novel_downloader-1.5.0/src/novel_downloader/tui/main.py +0 -17
- novel_downloader-1.5.0/src/novel_downloader/tui/screens/__init__.py +0 -14
- novel_downloader-1.5.0/src/novel_downloader/tui/screens/home.py +0 -198
- novel_downloader-1.5.0/src/novel_downloader/tui/screens/login.py +0 -74
- novel_downloader-1.5.0/src/novel_downloader/tui/styles/home_layout.tcss +0 -79
- novel_downloader-1.5.0/src/novel_downloader/tui/widgets/richlog_handler.py +0 -24
- novel_downloader-1.5.0/src/novel_downloader/utils/cache.py +0 -24
- novel_downloader-1.5.0/src/novel_downloader/utils/epub/documents.py +0 -403
- novel_downloader-1.5.0/src/novel_downloader/utils/file_utils/__init__.py +0 -38
- novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/__init__.py +0 -22
- novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/hash_store.py +0 -280
- novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/hash_utils.py +0 -103
- novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/model_loader.py +0 -69
- novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/ocr_v1.py +0 -315
- novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/ocr_v2.py +0 -764
- novel_downloader-1.5.0/src/novel_downloader/utils/fontocr/ocr_v3.py +0 -744
- novel_downloader-1.5.0/src/novel_downloader/utils/state.py +0 -156
- novel_downloader-1.5.0/src/novel_downloader/utils/time_utils/__init__.py +0 -22
- novel_downloader-1.5.0/src/novel_downloader.egg-info/PKG-INFO +0 -196
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/LICENSE +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/setup.cfg +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/__init__.py +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/chapter_router.py +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/core/parsers/qidian/utils/node_decryptor.py +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/css_styles/intro.css +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/css_styles/main.css +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/images/volume_border.png +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/js_scripts/qidian_decrypt_node.js +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/resources/json/linovelib_font_map.json +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/epub/builder.py +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/file_utils/normalize.py +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/i18n.py +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/numeric_conversion.py +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/text_cleaner.py +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader/utils/text_utils/truncate_utils.py +0 -0
- {novel_downloader-1.5.0 → novel_downloader-2.0.0}/src/novel_downloader.egg-info/dependency_links.txt +0 -0
- {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", "
|
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}")
|
@@ -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("
|
34
|
+
parser = subparsers.add_parser("init", help=t("config_init_help"))
|
31
35
|
parser.add_argument(
|
32
|
-
"--force", action="store_true", help=t("
|
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("
|
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("
|
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
|
-
|
66
|
+
ui.warn(t("config_init_overwrite", filename=resource.name))
|
59
67
|
else:
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
-
|
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
|
-
|
81
|
+
ui.success(t("config_init_copy", filename=resource.name))
|
79
82
|
except Exception as e:
|
80
|
-
|
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
|
-
|
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
|
-
|
97
|
+
ui.success(t("config_set_config", path=args.path))
|
93
98
|
except Exception as e:
|
94
|
-
|
99
|
+
ui.error(t("config_set_config_fail", err=str(e)))
|
95
100
|
raise
|