Register Guidelines E-Books Today's Posts Search

Go Back   MobileRead Forums > E-Book Software > Calibre > Plugins

Notices

Reply
 
Thread Tools Search this Thread
Old 04-09-2026, 04:24 AM   #1
plain-cover
Plugin Developer
plain-cover began at the beginning.
 
Posts: 23
Karma: 10
Join Date: Feb 2026
Device: Samsung Galaxy Tablet
[GUI Plugin] Romance.io Fields

Romance.io is a community site for romance novels with detailed reader tags (tropes, themes, settings, etc.), steam ratings, and user star ratings. This plugin adds a toolbar button that fetches data from Romance.io and writes it into custom columns in your library:
  • Steam rating (1-5) - sort or filter your library by steam level
  • Star rating and vote count - community ratings from Romance.io
  • Tags - tropes, themes, settings, and more (e.g. time travel, enemies to lovers, small town, nerdy hero); shows up in Calibre's tag browser where you can sort and filter by tag
  • Separate tag categories - optionally store general tags, content warnings, geography, and format tags in their own custom columns. Use these alongside the combined tags column or on their own.
  • Ratings as Calibre tags - optionally add tags such as "Romance.io steam: 3" and "Romance.io stars: 4.3", useful for e-reader setups that display or use tags. These options do not require rating custom columns.
  • Link to Romance.io - Finds the Romance.io book ID and shows a link to the book's Romance.io page in the book details panel

Once the fields are stored in custom columns, you can do things like search for books with a steam rating >2, or click a tag in the tag browser to see all books with that trope.

Select one or more books and click the toolbar button to download fields from Romance.io. The plugin works on its own, but pairs well with the Romance.io metadata source plugin - if that plugin has already linked a book to Romance.io, this plugin can skip the search step and immediately start to download the fields.

For more detailed instructions, see the plugin's GitHub.

Installation:
In Calibre: Preferences > Plugins > Get new plugins, search for "Romance.io Fields", and click Install. Or download the zip from GitHub and install via Preferences > Plugins > Load plugin from file.

Requires Calibre 5.0 or newer. Restart Calibre after installation when prompted. If the toolbar button is missing, add the Romance.io action through Preferences > Toolbars & menus.

Setup:
Step 1 - Create custom columns (Preferences > Add your own columns):

Code:
Field               Lookup Name         Column Type
------------------------------------------------------------------------
Romance.io ID       #romanceio          Column built from other columns
                                        Template: {identifiers:select(romanceio)}
                                        Sort by: Text
Steam Rating        #romiosteam         Integers  (values 1-5)
Star Rating         #romiostars         Floating point numbers (2 decimals)
Vote Count          #romiovotes         Integers
Tags (combined)     #romiotags          Comma-separated text, like tags
General tags        #romiogeneraltags   Comma-separated text, like tags
Content warnings    #romiocontent       Comma-separated text, like tags
Geography           #romiogeography     Comma-separated text, like tags
Format tags         #romioformat        Comma-separated text, like tags
You don't need all of them - only create the ones you want to use. Lookup names can be anything; you'll map them in plugin settings.

Give each destination its own column. Adding category columns does not change the combined tags column. Format tags include details such as point of view, audiobook availability, length, and series structure.

The Romance.io ID column is an optional display column built from the stored identifier. It does not need to be mapped in plugin settings, and the Romance.io link works without it.

Step 2 - Map columns in plugin settings
Preferences > Plugins > Romance.io Fields > Customize plugin - map each field to the lookup name of the column you created.

Leave any unwanted destinations blank. You can also open these settings through the toolbar button's dropdown > Customize plugin.

If you only want ratings in Calibre's standard Tags field, enable "Add steam rating to Calibre Tags" and/or "Add star rating to Calibre Tags" under Rating tag options. No custom columns are needed for this setup.

Usage:
Select one or more books and click the Romance.io Fields plugin icon in the toolbar. The plugin searches Romance.io by title and author, then downloads fields for each matched book. If a book already has a Romance.io ID stored, it skips the search and goes straight to downloading the fields.

