Releases: alex-sky-reach/MetadataPlusPlus
Release list
Metadata++ 6.2.18
Metadata++ Changelog
Release history for Metadata++ metadata providers and supporting fetch/merge logic.
v6.2.18
Browser Fetch
- browser_fetch.py: replaced per-request Playwright/Firefox launches with a
persistent reusable Firefox worker across browser_get() calls, reducing
repeated browser startup overhead during browser-backed fetches. - browser_fetch.py: added worker lifecycle recovery. If the reusable worker
exits unexpectedly or hits a transport error, the plugin logs it, stops the
stale worker, and allows later browser fetches to start a fresh worker.
Internal
- Plugin version metadata is now 6.2.18.
Metadata++ v4.0
Release Summary
-
Restored the modular architecture from v6.2.14, reorganizing the plugin into
core,engine,providers, anduipackages, updating all imports, and preserving full Calibre compatibility. -
Significantly improved metadata accuracy with stronger language-aware matching, title/author validation, enhanced Amazon ISBN and regional storefront handling, more reliable Playwright navigation, and better provider diagnostics.
-
Enhanced synopsis extraction and cleanup by filtering provider boilerplate, marketplace text, and invalid descriptions. Added a new normalization pipeline that automatically decodes HTML entities, restores missing spaces after punctuation, fixes typography, separates review quotations into readable paragraphs, and preserves abbreviations and numeric formats through extensive edge-case validation.
-
Improved cover validation and selection by expanding placeholder detection beyond simple hash matching. Added robust validation for broken and partially downloaded covers, improved Google Books placeholder detection using perceptual hashing, and introduced additional quality checks to reject corrupted, incomplete, and placeholder images while avoiding false positives on legitimate minimalist cover designs.
-
Added an optional synopsis header feature, configurable from Options → Metadata, that can prepend page count, word count, estimated reading time, and tags to the book description. Word counts are calculated directly from the EPUB contents (stripped HTML, counted tokens) rather than estimated, reading time is computed using a 200 WPM model, and page count prefers an existing
#pagescustom column, falling back to a clearly labeled estimate when unavailable. The feature is disabled by default and gracefully skips unavailable statistics for non-EPUB formats. -
Expanded interface localization with complete support for English, Italian, Spanish, and Romanian across menus, dialogs, configuration pages, and notifications.
-
Improved diagnostics and logging by making browser fallback reporting accurately reflect newly discovered metadata, making it much easier to distinguish provider failures, browser automation issues, and metadata validation rejections during debugging.
New: Synopsis Statistics Header
Added an opt-in preference (Options → Metadata → "Prepend page/word count, reading time & tags to synopsis"), disabled by default since it modifies the saved synopsis. Word count is calculated from the book's actual EPUB content (stripped HTML and counted tokens), reading time uses a 200 WPM model (e.g. 103,844 words → 08h:39m), and page count prefers a real #pages custom column before falling back to a clearly labeled "(est.)" estimate. The feature currently applies to EPUB books; MOBI/AZW3 titles automatically omit the word count and reading time when those values cannot be computed.
Metadata++ v3.0
### Development Summary Metadata++ v3.0 (v6.2.34+)
This release continues the refactoring and reliability work started in previous versions, focusing on architecture cleanup, metadata accuracy, and diagnostics.
#### Architecture
-
Restored the modular project structure from v6.2.14, replacing the flat layout that had reappeared during merges.
-
Reorganized modules into:
core/→cache.py,fuzzy.py,isbn_utils.py,i18n.pyengine/→fetch_engine.pyproviders/→providers.py,browser_fetch.pyui/→config.py,dialogs.py
-
Kept
action.pyand__init__.pyat the plugin root for Calibre compatibility. -
Added package
__init__.pyfiles, updated all imports to the new package layout, verified withpy_compile, and repackaged without changing the external plugin structure.
#### Metadata & Fetching Improvements
-
Added language-aware metadata selection and stronger title/author validation.
-
Improved Amazon integration:
- ISBN-13 → ISBN-10 conversion for
dp/lookups. - Better regional storefront fallback (
amazon.com⇄ local TLDs). - Immediate retry after local storefront failures.
- Improved handling of HTTP 503/bot-block scenarios.
- ISBN-13 → ISBN-10 conversion for
-
Reworked Playwright navigation to avoid fragile
networkidlewaits, significantly reducing unnecessary timeouts. -
Improved synopsis extraction by removing marketplace/ad content and filtering invalid or extremely short descriptions.
-
Added stronger title plausibility checks to prevent unrelated metadata from being merged.
-
Improved cover selection with placeholder detection, image validation, language filtering, and better quality heuristics.
#### UI
- Added full interface localization (English, Italian, Spanish, Romanian).
- Localized menus, dialogs, configuration pages, and Playwright setup.
- Enhanced Cover Chooser with Current Cover (in Calibre) support and automatic filtering of placeholder images.
#### Diagnostics & Logging
-
Fixed a misleading browser fallback log in
engine/fetch_engine.py. -
The browser pass previously logged the total number of collected results, making it appear that browser scraping had succeeded even when it found nothing.
-
Logging now reports only the number of results added by the browser fallback, clearly distinguishing:
- browser fallback found additional metadata,
- browser fallback found nothing,
- metadata rejected later (e.g. author/title validation).
This greatly simplifies debugging by accurately identifying whether failures originate from provider searches, browser automation, or metadata validation.
Metadata++ v2.0
Several BUG fixes and a couple of updates: cover chooser and synopsis-description chooser.
🐞 Bug Fixes
Fixed title matching for books with series/edition suffixes
Improved title normalization by stripping series/volume metadata before fuzzy matching.
Added prefix-based fallback matching.
Eliminated unnecessary duplicate browser fetches caused by failed merges.
Fixed incorrect synopsis language selection
Added lightweight language detection to synopsis scoring.
Descriptions now prefer the book's language instead of higher-weight sources containing translated or original-language summaries.
Fixed incorrect metadata from similarly titled books
Improved fuzzy title matching using stricter Jaccard word similarity.
Added author-validation veto to reject metadata from books with mismatching authors.
Fixed incorrect title and tags prioritization
Titles are now selected by highest similarity to the requested book rather than source weight.
Tags from weak title matches are discarded, preventing unrelated categories from contaminating metadata.
Fixed cover replacement logic
Improved existing-cover detection across all supported Calibre versions.
Prevented high-quality covers from being replaced by lower-quality thumbnails.
Added support for additional JPEG formats and Pillow fallback when image dimensions cannot be read.
Fixed cover quality evaluation
Prevented padded, letterboxed and placeholder covers from replacing superior existing covers.
Improved HTTP probing with HEAD → Range GET → GET fallback for CDN compatibility.
Removed premature cover-selection stopping, allowing all candidates to be evaluated before choosing the best one.
✨ New Features
Cover Chooser
Browse every discovered cover candidate before applying metadata.
Preview covers with source information and quality indicators.
Manually override automatic cover selection at any time.
Synopsis Chooser
View every available description from all metadata sources.
Compare language, source and quality score.
Select the preferred synopsis instead of relying solely on automatic scoring.
⚡ Other Improvements
Improved metadata merge accuracy across all providers.
Reduced unnecessary browser launches and duplicate fetch operations.
Better handling of multilingual libraries.
More reliable cover selection and metadata consistency.
Added independent per-book Update Cover option, allowing cover-only updates without modifying other metadata.

Metadata++ v1.0
Features
Amazon support
Goodreads support
Google Books support
OpenLibrary support
ISBNDB support
Weighted metadata providers
Intelligent metadata scoring
Browser-assisted Amazon scraping
Improved matching logic
Configurable provider priorities
About
A metadata downloader plugin for Calibre that intelligently combines metadata from multiple providers using weighted scoring and browser-assisted retrieval.
Note
This project represents something special to me. I am not a software developer—I work in a completely different field. Thanks to curiosity, persistence, and modern AI tools, I was able to turn an idea into a working Calibre plugin. If it saves you some time or improves your ebook library, then it has already achieved its purpose.
❤️ Acknowledgements
Special thanks to @jadehawk (https://github.com/jadehawk) for generously sharing technical advice, ideas, and practical solutions during the development of Metadata++. Their guidance on Amazon scraping, Playwright integration, and parser improvements was instrumental in helping bring this project to life.
Full Changelog: https://github.com/alex-sky-reach/MetadataPlusPlus/commits/calibre-plugin