mirror of
https://github.com/Belphemur/CBZOptimizer.git
synced 2025-10-14 12:38:50 +02:00
105 lines
3.1 KiB
Go
105 lines
3.1 KiB
Go
package utils
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/belphemur/CBZOptimizer/v2/internal/cbz"
|
|
"github.com/belphemur/CBZOptimizer/v2/pkg/converter"
|
|
errors2 "github.com/belphemur/CBZOptimizer/v2/pkg/converter/errors"
|
|
"log"
|
|
)
|
|
|
|
type OptimizeOptions struct {
|
|
ChapterConverter converter.Converter
|
|
Path string
|
|
Quality uint8
|
|
Override bool
|
|
Split bool
|
|
}
|
|
|
|
// Optimize optimizes a CBZ/CBR file using the specified converter.
|
|
func Optimize(options *OptimizeOptions) error {
|
|
log.Printf("Processing file: %s\n", options.Path)
|
|
|
|
// Load the chapter
|
|
chapter, err := cbz.LoadChapter(options.Path)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to load chapter: %v", err)
|
|
}
|
|
|
|
if chapter.IsConverted {
|
|
log.Printf("Chapter already converted: %s", options.Path)
|
|
return nil
|
|
}
|
|
|
|
// Convert the chapter
|
|
convertedChapter, err := options.ChapterConverter.ConvertChapter(chapter, options.Quality, options.Split, func(msg string, current uint32, total uint32) {
|
|
if current%10 == 0 || current == total {
|
|
log.Printf("[%s] Converting: %d/%d", chapter.FilePath, current, total)
|
|
}
|
|
})
|
|
if err != nil {
|
|
var pageIgnoredError *errors2.PageIgnoredError
|
|
if !errors.As(err, &pageIgnoredError) {
|
|
return fmt.Errorf("failed to convert chapter: %v", err)
|
|
}
|
|
}
|
|
if convertedChapter == nil {
|
|
return fmt.Errorf("failed to convert chapter")
|
|
}
|
|
|
|
convertedChapter.SetConverted()
|
|
|
|
// Determine output path and handle CBR override logic
|
|
outputPath := options.Path
|
|
originalPath := options.Path
|
|
isCbrOverride := false
|
|
|
|
if options.Override {
|
|
// For override mode, check if it's a CBR file that needs to be converted to CBZ
|
|
pathLower := strings.ToLower(options.Path)
|
|
if strings.HasSuffix(pathLower, ".cbr") {
|
|
// Convert CBR to CBZ: change extension and mark for deletion
|
|
outputPath = strings.TrimSuffix(options.Path, filepath.Ext(options.Path)) + ".cbz"
|
|
isCbrOverride = true
|
|
}
|
|
// For CBZ files, outputPath remains the same (overwrite)
|
|
} else {
|
|
// Handle both .cbz and .cbr files - strip the extension and add _converted.cbz
|
|
pathLower := strings.ToLower(options.Path)
|
|
if strings.HasSuffix(pathLower, ".cbz") {
|
|
outputPath = strings.TrimSuffix(options.Path, ".cbz") + "_converted.cbz"
|
|
} else if strings.HasSuffix(pathLower, ".cbr") {
|
|
outputPath = strings.TrimSuffix(options.Path, ".cbr") + "_converted.cbz"
|
|
} else {
|
|
// Fallback for other extensions - just add _converted.cbz
|
|
outputPath = options.Path + "_converted.cbz"
|
|
}
|
|
}
|
|
|
|
// Write the converted chapter to CBZ file
|
|
err = cbz.WriteChapterToCBZ(convertedChapter, outputPath)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to write converted chapter: %v", err)
|
|
}
|
|
|
|
// If we're overriding a CBR file, delete the original CBR after successful write
|
|
if isCbrOverride {
|
|
err = os.Remove(originalPath)
|
|
if err != nil {
|
|
// Log the error but don't fail the operation since conversion succeeded
|
|
log.Printf("Warning: failed to delete original CBR file %s: %v", originalPath, err)
|
|
} else {
|
|
log.Printf("Deleted original CBR file: %s", originalPath)
|
|
}
|
|
}
|
|
|
|
log.Printf("Converted file written to: %s\n", outputPath)
|
|
return nil
|
|
|
|
}
|