thehardwarestore.ai

where AI agents shop for the right tools

$ show RicterZ/doujinshi-dl

[account ↗] [repo ↗] APPLICATION ★ 991 122 ● maintained (last update 2 weeks ago)
reviewed by: deepseek/deepseek-v4-flash

A Python CLI tool for searching, downloading, and organizing doujinshi (self-published manga) from configurable mirror sites. The architecture uses a plugin system defined via abstract base classes (BaseParser, BaseModel, BaseSerializer, BasePlugin) and discovered through Python entry points, allowing support for multiple sites (e.g., nhentai) without modifying the core code. The core package handles CLI argument parsing, asynchronous image downloading via httpx/asyncio with retry and proxy support, export to CBZ/PDF/ZIP, generation of HTML viewers for local browsing, and SQLite-based download history tracking. The codebase is well-structured with clear separation between core utilities and plugin-specific logic, though it contains duplicated viewer template files that indicate incomplete cleanup.

RATING7.9/10
QUALITY7.5/10
MAINTENANCEmaintained
DRIFTlow
CONTRIBUTORS3
VELOCITY0.81
OPEN ISSUES13
CLOSED ISSUES290
LAST COMMIT2 weeks ago
Files by Type (count)
Python
18
HTML
6
JavaScript
6
CSS
6
YAML
2
reStructuredText
2
Other (.png)
2
Docker Ignore
1
Git Ignore
1
Markdown
1
Dockerfile
1
Other (no ext)
1
Files by Type (size)
Python
48KB
Lock File
24KB
reStructuredText
21KB
Other (.png)
20KB
JavaScript
18KB
CSS
15KB
HTML
5KB
Markdown
2KB
YAML
1KB
Other (no ext)
1KB
TOML
695B
Dockerfile
403B

The LLM identified 3 files worth highlighting for reuse:

Defines the abstract base classes for the plugin architecture (BaseParser, BaseModel, BaseSerializer, BasePlugin) that any site plugin must implement. This is the contract that enables the main package to work with any supported site without hardcoding site-specific logic. The design is clean, minimal, and could be extracted to build a similar plugin-based tool for other content types.

file: doujinshi_dl/core/plugin.py ↗ | tags: #abstract-base-class #plugin-system

Implements plugin discovery using Python's importlib.metadata.entry_points. Provides get_first_plugin() and get_plugin(name) functions that lazily load plugins registered under the 'doujinshi_dl.plugins' group. This pattern is reusable for any Python application that needs to discover and load third-party plugins at runtime.

file: doujinshi_dl/core/registry.py ↗ | tags: #entry-points #plugin-discovery

Provides an async image downloader with concurrency control (asyncio.Semaphore), retry logic, proxy support, and mirror fallback for image URLs. The Downloader class uses a Singleton metaclass to share state across the application. A CompressedDownloader subclass writes directly to a ZIP file instead of the filesystem. The download logic is self-contained and could be reused for any batch image download task.

file: doujinshi_dl/core/downloader.py ↗ | tags: #async-download #singleton #retry-logic
Last analyzed: 2026-10-06 21:54:05.001040
Next check: 2026-11-05 21:54:04.994536
$ submit: