novel-downloader 1.4.3__tar.gz → 1.4.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. {novel_downloader-1.4.3 → novel_downloader-1.4.5}/PKG-INFO +1 -1
  2. {novel_downloader-1.4.3 → novel_downloader-1.4.5}/pyproject.toml +4 -2
  3. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/__init__.py +1 -1
  4. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/qidian/browser.py +2 -2
  5. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/qidian/session.py +2 -1
  6. novel_downloader-1.4.5/src/novel_downloader/core/parsers/qidian/book_info_parser.py +90 -0
  7. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/tui/screens/login.py +1 -1
  8. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/time_utils/datetime_utils.py +1 -1
  9. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader.egg-info/PKG-INFO +1 -1
  10. novel_downloader-1.4.5/src/novel_downloader.egg-info/SOURCES.txt +168 -0
  11. novel_downloader-1.4.3/novel_downloader/core/parsers/qidian/book_info_parser.py +0 -113
  12. novel_downloader-1.4.3/novel_downloader.egg-info/SOURCES.txt +0 -168
  13. {novel_downloader-1.4.3 → novel_downloader-1.4.5}/LICENSE +0 -0
  14. {novel_downloader-1.4.3 → novel_downloader-1.4.5}/README.md +0 -0
  15. {novel_downloader-1.4.3 → novel_downloader-1.4.5}/setup.cfg +0 -0
  16. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/cli/__init__.py +0 -0
  17. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/cli/clean.py +0 -0
  18. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/cli/config.py +0 -0
  19. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/cli/download.py +0 -0
  20. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/cli/export.py +0 -0
  21. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/cli/main.py +0 -0
  22. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/config/__init__.py +0 -0
  23. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/config/adapter.py +0 -0
  24. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/config/loader.py +0 -0
  25. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/config/site_rules.py +0 -0
  26. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/__init__.py +0 -0
  27. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/__init__.py +0 -0
  28. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/base.py +0 -0
  29. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/biquge.py +0 -0
  30. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/common.py +0 -0
  31. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/esjzone.py +0 -0
  32. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/linovelib.py +0 -0
  33. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/qianbi.py +0 -0
  34. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/qidian.py +0 -0
  35. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/sfacg.py +0 -0
  36. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/downloaders/yamibo.py +0 -0
  37. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/__init__.py +0 -0
  38. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/base.py +0 -0
  39. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/biquge.py +0 -0
  40. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/common/__init__.py +0 -0
  41. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/common/epub.py +0 -0
  42. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/common/main_exporter.py +0 -0
  43. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/common/txt.py +0 -0
  44. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/epub_util.py +0 -0
  45. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/esjzone.py +0 -0
  46. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/linovelib/__init__.py +0 -0
  47. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/linovelib/epub.py +0 -0
  48. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/linovelib/main_exporter.py +0 -0
  49. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/linovelib/txt.py +0 -0
  50. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/qianbi.py +0 -0
  51. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/qidian.py +0 -0
  52. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/sfacg.py +0 -0
  53. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/exporters/yamibo.py +0 -0
  54. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/factory/__init__.py +0 -0
  55. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/factory/downloader.py +0 -0
  56. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/factory/exporter.py +0 -0
  57. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/factory/fetcher.py +0 -0
  58. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/factory/parser.py +0 -0
  59. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/__init__.py +0 -0
  60. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/base/__init__.py +0 -0
  61. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/base/browser.py +0 -0
  62. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/base/rate_limiter.py +0 -0
  63. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/base/session.py +0 -0
  64. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/biquge/__init__.py +0 -0
  65. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/biquge/browser.py +0 -0
  66. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/biquge/session.py +0 -0
  67. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/common/__init__.py +0 -0
  68. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/common/browser.py +0 -0
  69. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/common/session.py +0 -0
  70. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/esjzone/__init__.py +0 -0
  71. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/esjzone/browser.py +0 -0
  72. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/esjzone/session.py +0 -0
  73. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/linovelib/__init__.py +0 -0
  74. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/linovelib/browser.py +0 -0
  75. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/linovelib/session.py +0 -0
  76. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/qianbi/__init__.py +0 -0
  77. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/qianbi/browser.py +0 -0
  78. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/qianbi/session.py +0 -0
  79. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/qidian/__init__.py +0 -0
  80. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/sfacg/__init__.py +0 -0
  81. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/sfacg/browser.py +0 -0
  82. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/sfacg/session.py +0 -0
  83. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/yamibo/__init__.py +0 -0
  84. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/yamibo/browser.py +0 -0
  85. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/fetchers/yamibo/session.py +0 -0
  86. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/interfaces/__init__.py +0 -0
  87. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/interfaces/downloader.py +0 -0
  88. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/interfaces/exporter.py +0 -0
  89. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/interfaces/fetcher.py +0 -0
  90. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/interfaces/parser.py +0 -0
  91. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/__init__.py +0 -0
  92. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/base.py +0 -0
  93. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/biquge/__init__.py +0 -0
  94. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/biquge/main_parser.py +0 -0
  95. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/common/__init__.py +0 -0
  96. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/common/helper.py +0 -0
  97. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/common/main_parser.py +0 -0
  98. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/esjzone/__init__.py +0 -0
  99. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/esjzone/main_parser.py +0 -0
  100. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/linovelib/__init__.py +0 -0
  101. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/linovelib/main_parser.py +0 -0
  102. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qianbi/__init__.py +0 -0
  103. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qianbi/main_parser.py +0 -0
  104. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qidian/__init__.py +0 -0
  105. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qidian/chapter_encrypted.py +0 -0
  106. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qidian/chapter_normal.py +0 -0
  107. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qidian/chapter_router.py +0 -0
  108. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qidian/main_parser.py +0 -0
  109. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qidian/utils/__init__.py +0 -0
  110. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py +0 -0
  111. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qidian/utils/helpers.py +0 -0
  112. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/qidian/utils/node_decryptor.py +0 -0
  113. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/sfacg/__init__.py +0 -0
  114. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/sfacg/main_parser.py +0 -0
  115. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/yamibo/__init__.py +0 -0
  116. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/core/parsers/yamibo/main_parser.py +0 -0
  117. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/locales/en.json +0 -0
  118. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/locales/zh.json +0 -0
  119. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/models/__init__.py +0 -0
  120. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/models/browser.py +0 -0
  121. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/models/chapter.py +0 -0
  122. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/models/config.py +0 -0
  123. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/models/login.py +0 -0
  124. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/models/site_rules.py +0 -0
  125. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/models/tasks.py +0 -0
  126. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/models/types.py +0 -0
  127. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/resources/config/settings.toml +0 -0
  128. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/resources/css_styles/main.css +0 -0
  129. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/resources/css_styles/volume-intro.css +0 -0
  130. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/resources/images/volume_border.png +0 -0
  131. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/resources/js_scripts/qidian_decrypt_node.js +0 -0
  132. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/resources/json/linovelib_font_map.json +0 -0
  133. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/resources/json/replace_word_map.json +0 -0
  134. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/resources/text/blacklist.txt +0 -0
  135. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/tui/__init__.py +0 -0
  136. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/tui/app.py +0 -0
  137. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/tui/main.py +0 -0
  138. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/tui/screens/__init__.py +0 -0
  139. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/tui/screens/home.py +0 -0
  140. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/tui/styles/home_layout.tcss +0 -0
  141. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/tui/widgets/richlog_handler.py +0 -0
  142. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/__init__.py +0 -0
  143. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/cache.py +0 -0
  144. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/chapter_storage.py +0 -0
  145. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/constants.py +0 -0
  146. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/cookies.py +0 -0
  147. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/crypto_utils.py +0 -0
  148. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/file_utils/__init__.py +0 -0
  149. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/file_utils/io.py +0 -0
  150. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/file_utils/normalize.py +0 -0
  151. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/file_utils/sanitize.py +0 -0
  152. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/fontocr/__init__.py +0 -0
  153. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/fontocr/model_loader.py +0 -0
  154. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/fontocr/ocr_v1.py +0 -0
  155. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/fontocr/ocr_v2.py +0 -0
  156. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/hash_store.py +0 -0
  157. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/hash_utils.py +0 -0
  158. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/i18n.py +0 -0
  159. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/logger.py +0 -0
  160. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/network.py +0 -0
  161. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/state.py +0 -0
  162. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/text_utils/__init__.py +0 -0
  163. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/text_utils/chapter_formatting.py +0 -0
  164. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/text_utils/diff_display.py +0 -0
  165. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/text_utils/font_mapping.py +0 -0
  166. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/text_utils/text_cleaning.py +0 -0
  167. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/time_utils/__init__.py +0 -0
  168. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader/utils/time_utils/sleep_utils.py +0 -0
  169. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader.egg-info/dependency_links.txt +0 -0
  170. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader.egg-info/entry_points.txt +0 -0
  171. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader.egg-info/requires.txt +0 -0
  172. {novel_downloader-1.4.3 → novel_downloader-1.4.5/src}/novel_downloader.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: novel-downloader
3
- Version: 1.4.3
3
+ Version: 1.4.5
4
4
  Summary: A command-line tool for downloading Chinese web novels from Qidian and similar platforms.
5
5
  Author-email: Saudade Z <saudadez217@gmail.com>
6
6
  License: MIT License
@@ -68,6 +68,7 @@ requires = ["setuptools>=61.0", "wheel"]
68
68
  build-backend = "setuptools.build_meta"
69
69
 
70
70
  [tool.setuptools.packages.find]
71
+ where = ["src"]
71
72
  include = ["novel_downloader", "novel_downloader.*"]
72
73
 
73
74
  [tool.setuptools.package-data]
@@ -110,13 +111,14 @@ strict = true
110
111
  [tool.pytest.ini_options]
111
112
  minversion = "7.1"
112
113
  addopts = "--strict-markers"
114
+ pythonpath = ["src"]
113
115
  testpaths = ["tests"]
114
116
 
115
117
  [tool.commitizen]
116
118
  name = "cz_conventional_commits"
117
- version = "1.4.3"
119
+ version = "1.4.5"
118
120
  version_files = [
119
- "novel_downloader/__init__.py"
121
+ "src/novel_downloader/__init__.py"
120
122
  ]
121
123
  update_changelog_on_bump = true
122
124
  changelog_file = "CHANGELOG.md"
