- export: add missing chapter placeholder rendering (#151)
- sites: add locked chapter detection for qidian (#150)
- libs: add AES, DES and DES3 ciphers with ECB/CBC mode support (#145)
- cli: add missing --format option to search command (#149)
- client: add cleanup APIs and CLI clean subcommands with documentation (#143)
- core: reorganize sessions, split fontocr, rewrite jsbridge, and improve test coverage (#142)
- sites: add fallback for qidian volume extraction (#139)
- client: implement full download and export support (#136)
- sites: add support for ciweimao (#135)
- sites: add support for faloo (#134)
- parser: unify chapter resources into
extra.resourcesstructure (#133) - libs: enhance epub_builder with font support and cleanup (#132)
- libs: enhance html_builder with custom font support and cleanup (#130)
- plugins: split CommonClient into modular mixins (#129)
- sites: add new book sources and update media structure (#127)
- fetcher: support optional backend via aiohttp / httpx / curl_cffi (#126)
- cli: add interactive mode and new prompts module (#125)
- plugins: merge downloader and exporter, add translator and new site supports (#124)
- scripts: extract site data test flow from pytest into standalone script (#114)
- sites: add support for ciyuanji (#110)
- sites: unify image handling and generalize common downloader (#111)
- sites: unify biquge parser logic, simplify parsers, and archive legacy sites (#108)
- processors: introduce processing pipeline and redesign ChapterStorage (#103)
- site: add support for n69yue (#99)
- minijs: add IIFE parse note and MiniJS module (#96)
- linovelib: update chapterlog to v1006b8-5 to fix chapter order issues (#104)
- shuhaige: handle multi-page chapters and filter ads (#97)
- usecases: extract reporters/hooks and decouple UI from business logic (#100)
- sfacg: add support for VIP content with OCR (#90)
- cli: prevent export when download step fails (#92)
- project: restructure directories and core (#94)
- cli: extract config loading into service (#93)
- cli: restructure command system and improve export flow (#91)
- web: enhance all pages and fix downloader cancellation (#87)
- web: add URL input mode to download page (#86)
- qidian: add search support and paginate search results (#85)
- fetcher: add GenericSession as mid-layer for novel sites (#84)
- esjzone: rewrite parser for book info, chapters, and content using recursion (#83)
- core: add 20 sites, archive 3, richer logging, URL auto-resolve, EPUB hardening (#80)
- web: use search_stream and add /history page (#79)
- core: lazy-load registries to remove implicit imports (#78)
- site: add support for qqbook (#76)
- fetcher: simplify BaseSession (class attrs, config unpacking, centralized base_url) (#74)
- exporter: reorganize pipeline, remove redundancy, improve layout (#73)
- config: unify key resolution & preserve falsy values; simplify cleaner merge (#71)
- utils: generalize RC4; drop unused params; optimize fontocr/sleep/text_clean (#70)
- web: implement basic GUI interface (#65)
- core: async search; add 9 sites; add AES notes/helpers; archive deqixs.com (#64)
- core: optimize structure; simplify config; maintainable parsers; refresh web UI (#68)
- ocr: generalize FontOCR class, add lazy-loading, simplify Qidian parser (#66)
- remove TUI and browser mode; unify downloader/exporter; add support for 10+ sites (#63)
- search: add BaseSearcher, site-specific searchers, CLI subcommand (#61)
- core: migrate ChapterStorage to SQLite and optimize download/export pipelines (#59)
- code: cleanup resources, decorator-based module registration, and streamline exporter (#58)
- utils: single-pass TextCleaner and template-based chapter rendering (#60)
- qidian: rewrite book info parser for new page structure (#54)
- project: migrate project to src layout (#49)
- qidian: add use_truncation flag to prevent duplicate chapter content (#45)
- fetcher: close pages in finally block to prevent leak on failures (#41)
- downloader: separate exporter from download flow (#47)
- download: support partial chapter download with start_id and end_id (#37)
- debug: restore save_html behavior for encrypted content (#39)
- exporter: replace ebooklib with custom EPUB generator (#35)
- fetcher: handle single-volume extraction for linovelib
- tui: implement basic download UI (#32)
- site: add support for linovelib (#28)
- tui: include .tcss styles in package data for Textual UI
- parser: add missing Node.js check for qidian
- core: migrate to async, switch to lxml, and use argparse (#31)
- login: extract login from requester into downloader (#29)
- epub: add image support (#26)
- esjzone: simplify chapterList node selection in parser for volumes
- site: add support for yamibo (#24)
- site: add support for esjzone (#23)
- site: add support for sfacg (#22)
- site: add support for Qianbi (#21)
- site: implement async version for biquge support (#20)
- site: assign missing _logged_in flag for Qidian
- core: restructure layout for better scalability and extensibility (#16)
- i18n: add bilingual manual login prompts and improve UX messaging
- typing: update type annotations and fix Pylance issues (#14)
- config: unify time fields as float + centralize font OCR config (#11)
- async: full async download mode via aiohttp (#9)
- bump: grant permissions to allow push
- gitattributes: mark non-code resources as linguist-vendored to improve language stats
- config: support loading and saving config as JSON (#3)
- cli: add 'init' subcommand to initialize default settings
- fontocr: add debug logs for predictions and fallback cases
- saver: defer common_epub import and raise NotImplementedError if missing
- cli: add optional auto-close prompt after parsing
- fontocr: add OCR v2 module with vector+OCR fusion and hash support
- saver: add support for exporting novel as EPUB file
- qidian: support parsing encrypted chapter content
- ocr: add FontOCRV1 for font-based character recognition
- epub: add utils for EPUB generation (init, styles, intro rendering)
- interactive: add download option with prompts for site and book IDs
- cli: add clean command to remove cache, logs, and config files
- parser: add QidianSessionParser to support session-based chapter parsing
- requester: add QidianSession
- time_utils: support flexible multi-format datetime parsing
- biquge: add parser and rules for book info, volumes, and chapters
- factory: add Common fallback support for requester, parser, saver, and downloader
- requester: add common session requester for novel sites
- parser: add CommonParser supporting site-specific novel extraction
- downloader: add CommonDownloader class for generic novel downloading
- saver: add unified save() method based on config
- config: add function to validate and save setting and site-rule file
- downloader: add QidianDownloader with full book/chapter workflow
- savers: implement QidianSaver with TXT export support
- parser: add mode-based parser factory supporting browser/session
- config: add mode field (browser/session) to control requester behavior
- parser: add QidianBrowserParser for browser-rendered pages
- parser: add BaseParser abstract class for site-specific parsers
- interfaces: add DownloaderProtocol to define downloader interface
- core: add Base Requesters and QidianRequester
- utils: add time_utils module to centralize time-related utilities
- interfaces: add core protocol definitions for parser, requester, and saver
- text_utils: add text_utils module to expose common text utilities
- logger: add configurable logger with daily rotation and console output
- network: add retryable HTTP client and resource download utilities
- file_utils: add filename sanitizer and file I/O helpers
- cli: add initial CLI structure (argument parsing, no core logic yet)
- config: add config loader and adapter
- state: add persistent state manager for language and login flags
- fontocr: ensure debug path is created with parents=True
- parser: clean volume titles from HTML
- qidian: add missing chapter_id param in extract_paragraphs_recursively
- io: avoid newline in binary mode
- qidian: correct vip_status parsing logic
- test: add debug method to DummyLogger to fix pytest failure
- main: call setup_logging() to initialize logging system
- io: ensure JSON content is properly serialized in _write_file
- types: replace builtin generics with typing.* for py38
- downloader: improve login flow in QidianDownloader
- fontocr: change path for saving failed images
- parser, utils: clean structure, fix docstrings
- qidian: improve chapter parser with better error handling and optional import
- output: unify chapter saving format to JSON
- cli: migrate from argparse to click
- logging: use module-level name for logger naming
- saver: extract CommonSaver and make QidianSaver inherit it
- log: change default log path from ./logs to BASE_CONFIG_DIR/logs
- config: move save_html from ParserConfig to DownloaderConfig
- core: move interfaces module to correct package location