Configuration options:
  • Refresh existing fields (default: on) - update configured fields even if already set. Turn this off to populate only empty fields. The stored Romance.io ID is retained.
  • Prompt to save (default: off) - confirm before writing to library
  • Get tags from website (slower but includes additional community tags) (default: off) - tries Chrome first for book details. Leave this off to try a faster download without opening a browser; this usually includes the website's full tag list. Separate category columns do not require this option.
  • Maximum combined tags to download (default: 50) - limits the combined tags column only. Separate category columns receive their complete matching groups.
  • Add steam rating to Calibre Tags / Add star rating to Calibre Tags (default: off) - adds ratings to the standard Tags field. Other tags are preserved, and refreshing replaces the plugin's previous rating tags.

Wrong book matched? If your title or author in Calibre differs from Romance.io (different edition name, spelling, etc.), you can still link the book manually: open the book's detail page on Romance.io (URL contains /books/, not the series page), copy the ID from the URL (e.g. 5484ecd47a5936fb0405756c), then in Calibre open Edit metadata > Ids and add romanceio:5484ecd47a5936fb0405756c.

Notes:
  • Chrome is optional. Book details normally download directly over HTTP, then use Calibre's built-in browser engine and installed Chrome if needed. The legacy JSON book-details API is a final fallback; title/author searches still try the JSON search API first.
  • Chrome may open a minimized window when needed. Let the plugin close it automatically. To stop downloading, cancel the download in Calibre.
  • Only English is supported for now.

Source code, documentation, & issue reporting: GitHub

If you find this plugin useful, a small donation is appreciated!
Donate via PayPal
Attached Files
File Type: zip Romance.io Fields.zip (33.76 MB, 69 views)

Last edited by plain-cover; 09-20-2026 at 06:21 PM. Reason: v1.4.1
plain-cover is offline   Reply With Quote
Old 04-09-2026, 04:49 AM   #2
plain-cover
Plugin Developer
plain-cover began at the beginning.
 
Posts: 23
Karma: 10
Join Date: Feb 2026
Device: Samsung Galaxy Tablet
Development Builds

If you want to test the latest unreleased changes before they make it into an official release, development builds are available on GitHub.

Development builds may contain bugs. If you encounter an issue with a development build, please report it on GitHub Issues with:
  • The version number of the development build you are using (shown in Preferences > Plugins)
  • Steps to reproduce the issue
  • Any error messages or logs (right-click the Preferences gear icon and choose Restart in debug mode for verbose output; or click the job count in the bottom-right of Calibre, select the failed job, and click Show job details)

To install a development build: download the zip from GitHub and install via Preferences > Plugins > Load plugin from file.
plain-cover is offline   Reply With Quote
Old 04-25-2026, 04:29 PM   #3
scarlettruin
Connoisseur
scarlettruin began at the beginning.
 
Posts: 76
Karma: 10
Join Date: May 2014
Location: UK
Device: Samsung 10 Inch Tablet 2016 & Samsung S10+
What do i do with this error please?

Download Romance.io Fields
calibre_plugins.goodreads_rating.__init__:67: SyntaxWarning: "\d" is an invalid escape sequence. Such sequences will not work in the future. Did you mean "\\d"? A raw string is also an option.
Failed to initialize plugin: 'C:\\Users\\xxwil\\AppData\\Roaming\\calibre\\plug ins\\Read MP3 AudioBook metadata.zip'
Integration status: True
System info: OS=Windows 11 (10.0.26200), Python=3.14.2, Calibre=9.4.0
prefer_html=True: fetching HTML directly for 6673fff11ecec34b38be815e
Vendored import path: 'C:\\Users\\xxwil\\AppData\\Roaming\\calibre\\plug ins\\Romance.io Fields.zip'
seleniumbase: loaded via direct zipimport
chromedriver found at 'C:\\Users\\xxwil\\.calibre_selenium\\drivers\\chr omedriver.exe'
Chrome version: 147.0.7727.102, chromedriver version: 147.0.7727.57
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
CloudFlare challenge detected (matched: ['Just a moment']), waiting...
Timeout waiting for Cloudflare
Failed to fetch page (Chrome timed out or crashed - check terminal for details)
Unexpected error fetching 6673fff11ecec34b38be815e: RuntimeError: Failed to fetch HTML page for 6673fff11ecec34b38be815e (Chrome did not return page content)
Traceback (most recent call last):
File "calibre_plugins.romanceio_fields.jobs", line 304, in get_romanceio_fields_for_book
File "calibre_plugins.romanceio_fields.jobs", line 385, in _fetch_html
RuntimeError: Failed to fetch HTML page for 6673fff11ecec34b38be815e (Chrome did not return page content)
scarlettruin is offline   Reply With Quote
Old 04-25-2026, 09:08 PM   #4
plain-cover
Plugin Developer
plain-cover began at the beginning.
 