@@ -6,7 +6,7 @@ novel_downloader
6
6
  Core package for the Novel Downloader project.
7
7
  """
8
8
 
9
- __version__ = "1.4.3"
9
+ __version__ = "1.4.5"
10
10
 
11
11
  __author__ = "Saudade Z"
12
12
  __email__ = "saudadez217@gmail.com"
@@ -22,8 +22,8 @@ class QidianBrowser(BaseBrowser):
22
22
 
23
23
  HOMEPAGE_URL = "https://www.qidian.com/"
24
24
  BOOKCASE_URL = "https://my.qidian.com/bookcase/"
25
- BOOK_INFO_URL = "https://book.qidian.com/info/{book_id}/"
26
- # BOOK_INFO_URL = "https://www.qidian.com/book/{book_id}/"
25
+ # BOOK_INFO_URL = "https://book.qidian.com/info/{book_id}/"
26
+ BOOK_INFO_URL = "https://www.qidian.com/book/{book_id}/"
27
27
  CHAPTER_URL = "https://www.qidian.com/chapter/{book_id}/{chapter_id}/"
28
28
 
29
29
  LOGIN_URL = "https://passport.qidian.com/"
@@ -27,7 +27,8 @@ class QidianSession(BaseSession):
27
27
 
28
28
  HOMEPAGE_URL = "https://www.qidian.com/"
29
29
  BOOKCASE_URL = "https://my.qidian.com/bookcase/"
30
- BOOK_INFO_URL = "https://book.qidian.com/info/{book_id}/"
30
+ # BOOK_INFO_URL = "https://book.qidian.com/info/{book_id}/"
31
+ BOOK_INFO_URL = "https://www.qidian.com/book/{book_id}/"
31
32
  CHAPTER_URL = "https://www.qidian.com/chapter/{book_id}/{chapter_id}/"
32
33
 
33
34
  LOGIN_URL = "https://passport.qidian.com/"
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ novel_downloader.core.parsers.qidian.book_info_parser
4
+ -----------------------------------------------------
5
+
6
+ This module provides parsing of Qidian book info pages.
7
+
8
+ It extracts metadata such as title, author, cover URL, update
9
+ time, status, word count, summary, and volume-chapter structure.
10
+ """
11
+
12
+ import logging
13
+ import re
14
+ from datetime import datetime
15
+ from typing import Any
16
+
17
+ from lxml import html
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ def _chapter_url_to_id(url: str) -> str:
23
+ return url.rstrip("/").split("/")[-1]
24
+
25
+
26
+ def parse_book_info(html_str: str) -> dict[str, Any]:
27
+ """
28
+ Extract metadata: title, author, cover_url, update_time, status,
29
+ word_count, summary, and volumes with chapters.
30
+
31
+ :param html_str: Raw HTML of the book info page.
32
+ :return: A dict containing book metadata.
33
+ """
34
+ info: dict[str, Any] = {}
35
+ try:
36
+ doc = html.fromstring(html_str)
37
+
38
+ info["book_name"] = doc.xpath('string(//h1[@id="bookName"])').strip()
39
+
40
+ info["author"] = doc.xpath('string(//a[@class="writer-name"])').strip()
41
+
42
+ book_id = doc.xpath('//a[@id="bookImg"]/@data-bid')[0]
43
+ info[
44
+ "cover_url"
45
+ ] = f"https://bookcover.yuewen.com/qdbimg/349573/{book_id}/600.webp"
46
+
47
+ ut = (
48
+ doc.xpath('string(//span[@class="update-time"])')
49
+ .replace("更新时间:", "")
50
+ .strip()
51
+ )
52
+ if re.match(r"^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$", ut):
53
+ info["update_time"] = ut
54
+ else:
55
+ info["update_time"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
56
+
57
+ info["serial_status"] = doc.xpath(
58
+ 'string(//p[@class="book-attribute"]/span[1])'
59
+ ).strip()
60
+
61
+ tags = doc.xpath('//p[contains(@class,"all-label")]//a/text()')
62
+ info["tags"] = [t.strip() for t in tags if t.strip()]
63
+
64
+ info["word_count"] = doc.xpath('string(//p[@class="count"]/em[1])').strip()
65
+
66
+ summary = doc.xpath('string(//p[@class="intro"])').strip()
67
+ info["summary_brief"] = summary
68
+
69
+ raw = doc.xpath('//p[@id="book-intro-detail"]//text()')
70
+ info["summary"] = "\n".join(line.strip() for line in raw if line.strip())
71
+
72
+ volumes = []
73
+ for vol in doc.xpath('//div[@id="allCatalog"]//div[@class="catalog-volume"]'):
74
+ vol_name = vol.xpath('string(.//h3[@class="volume-name"])').strip()
75
+ vol_name = vol_name.split(chr(183))[0].strip()
76
+ chapters = []
77
+ for li in vol.xpath('.//ul[contains(@class,"volume-chapters")]/li'):
78
+ a = li.xpath('.//a[@class="chapter-name"]')[0]
79
+ title = a.text.strip()
80
+ url = a.get("href")
81
+ chapters.append(
82
+ {"title": title, "url": url, "chapterId": _chapter_url_to_id(url)}
83
+ )
84
+ volumes.append({"volume_name": vol_name, "chapters": chapters})
85
+ info["volumes"] = volumes
86
+
87
+ except Exception as e:
88
+ logger.warning("[Parser] Error parsing book info: %s", e)
89
+
90
+ return info
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
  """
3
3
  novel_downloader.tui.screens.login
4
- ---------------------------------
4
+ ----------------------------------
5
5
 
6
6
  """
7
7
 
@@ -138,7 +138,7 @@ def calculate_time_difference(
138
138
 
139
139
  except Exception as e:
140
140
  logger.warning("[time] Failed to calculate time difference: %s", e)
141
- return 0, 0, 0, 0
141
+ return 999, 23, 59, 59
142
142
 
143
143
 
144
144
  __all__ = [
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: novel-downloader
3
- Version: 1.4.3
3
+ Version: 1.4.5
4
4
  Summary: A command-line tool for downloading Chinese web novels from Qidian and similar platforms.
5
5
  Author-email: Saudade Z <saudadez217@gmail.com>
6
6
  License: MIT License
@@ -0,0 +1,168 @@
1
+ LICENSE
2
+ README.md
3
+ pyproject.toml
4
+ src/novel_downloader/__init__.py
5
+ src/novel_downloader.egg-info/PKG-INFO
6
+ src/novel_downloader.egg-info/SOURCES.txt
7
+ src/novel_downloader.egg-info/dependency_links.txt
8
+ src/novel_downloader.egg-info/entry_points.txt
9
+ src/novel_downloader.egg-info/requires.txt
10
+ src/novel_downloader.egg-info/top_level.txt
11
+ src/novel_downloader/cli/__init__.py
12
+ src/novel_downloader/cli/clean.py
13
+ src/novel_downloader/cli/config.py
14
+ src/novel_downloader/cli/download.py
15
+ src/novel_downloader/cli/export.py
16
+ src/novel_downloader/cli/main.py
17
+ src/novel_downloader/config/__init__.py
18
+ src/novel_downloader/config/adapter.py
19
+ src/novel_downloader/config/loader.py
20
+ src/novel_downloader/config/site_rules.py
21
+ src/novel_downloader/core/__init__.py
22
+ src/novel_downloader/core/downloaders/__init__.py
23
+ src/novel_downloader/core/downloaders/base.py
24
+ src/novel_downloader/core/downloaders/biquge.py
25
+ src/novel_downloader/core/downloaders/common.py
26
+ src/novel_downloader/core/downloaders/esjzone.py
27
+ src/novel_downloader/core/downloaders/linovelib.py
28
+ src/novel_downloader/core/downloaders/qianbi.py
29
+ src/novel_downloader/core/downloaders/qidian.py
30
+ src/novel_downloader/core/downloaders/sfacg.py
31
+ src/novel_downloader/core/downloaders/yamibo.py
32
+ src/novel_downloader/core/exporters/__init__.py
33
+ src/novel_downloader/core/exporters/base.py
34
+ src/novel_downloader/core/exporters/biquge.py
35
+ src/novel_downloader/core/exporters/epub_util.py
36
+ src/novel_downloader/core/exporters/esjzone.py
37
+ src/novel_downloader/core/exporters/qianbi.py
38
+ src/novel_downloader/core/exporters/qidian.py
39
+ src/novel_downloader/core/exporters/sfacg.py
40
+ src/novel_downloader/core/exporters/yamibo.py
41
+ src/novel_downloader/core/exporters/common/__init__.py
42
+ src/novel_downloader/core/exporters/common/epub.py
43
+ src/novel_downloader/core/exporters/common/main_exporter.py
44
+ src/novel_downloader/core/exporters/common/txt.py
45
+ src/novel_downloader/core/exporters/linovelib/__init__.py
46
+ src/novel_downloader/core/exporters/linovelib/epub.py
47
+ src/novel_downloader/core/exporters/linovelib/main_exporter.py
48
+ src/novel_downloader/core/exporters/linovelib/txt.py
49
+ src/novel_downloader/core/factory/__init__.py
50
+ src/novel_downloader/core/factory/downloader.py
51
+ src/novel_downloader/core/factory/exporter.py
52
+ src/novel_downloader/core/factory/fetcher.py
53
+ src/novel_downloader/core/factory/parser.py
54
+ src/novel_downloader/core/fetchers/__init__.py
55
+ src/novel_downloader/core/fetchers/base/__init__.py
56
+ src/novel_downloader/core/fetchers/base/browser.py
57
+ src/novel_downloader/core/fetchers/base/rate_limiter.py
58
+ src/novel_downloader/core/fetchers/base/session.py
59
+ src/novel_downloader/core/fetchers/biquge/__init__.py
60
+ src/novel_downloader/core/fetchers/biquge/browser.py
61
+ src/novel_downloader/core/fetchers/biquge/session.py
62
+ src/novel_downloader/core/fetchers/common/__init__.py
63
+ src/novel_downloader/core/fetchers/common/browser.py
64
+ src/novel_downloader/core/fetchers/common/session.py
65
+ src/novel_downloader/core/fetchers/esjzone/__init__.py
66
+ src/novel_downloader/core/fetchers/esjzone/browser.py
67
+ src/novel_downloader/core/fetchers/esjzone/session.py
68
+ src/novel_downloader/core/fetchers/linovelib/__init__.py
69
+ src/novel_downloader/core/fetchers/linovelib/browser.py
70
+ src/novel_downloader/core/fetchers/linovelib/session.py
71
+ src/novel_downloader/core/fetchers/qianbi/__init__.py
72
+ src/novel_downloader/core/fetchers/qianbi/browser.py
73
+ src/novel_downloader/core/fetchers/qianbi/session.py
74
+ src/novel_downloader/core/fetchers/qidian/__init__.py
75
+ src/novel_downloader/core/fetchers/qidian/browser.py
76
+ src/novel_downloader/core/fetchers/qidian/session.py
77
+ src/novel_downloader/core/fetchers/sfacg/__init__.py
78
+ src/novel_downloader/core/fetchers/sfacg/browser.py
79
+ src/novel_downloader/core/fetchers/sfacg/session.py
80
+ src/novel_downloader/core/fetchers/yamibo/__init__.py
81
+ src/novel_downloader/core/fetchers/yamibo/browser.py
82
+ src/novel_downloader/core/fetchers/yamibo/session.py
83
+ src/novel_downloader/core/interfaces/__init__.py
84
+ src/novel_downloader/core/interfaces/downloader.py
85
+ src/novel_downloader/core/interfaces/exporter.py
86
+ src/novel_downloader/core/interfaces/fetcher.py
87
+ src/novel_downloader/core/interfaces/parser.py
88
+ src/novel_downloader/core/parsers/__init__.py
89
+ src/novel_downloader/core/parsers/base.py
90
+ src/novel_downloader/core/parsers/biquge/__init__.py
91
+ src/novel_downloader/core/parsers/biquge/main_parser.py
92
+ src/novel_downloader/core/parsers/common/__init__.py
93
+ src/novel_downloader/core/parsers/common/helper.py
94
+ src/novel_downloader/core/parsers/common/main_parser.py
95
+ src/novel_downloader/core/parsers/esjzone/__init__.py
96
+ src/novel_downloader/core/parsers/esjzone/main_parser.py
97
+ src/novel_downloader/core/parsers/linovelib/__init__.py
98
+ src/novel_downloader/core/parsers/linovelib/main_parser.py
99
+ src/novel_downloader/core/parsers/qianbi/__init__.py
100
+ src/novel_downloader/core/parsers/qianbi/main_parser.py
101
+ src/novel_downloader/core/parsers/qidian/__init__.py
102
+ src/novel_downloader/core/parsers/qidian/book_info_parser.py
103
+ src/novel_downloader/core/parsers/qidian/chapter_encrypted.py
104
+ src/novel_downloader/core/parsers/qidian/chapter_normal.py
105
+ src/novel_downloader/core/parsers/qidian/chapter_router.py
106
+ src/novel_downloader/core/parsers/qidian/main_parser.py
107
+ src/novel_downloader/core/parsers/qidian/utils/__init__.py
108
+ src/novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py
109
+ src/novel_downloader/core/parsers/qidian/utils/helpers.py
110
+ src/novel_downloader/core/parsers/qidian/utils/node_decryptor.py
111
+ src/novel_downloader/core/parsers/sfacg/__init__.py
112
+ src/novel_downloader/core/parsers/sfacg/main_parser.py
113
+ src/novel_downloader/core/parsers/yamibo/__init__.py
114
+ src/novel_downloader/core/parsers/yamibo/main_parser.py
115
+ src/novel_downloader/locales/en.json
116
+ src/novel_downloader/locales/zh.json
117
+ src/novel_downloader/models/__init__.py
118
+ src/novel_downloader/models/browser.py
119
+ src/novel_downloader/models/chapter.py
120
+ src/novel_downloader/models/config.py
121
+ src/novel_downloader/models/login.py
122
+ src/novel_downloader/models/site_rules.py
123
+ src/novel_downloader/models/tasks.py
124
+ src/novel_downloader/models/types.py
125
+ src/novel_downloader/resources/config/settings.toml
126
+ src/novel_downloader/resources/css_styles/main.css
127
+ src/novel_downloader/resources/css_styles/volume-intro.css
128
+ src/novel_downloader/resources/images/volume_border.png
129
+ src/novel_downloader/resources/js_scripts/qidian_decrypt_node.js
130
+ src/novel_downloader/resources/json/linovelib_font_map.json
131
+ src/novel_downloader/resources/json/replace_word_map.json
132
+ src/novel_downloader/resources/text/blacklist.txt
133
+ src/novel_downloader/tui/__init__.py
134
+ src/novel_downloader/tui/app.py
135
+ src/novel_downloader/tui/main.py
136
+ src/novel_downloader/tui/screens/__init__.py
137
+ src/novel_downloader/tui/screens/home.py
138
+ src/novel_downloader/tui/screens/login.py
139
+ src/novel_downloader/tui/styles/home_layout.tcss
140
+ src/novel_downloader/tui/widgets/richlog_handler.py
141
+ src/novel_downloader/utils/__init__.py
142
+ src/novel_downloader/utils/cache.py
143
+ src/novel_downloader/utils/chapter_storage.py
144
+ src/novel_downloader/utils/constants.py
145
+ src/novel_downloader/utils/cookies.py
146
+ src/novel_downloader/utils/crypto_utils.py
147
+ src/novel_downloader/utils/hash_store.py
148
+ src/novel_downloader/utils/hash_utils.py
149
+ src/novel_downloader/utils/i18n.py
150
+ src/novel_downloader/utils/logger.py
151
+ src/novel_downloader/utils/network.py
152
+ src/novel_downloader/utils/state.py
153
+ src/novel_downloader/utils/file_utils/__init__.py
154
+ src/novel_downloader/utils/file_utils/io.py
155
+ src/novel_downloader/utils/file_utils/normalize.py
156
+ src/novel_downloader/utils/file_utils/sanitize.py
157
+ src/novel_downloader/utils/fontocr/__init__.py
158
+ src/novel_downloader/utils/fontocr/model_loader.py
159
+ src/novel_downloader/utils/fontocr/ocr_v1.py
160
+ src/novel_downloader/utils/fontocr/ocr_v2.py
161
+ src/novel_downloader/utils/text_utils/__init__.py
162
+ src/novel_downloader/utils/text_utils/chapter_formatting.py
163
+ src/novel_downloader/utils/text_utils/diff_display.py
164
+ src/novel_downloader/utils/text_utils/font_mapping.py
165
+ src/novel_downloader/utils/text_utils/text_cleaning.py
166
+ src/novel_downloader/utils/time_utils/__init__.py
167
+ src/novel_downloader/utils/time_utils/datetime_utils.py
168
+ src/novel_downloader/utils/time_utils/sleep_utils.py
@@ -1,113 +0,0 @@
1
- #!/usr/bin/env python3
2
- """
3
- novel_downloader.core.parsers.qidian.book_info_parser
4
- -----------------------------------------------------
5
-
6
- This module provides parsing of Qidian book info pages.
7
-
8
- It extracts metadata such as title, author, cover URL, update
9
- time, status, word count, summary, and volume-chapter structure.
10
- """
11
-
12
- import logging
13
- from typing import Any
14
-
15
- from lxml import html
16
-
17
- logger = logging.getLogger(__name__)
18
-
19
- _AUTHOR_XPATH = (
20
- 'string(//div[contains(@class, "book-info")]//a[contains(@class, "writer")])'
21
- )
22
-
23
-
24
- def _chapter_url_to_id(url: str) -> str:
25
- return url.rstrip("/").split("/")[-1]
26
-
27
-
28
- def _get_volume_name(
29
- vol_elem: html.HtmlElement,
30
- ) -> str:
31
- """
32
- Extracts the volume title from a <div class="volume"> element using lxml.
33
- Ignores <a> tags, and extracts text from other elements.
34
- """
35
- h3_candidates = vol_elem.xpath(".//h3")
36
- if not h3_candidates:
37
- return ""
38
- texts = vol_elem.xpath(".//h3//text()[not(ancestor::a)]")
39
- full_text = "".join(texts).strip()
40
- return full_text.split(chr(183))[0].strip()
41
-
42
-
43
- def parse_book_info(html_str: str) -> dict[str, Any]:
44
- """
45
- Extract metadata: title, author, cover_url, update_time, status,
46
- word_count, summary, and volumes with chapters.
47
-
48
- :param html_str: Raw HTML of the book info page.
49
- :return: A dict containing book metadata.
50
- """
51
- info: dict[str, Any] = {}
52
- try:
53
- doc = html.fromstring(html_str)
54
-
55
- book_name = doc.xpath('string(//h1/em[@id="bookName"])').strip()
56
- info["book_name"] = book_name
57
-
58
- author = doc.xpath(_AUTHOR_XPATH).strip()
59
- info["author"] = author
60
-
61
- cover_url = doc.xpath('string(//div[@class="book-img"]//img/@src)').strip()
62
- info["cover_url"] = cover_url
63
-
64
- update_raw = (
65
- doc.xpath('string(//span[contains(@class, "update-time")])')
66
- .replace("更新时间", "")
67
- .strip()
68
- )
69
- info["update_time"] = update_raw
70
-
71
- status = doc.xpath('string(//p[@class="tag"]/span[@class="blue"][1])').strip()
72
- info["serial_status"] = status
73
-
74
- tags = doc.xpath('//p[@class="tag"]/a[@class="red"]/text()')
75
- info["tags"] = [t.strip() for t in tags if t.strip()]
76
-
77
- wc_number = doc.xpath("string(//p[em and cite][1]/em[1])").strip()
78
- wc_unit = doc.xpath("string(//p[em and cite][1]/cite[1])").strip()
79
- info["word_count"] = (
80
- (wc_number + wc_unit) if wc_number and wc_unit else "Unknown"
81
- )
82
-
83
- summary = doc.xpath('string(//p[@class="intro"])').strip()
84
- info["summary_brief"] = summary
85
-
86
- intro_list = doc.xpath('//div[@class="book-intro"]/p')[0]
87
- detail_intro = "\n".join(intro_list.itertext()).strip()
88
- info["summary"] = detail_intro
89
-
90
- volumes = []
91
- for vol_div in doc.xpath('//div[@class="volume-wrap"]/div[@class="volume"]'):
92
- volume_name = _get_volume_name(vol_div)
93
- chapters = []
94
- for li in vol_div.xpath(".//li"):
95
- a = li.xpath(".//a")[0] if li.xpath(".//a") else None
96
- if a is None or "href" not in a.attrib:
97
- continue
98
- href = a.attrib["href"].strip()
99
- title = "".join(a.itertext()).strip()
100
- chapters.append(
101
- {
102
- "title": title,
103
- "url": href,
104
- "chapterId": _chapter_url_to_id(href),
105
- }
106
- )
107
- volumes.append({"volume_name": volume_name, "chapters": chapters})
108
- info["volumes"] = volumes
109
-
110
- except Exception as e:
111
- logger.warning("[Parser] Error parsing book info: %s", e)
112
-
113
- return info
@@ -1,168 +0,0 @@
1
- LICENSE
2
- README.md
3
- pyproject.toml
4
- novel_downloader/__init__.py
5
- novel_downloader.egg-info/PKG-INFO
6
- novel_downloader.egg-info/SOURCES.txt
7
- novel_downloader.egg-info/dependency_links.txt
8
- novel_downloader.egg-info/entry_points.txt
9
- novel_downloader.egg-info/requires.txt
10
- novel_downloader.egg-info/top_level.txt
11
- novel_downloader/cli/__init__.py
12
- novel_downloader/cli/clean.py
13
- novel_downloader/cli/config.py
14
- novel_downloader/cli/download.py
15
- novel_downloader/cli/export.py
16
- novel_downloader/cli/main.py
17
- novel_downloader/config/__init__.py
18
- novel_downloader/config/adapter.py
19
- novel_downloader/config/loader.py
20
- novel_downloader/config/site_rules.py
21
- novel_downloader/core/__init__.py
22
- novel_downloader/core/downloaders/__init__.py
23
- novel_downloader/core/downloaders/base.py
24
- novel_downloader/core/downloaders/biquge.py
25
- novel_downloader/core/downloaders/common.py
26
- novel_downloader/core/downloaders/esjzone.py
27
- novel_downloader/core/downloaders/linovelib.py
28
- novel_downloader/core/downloaders/qianbi.py
29
- novel_downloader/core/downloaders/qidian.py
30
- novel_downloader/core/downloaders/sfacg.py
31
- novel_downloader/core/downloaders/yamibo.py
32
- novel_downloader/core/exporters/__init__.py
33
- novel_downloader/core/exporters/base.py
34
- novel_downloader/core/exporters/biquge.py
35
- novel_downloader/core/exporters/epub_util.py
36
- novel_downloader/core/exporters/esjzone.py
37
- novel_downloader/core/exporters/qianbi.py
38
- novel_downloader/core/exporters/qidian.py
39
- novel_downloader/core/exporters/sfacg.py
40
- novel_downloader/core/exporters/yamibo.py
41
- novel_downloader/core/exporters/common/__init__.py
42
- novel_downloader/core/exporters/common/epub.py
43
- novel_downloader/core/exporters/common/main_exporter.py
44
- novel_downloader/core/exporters/common/txt.py
45
- novel_downloader/core/exporters/linovelib/__init__.py
46
- novel_downloader/core/exporters/linovelib/epub.py
47
- novel_downloader/core/exporters/linovelib/main_exporter.py
48
- novel_downloader/core/exporters/linovelib/txt.py
49
- novel_downloader/core/factory/__init__.py
50
- novel_downloader/core/factory/downloader.py
51
- novel_downloader/core/factory/exporter.py
52
- novel_downloader/core/factory/fetcher.py
53
- novel_downloader/core/factory/parser.py
54
- novel_downloader/core/fetchers/__init__.py
55
- novel_downloader/core/fetchers/base/__init__.py
56
- novel_downloader/core/fetchers/base/browser.py
57
- novel_downloader/core/fetchers/base/rate_limiter.py
58
- novel_downloader/core/fetchers/base/session.py
59
- novel_downloader/core/fetchers/biquge/__init__.py
60
- novel_downloader/core/fetchers/biquge/browser.py
61
- novel_downloader/core/fetchers/biquge/session.py
62
- novel_downloader/core/fetchers/common/__init__.py
63
- novel_downloader/core/fetchers/common/browser.py
64
- novel_downloader/core/fetchers/common/session.py
65
- novel_downloader/core/fetchers/esjzone/__init__.py
66
- novel_downloader/core/fetchers/esjzone/browser.py
67
- novel_downloader/core/fetchers/esjzone/session.py
68
- novel_downloader/core/fetchers/linovelib/__init__.py
69
- novel_downloader/core/fetchers/linovelib/browser.py
70
- novel_downloader/core/fetchers/linovelib/session.py
71
- novel_downloader/core/fetchers/qianbi/__init__.py
72
- novel_downloader/core/fetchers/qianbi/browser.py
73
- novel_downloader/core/fetchers/qianbi/session.py
74
- novel_downloader/core/fetchers/qidian/__init__.py
75
- novel_downloader/core/fetchers/qidian/browser.py
76
- novel_downloader/core/fetchers/qidian/session.py
77
- novel_downloader/core/fetchers/sfacg/__init__.py
78
- novel_downloader/core/fetchers/sfacg/browser.py
79
- novel_downloader/core/fetchers/sfacg/session.py
80
- novel_downloader/core/fetchers/yamibo/__init__.py
81
- novel_downloader/core/fetchers/yamibo/browser.py
82
- novel_downloader/core/fetchers/yamibo/session.py
83
- novel_downloader/core/interfaces/__init__.py
84
- novel_downloader/core/interfaces/downloader.py
85
- novel_downloader/core/interfaces/exporter.py
86
- novel_downloader/core/interfaces/fetcher.py
87
- novel_downloader/core/interfaces/parser.py
88
- novel_downloader/core/parsers/__init__.py
89
- novel_downloader/core/parsers/base.py
90
- novel_downloader/core/parsers/biquge/__init__.py
91
- novel_downloader/core/parsers/biquge/main_parser.py
92
- novel_downloader/core/parsers/common/__init__.py
93
- novel_downloader/core/parsers/common/helper.py
94
- novel_downloader/core/parsers/common/main_parser.py
95
- novel_downloader/core/parsers/esjzone/__init__.py
96
- novel_downloader/core/parsers/esjzone/main_parser.py
97
- novel_downloader/core/parsers/linovelib/__init__.py
98
- novel_downloader/core/parsers/linovelib/main_parser.py
99
- novel_downloader/core/parsers/qianbi/__init__.py
100
- novel_downloader/core/parsers/qianbi/main_parser.py
101
- novel_downloader/core/parsers/qidian/__init__.py
102
- novel_downloader/core/parsers/qidian/book_info_parser.py
103
- novel_downloader/core/parsers/qidian/chapter_encrypted.py
104
- novel_downloader/core/parsers/qidian/chapter_normal.py
105
- novel_downloader/core/parsers/qidian/chapter_router.py
106
- novel_downloader/core/parsers/qidian/main_parser.py
107
- novel_downloader/core/parsers/qidian/utils/__init__.py
108
- novel_downloader/core/parsers/qidian/utils/decryptor_fetcher.py
109
- novel_downloader/core/parsers/qidian/utils/helpers.py
110
- novel_downloader/core/parsers/qidian/utils/node_decryptor.py
111
- novel_downloader/core/parsers/sfacg/__init__.py
112
- novel_downloader/core/parsers/sfacg/main_parser.py
113
- novel_downloader/core/parsers/yamibo/__init__.py
114
- novel_downloader/core/parsers/yamibo/main_parser.py
115
- novel_downloader/locales/en.json
116
- novel_downloader/locales/zh.json
117
- novel_downloader/models/__init__.py
118
- novel_downloader/models/browser.py
119
- novel_downloader/models/chapter.py
120
- novel_downloader/models/config.py
121
- novel_downloader/models/login.py
122
- novel_downloader/models/site_rules.py
123
- novel_downloader/models/tasks.py
124
- novel_downloader/models/types.py
125
- novel_downloader/resources/config/settings.toml
126
- novel_downloader/resources/css_styles/main.css
127
- novel_downloader/resources/css_styles/volume-intro.css
128
- novel_downloader/resources/images/volume_border.png
129
- novel_downloader/resources/js_scripts/qidian_decrypt_node.js
130
- novel_downloader/resources/json/linovelib_font_map.json
131
- novel_downloader/resources/json/replace_word_map.json
132
- novel_downloader/resources/text/blacklist.txt
133
- novel_downloader/tui/__init__.py
134
- novel_downloader/tui/app.py
135
- novel_downloader/tui/main.py
136
- novel_downloader/tui/screens/__init__.py
137
- novel_downloader/tui/screens/home.py
138
- novel_downloader/tui/screens/login.py
139
- novel_downloader/tui/styles/home_layout.tcss
140
- novel_downloader/tui/widgets/richlog_handler.py
141
- novel_downloader/utils/__init__.py
142
- novel_downloader/utils/cache.py
143
- novel_downloader/utils/chapter_storage.py
144
- novel_downloader/utils/constants.py
145
- novel_downloader/utils/cookies.py
146
- novel_downloader/utils/crypto_utils.py
147
- novel_downloader/utils/hash_store.py
148
- novel_downloader/utils/hash_utils.py
149
- novel_downloader/utils/i18n.py
150
- novel_downloader/utils/logger.py
151
- novel_downloader/utils/network.py
152
- novel_downloader/utils/state.py
153
- novel_downloader/utils/file_utils/__init__.py
154
- novel_downloader/utils/file_utils/io.py
155
- novel_downloader/utils/file_utils/normalize.py
156
- novel_downloader/utils/file_utils/sanitize.py
157
- novel_downloader/utils/fontocr/__init__.py
158
- novel_downloader/utils/fontocr/model_loader.py
159
- novel_downloader/utils/fontocr/ocr_v1.py
160
- novel_downloader/utils/fontocr/ocr_v2.py
161
- novel_downloader/utils/text_utils/__init__.py
162
- novel_downloader/utils/text_utils/chapter_formatting.py
163
- novel_downloader/utils/text_utils/diff_display.py
164
- novel_downloader/utils/text_utils/font_mapping.py
165
- novel_downloader/utils/text_utils/text_cleaning.py
166
- novel_downloader/utils/time_utils/__init__.py
167
- novel_downloader/utils/time_utils/datetime_utils.py
168
- novel_downloader/utils/time_utils/sleep_utils.py