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