diff --git a/opf.go b/opf.go index a2a46f3d00250fa628486cc3e9f1bfe9593d45dc..8b6457de27a6c49b241c9e2fa8aa9683b1394191 100644 --- a/opf.go +++ b/opf.go @@ -2,6 +2,7 @@ package liber import ( "encoding/xml" + "errors" "io" "os" "path/filepath" @@ -75,29 +76,27 @@ func opfOpen(path string) (*Metadata, error) { return opfParse(file) } -func opfMetadataPath(epubPath string) string { - return filepath.Join(filepath.Dir(epubPath), "metadata.opf") -} - -func opfCoverPath(epubPath string) string { - return filepath.Join(filepath.Dir(epubPath), "cover.jpg") +func replaceExt(path, ext string) string { + return strings.TrimSuffix(path, filepath.Ext(path)) + ext } type opfProvider struct{} func (p *opfProvider) Lookup(storage *FileStorage, path, filetype string) (*Metadata, error) { - if !storage.Exists(opfMetadataPath(path)) { - return nil, nil + paths := []string{ + filepath.Join(filepath.Dir(path), "metadata.opf"), + replaceExt(path, ".opf"), } - m, err := opfOpen(opfMetadataPath(storage.Abs(path))) - if err != nil { - return nil, err + for _, opfpath := range paths { + if m, err := opfOpen(storage.Abs(opfpath)); err == nil { + return m, err + } } - return m, err + return nil, errors.New("no OPF metadata found") } func (p *opfProvider) GetBookCover(storage *FileStorage, path string) (string, error) { - coverPath := opfCoverPath(path) + coverPath := filepath.Join(filepath.Dir(path), "cover.jpg") if storage.Exists(coverPath) { return coverPath, nil }