From 5b2d105609c769005d083cc11a3270fba06137af Mon Sep 17 00:00:00 2001 From: John O'Keefe Date: Mon, 20 Apr 2026 20:45:49 -0400 Subject: [PATCH] fix(scanner): always attempt cover extraction for EPUBs and relax manga detection Two changes to EPUB metadata extraction: 1. Restructure extractMetadata so that fixed-layout detection and cover extraction always run for EPUBs, even when extractEPUBMetadata returns an error. Previously, a partial failure from the EPUB parser would skip cover and format detection entirely, leaving books without covers. 2. Remove the language restriction (ja/jpn) from manga reading direction detection. Manga tagged with 'manga' should default to RTL regardless of the language metadata, since the tag is an explicit signal from the user or metadata source. --- internal/services/media_scanner.go | 56 ++++++++++++++++-------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/internal/services/media_scanner.go b/internal/services/media_scanner.go index f4952a1..d31bbb6 100644 --- a/internal/services/media_scanner.go +++ b/internal/services/media_scanner.go @@ -953,7 +953,7 @@ func determineReadingDirection(comicInfo *ComicInfo) string { if strings.Contains(tags, "webtoon") || strings.Contains(tags, "manhwa") { return "vertical" // Korean/Chinese webcomics } - if strings.Contains(tags, "manga") && (lang == "ja" || lang == "jpn") { + if strings.Contains(tags, "manga") { return "rtl" // Japanese manga } @@ -1077,33 +1077,37 @@ func (s *MediaScanner) extractMetadata(path string) (*MediaMetadata, error) { switch ext { case ".epub": - metadata, err := s.extractEPUBMetadata(path) + metadata := &MediaMetadata{} + result, err := s.extractEPUBMetadata(path) + if err == nil { + return result, nil + } + if result != nil { + metadata = result + } + // Enhanced format detection for EPUBs + isFixedLayout, detectErr := s.DetectFixedLayoutEPUB(path) + if detectErr == nil && isFixedLayout { + // Override format group for manga EPUBs + metadata.FileFormats = []*FormatInfo{{ + FormatType: "fixed_layout", + FilePath: path, + MimeType: s.getMimeType(path), + }} + } + // Try to extract embedded cover + coverPath, err := s.extractEPUBCover(path) if err != nil { - // Enhanced format detection for EPUBs - isFixedLayout, detectErr := s.DetectFixedLayoutEPUB(path) - if detectErr == nil && isFixedLayout { - // Override format group for manga EPUBs - metadata.FileFormats = []*FormatInfo{{ - FormatType: "fixed_layout", - FilePath: path, - MimeType: s.getMimeType(path), - }} + fmt.Printf("Warning: failed to extract EPUB cover from %s: %v\n", path, err) + } else if coverPath != "" { + metadata.CoverPath = s.getRelativePath(coverPath) + } + // If no embedded cover, try sidecar + if metadata.CoverPath == "" { + sidecarCover := findSidecarCover(path) + if sidecarCover != "" { + metadata.CoverPath = s.getRelativePath(sidecarCover) } - // Try to extract embedded cover - coverPath, err := s.extractEPUBCover(path) - if err != nil { - fmt.Printf("Warning: failed to extract EPUB cover from %s: %v\n", path, err) - } else if coverPath != "" { - metadata.CoverPath = s.getRelativePath(coverPath) - } - // If no embedded cover, try sidecar - if metadata.CoverPath == "" { - sidecarCover := findSidecarCover(path) - if sidecarCover != "" { - metadata.CoverPath = s.getRelativePath(sidecarCover) - } - } - return metadata, nil } return metadata, nil case ".pdf":