Clean up implementation plan: remove duplicate Step 3.2
- Remove duplicate extractPDFCover function documentation - Fixes issue identified during plan review where Step 3.2 appeared twice with identical content
This commit is contained in:
@@ -449,84 +449,6 @@ func (s *MediaScanner) extractPDFMetadata(path string) (*MediaMetadata, error) {
|
|||||||
|
|
||||||
**Exact Code to INSERT:**
|
**Exact Code to INSERT:**
|
||||||
|
|
||||||
```go
|
|
||||||
// extractPDFCover extracts a cover image from a PDF file.
|
|
||||||
// It uses pdfcpu to extract images from the first page.
|
|
||||||
// Returns the path to the saved cover, or empty string if no cover found.
|
|
||||||
func (s *MediaScanner) extractPDFCover(pdfPath string) (string, error) {
|
|
||||||
// Create a temporary directory for extracted images
|
|
||||||
tmpDir, err := os.MkdirTemp("", "pdf-cover-")
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("failed to create temp dir: %v", err)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(tmpDir)
|
|
||||||
|
|
||||||
// Use pdfcpu API to extract images from first page
|
|
||||||
// ExtractImagesFile(inFile, outDir string, selectedPages []string, conf *model.Configuration) error
|
|
||||||
err = pdfcpuapi.ExtractImagesFile(pdfPath, tmpDir, []string{"1"}, nil)
|
|
||||||
if err != nil {
|
|
||||||
// No images found or extraction failed - this is OK, just return empty
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for extracted images in the temp directory
|
|
||||||
entries, err := os.ReadDir(tmpDir)
|
|
||||||
if err != nil || len(entries) == 0 {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the largest image (likely the cover)
|
|
||||||
var largestImage string
|
|
||||||
var largestSize int64
|
|
||||||
|
|
||||||
for _, entry := range entries {
|
|
||||||
if entry.IsDir() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
info, err := entry.Info()
|
|
||||||
if err != nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// Skip very small files (likely thumbnails or icons)
|
|
||||||
if info.Size() < 1000 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if info.Size() > largestSize {
|
|
||||||
largestImage = filepath.Join(tmpDir, entry.Name())
|
|
||||||
largestSize = info.Size()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if largestImage == "" {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read the image
|
|
||||||
imageData, err := os.ReadFile(largestImage)
|
|
||||||
if err != nil || len(imageData) == 0 {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save cover to disk (same pattern as comics: {pdf_path}.cover.jpg)
|
|
||||||
coverPath := pdfPath + ".cover.jpg"
|
|
||||||
if err := os.WriteFile(coverPath, imageData, 0644); err != nil {
|
|
||||||
return "", fmt.Errorf("failed to write cover file: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return coverPath, nil
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Step 3.2: Add extractPDFCover Helper Function
|
|
||||||
|
|
||||||
**File:** `internal/services/media_scanner.go`
|
|
||||||
|
|
||||||
**Location:** AFTER the extractPDFMetadata function, BEFORE the ComicInfo struct
|
|
||||||
|
|
||||||
**Exact Code to INSERT:**
|
|
||||||
|
|
||||||
```go
|
```go
|
||||||
// extractPDFCover extracts a cover image from a PDF file.
|
// extractPDFCover extracts a cover image from a PDF file.
|
||||||
// It uses pdfcpu API to extract images from the first page.
|
// It uses pdfcpu API to extract images from the first page.
|
||||||
|
|||||||
Reference in New Issue
Block a user