Libiry extracts and manages book metadata from various sources and formats. All field names are configurable.

FieldEPUBCBZOther
coverCover image in EPUBFirst imageURL in Markdown
booktitleOPF (dc:title)ComicInfo.xmlMarkdown
authorOPF (dc:creator)ComicInfo.xmlMarkdown
author_sortOPF (opf:file-as)MarkdownMarkdown
isbnOPF (dc:identifier)MarkdownMarkdown
ratingcalibre:rating metaComicInfo.xmlMarkdown
publisherOPF (dc:publisher)ComicInfo.xmlMarkdown
publication dateOPF (dc:date)year from ComicInfo.xmlMarkdown
languageOPF (dc:language)ComicInfo.xml (LanguageISO)Markdown
pagesrendition:page-count or calibre:pagesComicInfo.xml (PageCount)Markdown
tagsOPF (dc:subject)(Tags)Markdown
seriescalibre:series metaComicInfo.xml (Series)Markdown
series indexcalibre:series_indexComicInfo.xml (Number)Markdown
translatorOPF (dc:contributor role=trl)ComicInfo.xmlMarkdown
illustratorOPF (dc:contributor role=ill)ComicInfo.xml (Penciller)Markdown
descriptionOPF (dc:description)ComicInfo.xml (Summary)Markdown
notescalibre:user_notesComicInfo.xml (Notes)Markdown
  • rendition:page-count is an EPUB 3 standard meta element
  • calibre:pages is a Calibre specific extension. It is only available if you create a custom column “pages” in Calibre
  • MOBI, AZW and AZW3 are all Amazon Kindle formats. All metadata is stored in a sidecar for these formats, because they don’t support direct metadata editing
  • ComicInfo.xml is a standard comic metadata format that is used in CBZ files
  • CBR works with a protected RAR-format, so all metadata is stored in a sidecar
  • When “Store metadata in sidecar” is True, the metadata for EPUB, PDF and CBZ are also maintained in sidecar files
  • Please note that any HTML characters will be removed from field values before writing to sidecars, as are intermediate quotes
  • Cover: a cover image URL or path should be placed here
  • Language is a free format field, but is intended to have a language code in it
  • ISBN: an ISBN-10 or ISBN-13 code is expected here
  • Rating: Like Calibre, Libiry uses 0-10. It shows 0-5, though (automatic conversion)

Metadata extraction

EPUB Files

Metadata is read from the OPF file inside the EPUB:

<metadata>
  <dc:title>The Book Title</dc:title>
  <dc:creator>Author Name</dc:creator>
  <dc:subject>fiction</dc:subject>
  <dc:identifier>978-1234567890</dc:identifier>
</metadata>

PDF files

Metadata is read from the PDF’s document information dictionary:

  • Title → booktitle
  • Author → author
  • Subject → description
  • Keywords → tags (comma-separated)

MOBI/AZW Files

Basic metadata is extracted using the mobi library:

  • Title → booktitle
  • Author → author
  • Tags → from OPF sidecar file

Comic files (CBR/CBZ)

Metadata is read from ComicInfo.xml:

<ComicInfo>
  <Title>Comic Title</Title>
  <Writer>Author Name</Writer>
  <Genre>Action, Adventure</Genre>
</ComicInfo>

Markdown files

---
cover: https://covers.openlibrary.org/b/id/11405920-M.jpg
booktitle: The Handmaid's Tale 
author: Margaret Atwood
isbn: 9780385490818 
rating: 5.0
language: en
tags:
  - distopian
  - scifi
path: Scifi/Atwood
size: 751.5 KB
type: epub
---
 
# The Handmaid's Tale 
  • Uses YAML frontmatter (Obsidian-compatible)
  • Numbers are parsed as integers
  • Filename derived from book title
  • Content section below frontmatter (optional)
  • Compatible with Libiry for viewing

The Libiry BookSpineScanner can creates the following extra fields if you wish so:

FieldDescription
sizeBook file size
typeBook type
pathOriginal file name, including folder path. Backslashes in the path name are changed into forward slashes
book createdCreation date of the book - for tracking your reading habits
book modifiedModified date of the book - for tracking your reading habits

| scan_confidence: high (4%) | scan_source_api: openlibrary | scan_source: “20260531_102438 spaink.jpg” | scan_date: 2026-08-30T13:36:53.887Z

Libiry2Go creates the following extra fields:

FieldDescription
sizeBook file size
typeBook type
pathOriginal file name, including folder path. Backslashes in the path name are changed into forward slashes
book createdCreation date of the book - for tracking your reading habits
book modifiedModified date of the book - for tracking your reading habits

Tag management

Reading tags

Tags are read from (in priority order):

  1. The sidecar file (if it exists)
  2. The embedded metadata in the e-book

Writing tags

Tags are written to:

  • EPUB: Embedded dc:subject elements
  • CBZ: ComicInfo.xml
  • Markdown: YAML frontmatter
  • Other book formats: In sidecar file

Tag format

Tags are stored as:

  • Comma-separated string in some formats
  • Multiple dc:subject elements in EPUB/OPF
  • Multi-line tags in sidecars. Arrays for tags are also supported ( tags: [fiction, fantasy]).

In markdown:

tags:
  - fiction
  - fantasy
  - read2026

Nested tags work too:

tags:
  - books/fantasy
  - status/read

Cover handling

Cover sources (priority order)

  1. Embedded cover - Extracted from e-book file
  2. Cover field - URL or path in metadata
  3. Online lookup:
    • Open Library (by ISBN or title+author)
    • Google Books (by ISBN or title+author)
    • Europeana (European books)
    • Other book databases

Cover display

  • Thumbnails are cached in an SQLite database
  • Cache is cleared on startup for fresh covers
  • Fallback display shows author + title text

Cover field formats

# URL
cover: https://example.com/cover.jpg
 
# Local path
cover: ./covers/book.jpg
 
# Obsidian syntax
cover: [[cover.jpg]]
cover: ![[cover.jpg]]

Duplicate detection

Is done using:

ISBN matching

Exact match on ISBN-10 or ISBN-13

Title + author matching

Normalization process:

  1. Convert to lowercase
  2. Remove articles: “the”, “a”, “an”, “de”, “het”, “een”
  3. Remove author suffixes: “jr”, “sr”, “phd”
  4. Sort author name parts alphabetically
  5. Compare normalized strings

Example:

  • “The Handmaid’s Tale” by “Margaret Atwood”
  • “Handmaid’s Tale” by “Atwood, Margaret”
  • Both normalize to the same value → detected as duplicate

Field name customization

Map Libiry fields to your existing metadata:

# For Obsidian
Field name booktitle: title
Field name tags: tags
 
# For custom setups
Field name booktitle: book_title
Field name author: writer

This ensures compatibility with:

  • Goodreads exports
  • Obsidian plugins (Book Search, Booksidian)
  • Custom database schemas

Cover extraction priority

  1. Embedded cover in e-book metadata
  2. First image for comics (CBR/CBZ)
  3. First page thumbnail for PDFs
  4. Cover field in markdown files
  5. Online lookup from Open Library, Google Books, Europeana

Performance notes

  • For large PDFs it may take longer to extract covers
  • Comics with many images are processed efficiently (only the first image)
  • Cache files speed up processing