Posts: 23
Karma: 10
Join Date: Feb 2026
Device: Samsung Galaxy Tablet
Quote:
Originally Posted by scarlettruin View Post
What do i do with this error please?
Yikes, this is a more strict block than the one you shared in the other thread. Cloudflare seems to also be blocking your Chrome now, not just the JSON API. The plugin loads the page in Chrome, but Cloudflare's bot challenge never resolves for your IP address. This isn't something the plugin can work around unfortunately. It seems like your IP address has been flagged by Cloudflare, which happens with VPNs and high-traffic IPs.

You could try:
  • Disabling your VPN if you're using one
  • Using a different network (mobile hotspot, different Wi-Fi) to confirm it's IP-specific - if it works on another network, your ISP's IP range may be flagged - unfortunately there's not much you can do except contact your ISP or use a different connection
Hopefully one of those approaches will work for you!
plain-cover is offline   Reply With Quote
Old 06-17-2026, 05:23 PM   #5
CAIArchive
Member
CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'
 
CAIArchive's Avatar
 
Posts: 22
Karma: 39848
Join Date: May 2025
Device: Android Tablet
is there a way to separate the tags from the content warnings, geography and format? more specifically is there a way that each of those groups could be brought into its own column? obviously this would be optional if it could even be done, and i absolutely understand if this is to niche to warrant the effort.
CAIArchive is offline   Reply With Quote
Old 07-31-2026, 07:27 AM   #6
plain-cover
Plugin Developer
plain-cover began at the beginning.
 
Posts: 23
Karma: 10
Join Date: Feb 2026
Device: Samsung Galaxy Tablet
Quote:
Originally Posted by CAIArchive View Post
is there a way to separate the tags from the content warnings, geography and format? more specifically is there a way that each of those groups could be brought into its own column? obviously this would be optional if it could even be done, and i absolutely understand if this is to niche to warrant the effort.
This is a great idea and I've finally gotten a chance to implement it! If you update to v1.3.0 you'll see some extra options in the configuration settings - you'll be able to make some new columns and hook them up to each type of tag (one for content warning tags, another for geography tags, another for format tags, and another for general tags/everything else). If you check out the GitHub page I linked in my initial post you can see the updated instructions for setting those up. I hope this does what you needed
plain-cover is offline   Reply With Quote
Old 07-31-2026, 06:43 PM   #7
CAIArchive
Member
CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'CAIArchive can spell AND pronounce 'liseuse.'
 
CAIArchive's Avatar
 
Posts: 22
Karma: 39848
Join Date: May 2025
Device: Android Tablet
This is absolutely perfect! Thank you so much. Works as expected.
CAIArchive is offline   Reply With Quote
Reply


Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
[GUI Plugin] Streamer - RSVP Speed Reader plugin for Calibre npapadacis Plugins 6 04-24-2026 03:00 AM
[GUI Plugin] Noosfere_util, a companion plugin to noosfere DB lrpirlet Plugins 2 08-18-2022 03:15 PM
[GUI Plugin] Save Virtual Libraries To Column (GUI) chaley Plugins 14 04-04-2021 05:25 AM
invert search for custom fields (GUI) rogue_librarian Library Management 4 07-25-2011 11:36 AM


All times are GMT -4. The time now is 03:47 AM.


MobileRead.com is a privately owned, operated and funded community.