v4.7.0
Added
- Background search jobs — novel search is now a proper background job with two new
JobTypevalues:SEARCH_SOURCE— searches a single crawlable source; trigger viaPOST /api/job/create/search-sources?domain=…SEARCH_ALL_SOURCES— fans out across every searchable source, spawning oneSEARCH_SOURCEchild per source; idempotent on retryJobRunnerhandles execution: results stored injob.extra, matched URLs create aNOVEL_BATCHchild job- New Alembic migration (
add_jobtype) for PostgreSQL compatibility
- PAUSED job status — new
JobStatus.PAUSEDenum value for finer job lifecycle control - Per-tier search-job rate limiting —
BASICusers are capped at 1 concurrent search while the general active-job quota remains independent; search query length validated (2–50 chars); results sorted by match ratio - NovelFire search —
SEARCHcapability added toNovelFireCrawler(#3009)
Changed
- Removed vendored
lncrawl/cloudscraper— the embedded Cloudflare-bypass fork (v1/v2/v3 handlers, captcha integrations, JS interpreters, 7 913-linebrowsers.json) has been removed; HTTP scraping is now delegated to thelncrawl-scraperpackage - JavaScript engine replaced: PyExecJs → quickjs → exejs — lighter dependency, no Node.js or external runtime required
- Proxy support in scraper — the
lncrawl-scraperintegration now supports proxies;build-essentialsadded to Docker base image (#3014) - BrowserTemplate merged into SoupTemplate —
BrowserTemplateis integrated directly into the soup template hierarchy rather than being a standalone class; all browser-based sources refactored accordingly - Job service hardening — event locking and improved update logic in
JobService; request timeouts in the scraper adjusted - Docker improvements — faster image builds; updated
compose.ymland server-compose files; fixed unintended root access inserver-compose - truyenfull: updated domain and search URL;
base_urlchanged to a list to support multiple domains (#3010)
Fixed
- Security — path-traversal / static-file exposure vulnerability fixed in
app.pyandstaticfiles.py(#3005) - katreadingcafe — chapter link validation logic corrected to filter out non-chapter URLs (#3026)
- Race condition — parallel search result aggregation could yield inconsistent data under concurrent writes; fixed with proper locking
- EPUB + NovelFire (#2993):
- Duplicate chapter title and serial number removed from chapter body content
download_chapter_bodyheader extraction improved (regex + text normalisation)- EPUB serial heading logic refactored
- Source loading on restart — a failure loading one source no longer aborts the full reload cycle
- Cover download — full error stack trace suppressed for non-critical cover fetch failures
- PyInstaller packaging (
setup_pyi) — fixed a regression in frozen-binary builds
New Contributors
- @GabrielCWT made their first contribution in #3009
- @augustanational made their first contribution in #3010
- @templeofshadow made their first contribution in #3026
Full Changelog: v4.6.0...v4.7.0