All Server Guides Troubleshooting

Audiobookshelf won't import books from LibbyRip

Why Audiobookshelf scans fail or skip LibbyRip-ripped audiobooks, and how to fix the metadata.json so the books show up.

A row of audiobook spines on a wooden shelf, one slot empty showing the back wall, dark headphones lying in front of the missing book, a single orange spine standing out among muted greys and tans

You used LibbyRip to grab a Libby audiobook, copied the folder into your Audiobookshelf library, ran a scan, and the book never showed up. The audio files are in the right place, the folder structure looks fine, but the book isn’t in the library. Sometimes the scan fails partway through and other books that should have imported don’t either.

Look in the scan log (Settings, Logs, or metadata/logs/scans/) and you’ll see one of these:

[abmetadataGenerator] Invalid chapter start time undefined for "<book title>" metadata file
ValidationError [SequelizeValidationError]: string violation: description cannot be an array or an object

LibbyRip writes a metadata.json into a metadata/ subdirectory inside each audiobook folder. ABS picks it up during its recursive scan, but the format is Libby’s native data shape, not Audiobookshelf’s. Two completely different schemas that happen to share a filename. ABS picks up the file during scan, hands it to its metadata parser, and the parser rejects it because:

  • description is an object ({ "full": "...", "short": "..." }) instead of a single string
  • chapter entries don’t have the numeric start and end fields ABS expects

When the parser fails on the chapter check it returns null and the book gets skipped. When the description object slips through to the database layer, Sequelize throws the validation error and the whole scan aborts. The maintainers consider this not a bug since LibbyRip is writing a different format that just happens to be named metadata.json. Fixing it is on you.

The quick fix: delete or rename metadata.json

The simplest path is to remove metadata.json from each LibbyRip folder before scanning. ABS will fall back to reading metadata from the audio file tags and external providers (Audible, Open Library, etc.) and the book will import.

For a single book:

rm "/path/to/library/Author/Book Title/metadata.json"

To clear them across the whole library:

find /path/to/library -name "metadata.json" -delete

If you want to keep LibbyRip’s data around for reference but not have ABS choke on it, just rename the file. ABS only parses files named metadata.json (or metadata.abs), so anything else is ignored:

find /path/to/library -name "metadata.json" -execdir mv {} libby-metadata.json \;

nigiriemoji confirmed deleting the file works. Run a manual scan from Settings, Libraries, your library, Scan, and the missing books should appear.

If you want to keep the description: convert it

If you’d rather keep the description LibbyRip pulled, the minimum change is collapsing description from an object to a string. nate-griff posted a working example:

Before:

"description": {
  "full": "<full text...>",
  "short": "<short text...>"
}

After:

"description": "<full text...>"

That alone gets the book to import with title, author, and description. Chapter names still won’t come through, since LibbyRip’s chapter array doesn’t match ABS’s schema. ABS expects this:

"chapters": [
  { "start": 0, "end": 1234.5, "title": "Chapter 1" },
  { "start": 1234.5, "end": 2567.8, "title": "Chapter 2" }
]

start and end in seconds as numbers, title as a string. If LibbyRip’s chapters are in a different shape, either delete the chapters key from metadata.json (ABS will read chapters from the audio file instead) or write a small script to map the fields.

The fields ABS will read from metadata.json are: title, subtitle, authors (array of strings), narrators (array), series (array of strings like "Series Name #1"), genres (array), tags (array), publishedYear, publishedDate, publisher, description (string), isbn, asin, language, explicit (bool), abridged (bool), chapters (array as above). Anything else is ignored.

After a failed scan

If a scan died with the validation error, ABS may have imported some books before the crash and skipped the rest. Fix or delete the offending metadata.json files, then trigger a fresh scan. Books that already imported won’t be touched, and the ones that were skipped will pick up.

For other library ingestion problems, see new audiobooks getting the wrong metadata.

Affected versions

This applies to every version of Audiobookshelf. The metadata.json schema hasn’t changed in years and LibbyRip’s output uses Libby’s native format consistently. Any combination of versions produces the same conflict.