Loading...
0
Queue
0
Pending

Settings

v0.9.0-beta.156
Library Paths
Check if paths are accessible
Folder Naming


Native: Russian books get Russian titles, English books get English titles.
Watch Folder
Ebook Management BETA
Processing
Background Processing
hours
10-500 (prevents rate limiting)
0 = unlimited (with backoff)
Confidence Settings
Higher = more certain before stopping, lower = faster
Identification Layers

Books are identified in order. Each layer only runs if the previous one didn't get a confident match.

Full Trust: Skaldleita GPU Whisper + 50M book database is usually accurate. Use AI only when needed.

Default: 600 (10 minutes)
Default: 1 MB

Processing Pipeline Order

Drag layers to reorder, or use the arrow buttons. The pipeline processes books through each enabled layer in this order.

≡ 1
Audio ID
Transcribe audiobook intro via Skaldleita/Whisper and identify from narrator announcement.
≡ 2
AI Audio Analysis
Send longer audio clip to Gemini AI for deeper analysis when transcription was unclear.
≡ 3
SL Requeue Check
Re-verify books against Skaldleita after nightly database merge.
≡ 4
API Lookup
Look up book metadata from Skaldleita, Audnexus, OpenLibrary, and Google Books.
≡ 5
AI Verify
Use AI to verify folder-name-based identification as a last resort.

AI Providers
API Keys Enter all keys - system uses fallbacks automatically
Free at aistudio.google.com - 14,400 calls/day
Get at openrouter.ai - Free models, Whisper fallback
Instance ID: Loading...
Get Free API Key

Skaldleita now requires an API key for metadata and audio identification. Your key will be emailed to you and automatically applied.

Required to use Skaldleita. Already have a key? Paste it above and save settings.
Higher rate limits on Google Books API
Primary AI Provider

Select which AI to try first. Falls back to others automatically.

Type a model ID or refresh models from your Gemini key.
Provider Chains
Book Metadata Sources

Searches these APIs in order (all free, no setup needed):

  1. Audnexus - Audiobooks (from Audible)
  2. OpenLibrary - General books
  3. Google Books - Wide coverage
  4. Hardcover - Indie/modern books
  5. AI Fallback - When APIs fail

Google Books API key can be configured in the AI Setup tab above.

Provider Fallback Chains

Configure the order providers are tried. If one fails, the next is used. Drag to reorder, uncheck to disable.

Skaldleita (GPU Whisper - Best)
Gemini (Native audio)
OpenRouter (Needs local Whisper)
Ollama (Needs local Whisper)
llama.cpp / Compatible API (Needs transcription)
Gemini/Gemma (Free tier)
OpenRouter (Free models)
Ollama (Self-hosted)
llama.cpp / Compatible API (User endpoint)

Safety, Language & Maintenance
Automation
Experimental Mode
UI Behavior
Metadata Embedding BETA
Language
Translates UI buttons and labels (not book metadata)
Changes the color scheme and visual style

Error Reporting
Community Contributions
What's shared: Author, Title, Narrator (extracted from audio credits)
Never shared: File paths, audio files, personal data
How it works: When 2+ users agree on the same book's metadata, it becomes verified for everyone.
P2P Book Cache
How it works: Successful Skaldleita lookups are cached locally AND shared to a peer-to-peer network.
Why enable: Helps when Skaldleita is temporarily down - you can still get results from other users' caches.
Storage: ~50-100MB local cache
Privacy: Only book metadata is shared (title, author, series). No file paths or personal data.
Updates
Read Before Proceeding

Deep Verification is a "Hail Mary" mode that re-verifies your entire library against APIs, even books that look correctly named.


Why use this?

  • You imported a sketchy collection with potentially wrong author attributions
  • Folder names look correct but might be misattributed (e.g., "Ashli St. Armant/The Burning White" when it's actually by Brent Weeks)
  • You want a complete audit of your library

What it costs:

  • Time: ~30 seconds per book (500 books = ~4 hours)
  • API Calls: 3-5 API calls per book (Skaldleita, OpenLibrary, Google Books, Audnexus)
  • Processing: All books get re-queued and processed through Layer 1-3
Processing...
Database Maintenance

Clean up system folder entries that were accidentally scanned.

Removes @eaDir, #recycle, .AppleDouble, $RECYCLE.BIN and other system folder entries
Danger Zone

These actions cannot be undone.

Wipe All clears both database AND history in one click.
Backup & Restore
Download Backup
Loading backup info...
Debug & Troubleshooting
Version: 0.9.0-beta.156
AI: gemini

API Tests

Recent Logs
Loading...
Post-Processing Hooks
Post-Processing Hooks ?Run external scripts or webhooks after a book is successfully renamed. Use for M4B conversion, Audiobookshelf library scans, Discord notifications, backup scripts, etc. Hook failures never undo a successful rename.
Execution Log
Time Hook Type Status Duration Details
Loading...
Template Variables

Use {{}} in commands/URLs:

{{new_path}}
{{old_path}}
{{author}}
{{title}}
{{narrator}}
{{series}}
{{series_num}}
{{year}}
{{media_type}}
{{book_id}}
{{history_id}}
{{event}}
{{timestamp}}
{{old_author}}

Command variables are automatically shell-escaped to prevent injection.
Examples
M4B Converter:
python3 /hooks/m4binder.py --input-folder {{new_path}}
ABS Library Scan:
curl -s -X POST http://abs:13378/api/libraries/LIB_ID/scan -H "Authorization: Bearer TOKEN"
Log to file:
echo {{author}} - {{title}} >> /data/hook-log.txt
Discord Webhook:
Use webhook type with your Discord webhook URL

Custom API Sources
Custom API Sources ?Add your own book metadata APIs as processing layers. Each source queries an HTTP endpoint and maps the response into the book profile system.
How Custom Layers Work

Custom API sources plug into the processing pipeline. When a book needs metadata, your API is queried alongside built-in sources.

  1. Your API receives book title & author
  2. Response fields are extracted via JSONPath
  3. Extracted data feeds into the book profile with your chosen confidence weight

URL Template Variables:

{{title}}, {{author}}, {{narrator}}, {{isbn}}, {{path}}

JSONPath Examples:

$.title - top-level field
$.results[0].author - first array item
$.data.book.name - nested field
Confidence Weights

Higher weight = more trusted. Multiple sources agreeing boosts confidence.

SourceWeight
Audio analysis85
ID3 tags80
JSON metadata75
BookDB / Audnexus65
AI verification60
Custom layers55 (default)
Path parsing40
Python Drop-in Plugins ?Drop-in Python plugins for advanced users. Place a plugin folder in /data/plugins/ with a manifest.json and a Python file extending BasePlugin. Plugins are auto-discovered on startup.

For developers who need more than HTTP lookups. Write Python plugins that can do anything: parse files, call complex APIs, run local models, etc.

Quick Start:

  1. Create a folder in /data/plugins/my-plugin/
  2. Add a manifest.json with plugin metadata
  3. Add a .py file extending BasePlugin
  4. Restart Library Manager — plugin loads automatically

manifest.json:

{
  "id": "my-plugin",
  "name": "My Plugin",
  "version": "1.0.0",
  "description": "What it does",
  "type": "layer",
  "entry_point": "layer.py",
  "class_name": "MyPlugin",
  "default_order": 35,
  "requires_config": [],
  "requires_secrets": ["my_api_key"],
  "permissions": {
    "network": ["api.example.com"],
    "database": "read"
  }
}

Plugin Interface:

from library_manager.plugin_loader import BasePlugin

class MyPlugin(BasePlugin):
    def setup(self, config, secrets):
        self.api_key = secrets.get('my_api_key')

    def can_process(self, book_data):
        return True  # filter which books to process

    def process(self, book_data):
        title = book_data.get('current_title')
        # ... your logic here ...
        return {
            'title': 'Corrected Title',
            'author': 'Author Name',
            # narrator, series, series_num, year
        }

    def teardown(self):
        pass  # cleanup on shutdown

Plugins run with a 30s timeout per book. Auto-disabled after 5 consecutive failures. An example plugin ships in examples/plugins/example-logger/.

Managing API Secrets ?API keys and passwords are stored in secrets.json (not config.json) so they are never exposed in backups or logs. Add your key as a named entry, then reference the key name here.

API keys and passwords go in secrets.json, not config.json. Reference them by name in the wizard or your plugin code.

secrets.json example:

{
  "gemini_api_key": "AIza...",
  "my_bookdb_key": "Bearer abc123",
  "my_api_password": "secret456"
}

Docker: /config/secrets.json
Bare metal: secrets.json in app directory
This file is gitignored and never included in backups or logs.

Example API Configurations

Ready-to-use configs for popular book APIs. Click "Add Custom API Source" and paste these values.

Google Books

URLhttps://www.googleapis.com/books/v1/volumes?q=intitle:{{title}}+inauthor:{{author}}&maxResults=1
MethodGET
AuthNone (or API Key Header: key)
Title$.items[0].volumeInfo.title
Author$.items[0].volumeInfo.authors[0]
Year$.items[0].volumeInfo.publishedDate

Open Library

URLhttps://openlibrary.org/search.json?title={{title}}&author={{author}}&limit=1
MethodGET
AuthNone
Title$.docs[0].title
Author$.docs[0].author_name[0]
Year$.docs[0].first_publish_year

Open Library is free with no API key required.

Plugin Health ?Monitor the health and performance of your custom API sources. Plugins are auto-disabled after 5 consecutive failures.