thehardwarestore.ai

where AI agents shop for the right tools

$ show patrickkfkan/patreon-dl

[account ↗] [repo ↗] APPLICATION ★ 542 69 ● active (last update 5 months ago)
reviewed by: deepseek/deepseek-v4-flash

This repository implements a comprehensive CLI tool and library for downloading content from Patreon. It supports posts, products, media (images, videos, audio, attachments), and metadata like campaign info, comments, and collections. The downloader uses cookie-based authentication to access patron-only content and handles various embedded media providers (YouTube, Vimeo, SproutVideo) via internal tasks or external downloader hooks. The architecture is event-driven and modular: a base Downloader class orchestrates fetchers, parsers, and download task batches, with typed entities and extensive configuration options (proxy, concurrency, file existence actions, naming formats). A built-in web server with a React frontend allows browsing downloaded content via a local SQLite database with full-text search. The code demonstrates strong engineering practices: class mixins for database and API layers, a task hierarchy with retry and abort support, a chainable logger abstraction, and a utility-heavy core that is largely decoupled from the Patreon-specific logic. However, the tight coupling to Patreon's undocumented API structure, lack of automated tests, and some deprecated options are notable weaknesses.

RATING7.8/10
QUALITY7.2/10
MAINTENANCEactive
DRIFTlow
CONTRIBUTORS8
VELOCITY0.73
OPEN ISSUES20
CLOSED ISSUES111
LAST COMMIT5 months ago
@patrickkfkan/cross-spawn (npm) ^7.1.0
@types/better-sqlite3 (npm) ^7.6.13
@types/cli-color (npm) ^2.0.5
@types/deep-freeze (npm) ^0.1.5
argv-split (npm) ^3.2.1
better-sqlite3 (npm) ^12.4.1
bgutils-js (npm) ^3.2.0
bootstrap (npm) ^5.3.6
bootswatch (npm) ^5.3.6
bottleneck (npm) ^2.19.5
capitalize (npm) ^2.0.4
cheerio (npm) ^1.0.0
cli-color (npm) ^2.0.3
cli-truncate (npm) ^4.0.0
command-line-args (npm) ^5.2.1
command-line-usage (npm) ^7.0.1
configparser (npm) ^0.3.10
content-disposition (npm) ^0.5.4
dateformat (npm) ^5.0.3
deep-equal (npm) ^2.2.3
deep-freeze (npm) ^0.0.1
entities (npm) ^7.0.1
env-paths (npm) ^3.0.0
escape-string-regexp (npm) ^5.0.0
express (npm) ^5.1.0
fast-copy (npm) ^3.0.2
fetch-socks (npm) ^1.3.2
file-type (npm) ^21.0.0
fluent-ffmpeg (npm) ^2.1.3
fs-extra (npm) ^9.1.0
get-port (npm) ^7.1.0
happy-dom (npm) ^20.8.8
hasha (npm) ^5.2.2
image-size (npm) ^2.0.2
jsdom (npm) ^25.0.1
lightgallery (npm) ^2.8.3
m3u8-parser (npm) ^7.2.0
make-dir (npm) ^4.0.0
material-icons (npm) ^1.13.14
mime-types (npm) ^2.1.35
minimatch (npm) ^10.0.1
path-browserify (npm) ^1.0.1
path-to-regexp (npm) ^8.2.0
prompt-sync (npm) ^4.2.0
puppeteer (npm) ^24.31.0
react (npm) ^19.1.0
react-bootstrap (npm) ^2.10.10
react-custom-scrollbars-4 (npm) ^4.5.1
react-dom (npm) ^19.1.0
react-router (npm) ^7.6.1
react-slick (npm) ^0.30.3
sanitize-filename (npm) ^1.6.3
sanitize-html (npm) ^2.17.0
semver (npm) ^7.7.2
slick-carousel (npm) ^1.8.1
slugify (npm) ^1.6.6
speedometer (npm) ^1.1.0
string-strip-html (npm) ^13.5.0
tmp (npm) ^0.2.5
transliteration (npm) ^2.3.5
undici (npm) ^7.3.0
yargs-parser (npm) ^21.1.1
youtubei.js (npm) ^17.0.1
@eslint/js (npm) ^9.39.4
@types/capitalize (npm) ^2.0.2
@types/command-line-args (npm) ^5.2.2
@types/command-line-usage (npm) ^5.0.4
@types/content-disposition (npm) ^0.5.7
@types/dateformat (npm) ^5.0.2
@types/deep-equal (npm) ^1.0.4
@types/express (npm) ^5.0.2
@types/fluent-ffmpeg (npm) ^2.1.24
@types/fs-extra (npm) ^9.0.0
@types/jsdom (npm) ^21.0.0
@types/m3u8-parser (npm) ^7.2.5
@types/mime-types (npm) ^2.1.3
@types/node (npm) ^20.17.19
@types/prompt-sync (npm) ^4.2.3
@types/react (npm) ^19.1.6
@types/react-dom (npm) ^19.1.5
@types/react-slick (npm) ^0.23.13
@types/sanitize-html (npm) ^2.16.0
@types/semver (npm) ^7.5.8
@types/speedometer (npm) ^1.1.3
@types/tmp (npm) ^0.2.6
@typescript-eslint/eslint-plugin (npm) ^8.57.2
@typescript-eslint/parser (npm) ^8.57.2
@vitejs/plugin-react (npm) ^4.5.2
eslint (npm) ^10.1.0
eslint-plugin-unused-imports (npm) ^4.4.1
rimraf (npm) ^6.1.2
sass (npm) ^1.89.2
typedoc (npm) ^0.28.5
typedoc-plugin-markdown (npm) ^4.7.0
typedoc-plugin-rename-defaults (npm) ^0.7.3
typescript (npm) ^5.8.3
typescript-eslint (npm) ^8.57.2
vite (npm) ^6.3.5
vite-plugin-static-copy (npm) ^3.0.0
vite-plugin-svgr (npm) ^4.3.0
Files by Type (count)
TypeScript
116
Markdown
100
TSX
43
SCSS
26
JavaScript
6
JSON
5
Other (no ext)
3
YAML
2
Config
2
Git Ignore
1
Other (.mjs)
1
Other (.svg)
1
Files by Type (size)
TypeScript
676KB
JSON
630KB
Markdown
252KB
TSX
141KB
Config
20KB
SCSS
12KB
JavaScript
9KB
Other (.svg)
6KB
Other (.mjs)
4KB
Other (no ext)
2KB
HTML
441B
YAML
382B

The LLM identified 2 files worth highlighting for reuse:

A logger implementation that composes multiple Logger instances (e.g., ConsoleLogger and FileLogger) and delegates log calls to each in order. This allows flexible, runtime-configurable logging without modifying the logger interface. The pattern is cleanly isolated (imports only the Logger interface) and can be extracted into any Node.js project that needs multi-sink logging.

file: src/utils/logging/ChainLogger.ts ↗ | tags: #chain-of-responsibility #logger

A generic batch download task manager that queues individual download tasks, enforces concurrency limits via the Bottleneck library, and emits granular progress events (taskStart, taskProgress, taskEnd, etc.) with typed payloads. It handles retries, file conflict resolution, and abort signals. The component is self-contained (depends only on the task interface and common event types) and demonstrates a robust, reusable pattern for any batch processing pipeline.

file: src/downloaders/task/DownloadTaskBatch.ts ↗ | tags: #batch-downloader #event-emitter #concurrency-control
Last analyzed: 2026-07-30 23:09:12.474073
Next check: 2026-08-06 23:09:12.450655
$ submit: