diff --git a/metadata.go b/metadata.go
index 6e81265e1dfc318b2cdd5038d15e06ef70f4faaf..ceecc8e12e6549605fa1b5d161920ed9a273d570 100644
--- a/metadata.go
+++ b/metadata.go
@@ -245,10 +245,16 @@ func parseAnything(filename string) (*Metadata, error) {
 
 type fileProvider struct{}
 
-func (p *fileProvider) Lookup(storage *FileStorage, path, filetype string) (*Metadata, error) {
+func (p *fileProvider) Lookup(storage *FileStorage, path, filetype string) (m *Metadata, err error) {
+	// Catch panics from some of the underlying libraries (gmobi
+	// in particular) and transform them into errors.
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("panic(): %v", r.(error))
+		}
+	}()
+
 	path = storage.Abs(path)
-	var m *Metadata
-	var err error
 	switch filetype {
 	case ".epub":
 		m, err = parseEpub(path)
@@ -257,13 +263,10 @@ func (p *fileProvider) Lookup(storage *FileStorage, path, filetype string) (*Met
 	case ".pdf":
 		m, err = parseAnything(path)
 	default:
-		return nil, errors.New("unsupported file format")
-	}
-	if err != nil {
-		return nil, err
+		err = errors.New("unsupported file format")
 	}
 
-	return m, nil
+	return
 }
 
 func (p *fileProvider) GetBookCover(storage *FileStorage, path string) (string, error) {