Handle all errors

This commit is contained in:
Milan Nikolic
2023-03-08 06:21:57 +01:00
parent d4abc99239
commit 5befff07ae
2 changed files with 126 additions and 108 deletions

View File

@@ -187,14 +187,12 @@ func (c *Convertor) convertImage(ctx context.Context, img image.Image, index int
switch c.Opts.Format { switch c.Opts.Format {
case "jpeg", "png", "tiff", "webp", "avif": case "jpeg", "png", "tiff", "webp", "avif":
err = c.encodeImage(img, fileName) if err := c.encodeImage(img, fileName); err != nil {
if err != nil {
return err return err
} }
case "bmp": case "bmp":
// convert image to 4-Bit BMP (16 colors) // convert image to 4-Bit BMP (16 colors)
err = c.encodeIM(img, fileName) if err := c.encodeIM(img, fileName); err != nil {
if err != nil {
return err return err
} }
} }
@@ -264,13 +262,11 @@ func (c *Convertor) levelImage(img image.Image) (image.Image, error) {
outmin := (quantumRange * c.Opts.LevelsOutMin) / 255 outmin := (quantumRange * c.Opts.LevelsOutMin) / 255
outmax := (quantumRange * c.Opts.LevelsOutMax) / 255 outmax := (quantumRange * c.Opts.LevelsOutMax) / 255
err = mw.LevelImage(inmin, c.Opts.LevelsGamma, inmax) if err := mw.LevelImage(inmin, c.Opts.LevelsGamma, inmax); err != nil {
if err != nil {
return img, fmt.Errorf("levelImage: %w", err) return img, fmt.Errorf("levelImage: %w", err)
} }
err = mw.LevelImage(-outmin, 1.0, quantumRange+(quantumRange-outmax)) if err := mw.LevelImage(-outmin, 1.0, quantumRange+(quantumRange-outmax)); err != nil {
if err != nil {
return img, fmt.Errorf("levelImage: %w", err) return img, fmt.Errorf("levelImage: %w", err)
} }
@@ -290,7 +286,12 @@ func (c *Convertor) levelImage(img image.Image) (image.Image, error) {
// convertDocument converts PDF/EPUB document to CBZ. // convertDocument converts PDF/EPUB document to CBZ.
func (c *Convertor) convertDocument(fileName string) error { func (c *Convertor) convertDocument(fileName string) error {
c.Workdir, _ = os.MkdirTemp(os.TempDir(), "cbc") var err error
c.Workdir, err = os.MkdirTemp(os.TempDir(), "cbc")
if err != nil {
return fmt.Errorf("convertDocument: %w", err)
}
doc, err := fitz.New(fileName) doc, err := fitz.New(fileName)
if err != nil { if err != nil {
@@ -327,7 +328,12 @@ func (c *Convertor) convertDocument(fileName string) error {
// convertArchive converts archive to CBZ. // convertArchive converts archive to CBZ.
func (c *Convertor) convertArchive(fileName string) error { func (c *Convertor) convertArchive(fileName string) error {
c.Workdir, _ = os.MkdirTemp(os.TempDir(), "cbc") var err error
c.Workdir, err = os.MkdirTemp(os.TempDir(), "cbc")
if err != nil {
return fmt.Errorf("convertArchive: %w", err)
}
contents, err := c.listArchive(fileName) contents, err := c.listArchive(fileName)
if err != nil { if err != nil {
@@ -373,8 +379,7 @@ func (c *Convertor) convertArchive(fileName string) error {
if c.isImage(pathName) { if c.isImage(pathName) {
if c.Opts.NoConvert { if c.Opts.NoConvert {
err = c.copyFile(bytes.NewReader(data), filepath.Join(c.Workdir, filepath.Base(pathName))) if err = c.copyFile(bytes.NewReader(data), filepath.Join(c.Workdir, filepath.Base(pathName))); err != nil {
if err != nil {
return fmt.Errorf("convertArchive: %w", err) return fmt.Errorf("convertArchive: %w", err)
} }
@@ -392,8 +397,7 @@ func (c *Convertor) convertArchive(fileName string) error {
if cover == pathName && c.Opts.NoCover { if cover == pathName && c.Opts.NoCover {
img = c.transformImage(img) img = c.transformImage(img)
err = c.encodeImage(img, filepath.Join(c.Workdir, filepath.Base(pathName))) if err = c.encodeImage(img, filepath.Join(c.Workdir, filepath.Base(pathName))); err != nil {
if err != nil {
return fmt.Errorf("convertArchive: %w", err) return fmt.Errorf("convertArchive: %w", err)
} }
@@ -402,8 +406,7 @@ func (c *Convertor) convertArchive(fileName string) error {
if c.Opts.NoRGB && !c.isGrayScale(img) { if c.Opts.NoRGB && !c.isGrayScale(img) {
img = c.transformImage(img) img = c.transformImage(img)
err = c.encodeImage(img, filepath.Join(c.Workdir, filepath.Base(pathName))) if err = c.encodeImage(img, filepath.Join(c.Workdir, filepath.Base(pathName))); err != nil {
if err != nil {
return fmt.Errorf("convertArchive: %w", err) return fmt.Errorf("convertArchive: %w", err)
} }
@@ -417,8 +420,7 @@ func (c *Convertor) convertArchive(fileName string) error {
} }
} else { } else {
if !c.Opts.NoNonImage { if !c.Opts.NoNonImage {
err = c.copyFile(bytes.NewReader(data), filepath.Join(c.Workdir, filepath.Base(pathName))) if err = c.copyFile(bytes.NewReader(data), filepath.Join(c.Workdir, filepath.Base(pathName))); err != nil {
if err != nil {
return fmt.Errorf("convertArchive: %w", err) return fmt.Errorf("convertArchive: %w", err)
} }
} }
@@ -430,7 +432,12 @@ func (c *Convertor) convertArchive(fileName string) error {
// convertDirectory converts directory to CBZ. // convertDirectory converts directory to CBZ.
func (c *Convertor) convertDirectory(dirPath string) error { func (c *Convertor) convertDirectory(dirPath string) error {
c.Workdir, _ = os.MkdirTemp(os.TempDir(), "cbc") var err error
c.Workdir, err = os.MkdirTemp(os.TempDir(), "cbc")
if err != nil {
return fmt.Errorf("convertDirectory: %w", err)
}
contents, err := c.imagesFromPath(dirPath) contents, err := c.imagesFromPath(dirPath)
if err != nil { if err != nil {
@@ -455,26 +462,22 @@ func (c *Convertor) convertDirectory(dirPath string) error {
} }
if c.isNonImage(img) && !c.Opts.NoNonImage { if c.isNonImage(img) && !c.Opts.NoNonImage {
err = c.copyFile(file, filepath.Join(c.Workdir, filepath.Base(img))) if err = c.copyFile(file, filepath.Join(c.Workdir, filepath.Base(img))); err != nil {
if err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
err = file.Close() if err = file.Close(); err != nil {
if err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
continue continue
} else if c.isImage(img) { } else if c.isImage(img) {
if c.Opts.NoConvert { if c.Opts.NoConvert {
err = c.copyFile(file, filepath.Join(c.Workdir, filepath.Base(img))) if err = c.copyFile(file, filepath.Join(c.Workdir, filepath.Base(img))); err != nil {
if err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
err = file.Close() if err = file.Close(); err != nil {
if err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
@@ -492,21 +495,18 @@ func (c *Convertor) convertDirectory(dirPath string) error {
if c.Opts.NoRGB && !c.isGrayScale(i) { if c.Opts.NoRGB && !c.isGrayScale(i) {
i = c.transformImage(i) i = c.transformImage(i)
err = c.encodeImage(i, filepath.Join(c.Workdir, filepath.Base(img))) if err = c.encodeImage(i, filepath.Join(c.Workdir, filepath.Base(img))); err != nil {
if err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
err = file.Close() if err = file.Close(); err != nil {
if err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
continue continue
} }
err = file.Close() if err = file.Close(); err != nil {
if err != nil {
return fmt.Errorf("convertDirectory: %w", err) return fmt.Errorf("convertDirectory: %w", err)
} }
@@ -569,13 +569,11 @@ func (c *Convertor) saveArchive(fileName string) error {
} }
} }
err = z.Close() if err = z.Close(); err != nil {
if err != nil {
return fmt.Errorf("saveArchive: %w", err) return fmt.Errorf("saveArchive: %w", err)
} }
err = zipfile.Close() if err = zipfile.Close(); err != nil {
if err != nil {
return fmt.Errorf("saveArchive: %w", err) return fmt.Errorf("saveArchive: %w", err)
} }
@@ -605,13 +603,11 @@ func (c *Convertor) decodeIM(reader io.Reader, fileName string) (img image.Image
return img, fmt.Errorf("decodeIM: %w", err) return img, fmt.Errorf("decodeIM: %w", err)
} }
err = mw.SetFilename(fileName) if err = mw.SetFilename(fileName); err != nil {
if err != nil {
return img, fmt.Errorf("decodeIM: %w", err) return img, fmt.Errorf("decodeIM: %w", err)
} }
err = mw.ReadImageBlob(data) if err = mw.ReadImageBlob(data); err != nil {
if err != nil {
return img, fmt.Errorf("decodeIM: %w", err) return img, fmt.Errorf("decodeIM: %w", err)
} }
@@ -678,43 +674,80 @@ func (c *Convertor) encodeIM(i image.Image, fileName string) error {
defer mw.Destroy() defer mw.Destroy()
rgba := imageToRGBA(i) rgba := imageToRGBA(i)
err := mw.ConstituteImage(uint(i.Bounds().Dx()), uint(i.Bounds().Dy()), "RGBA", imagick.PIXEL_CHAR, rgba.Pix) if err := mw.ConstituteImage(uint(i.Bounds().Dx()), uint(i.Bounds().Dy()), "RGBA", imagick.PIXEL_CHAR, rgba.Pix); err != nil {
if err != nil {
return fmt.Errorf("encodeIM: %w", err) return fmt.Errorf("encodeIM: %w", err)
} }
if c.Opts.Grayscale { if c.Opts.Grayscale {
_ = mw.TransformImageColorspace(imagick.COLORSPACE_GRAY) if err := mw.TransformImageColorspace(imagick.COLORSPACE_GRAY); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
} }
switch filepath.Ext(fileName) { switch filepath.Ext(fileName) {
case ".png": case ".png":
_ = mw.SetImageFormat("PNG") if err := mw.SetImageFormat("PNG"); err != nil {
_ = mw.WriteImage(fileName) return fmt.Errorf("encodeIM: %w", err)
}
if err := mw.WriteImage(fileName); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
case ".tif", ".tiff": case ".tif", ".tiff":
_ = mw.SetImageFormat("TIFF") if err := mw.SetImageFormat("TIFF"); err != nil {
_ = mw.WriteImage(fileName) return fmt.Errorf("encodeIM: %w", err)
}
if err := mw.WriteImage(fileName); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
case ".bmp": case ".bmp":
pw := imagick.NewPixelWand() pw := imagick.NewPixelWand()
pw.SetColor("black") pw.SetColor("black")
defer pw.Destroy() defer pw.Destroy()
_ = mw.SetImageFormat("BMP3") if err := mw.SetImageFormat("BMP3"); err != nil {
_ = mw.SetImageBackgroundColor(pw) return fmt.Errorf("encodeIM: %w", err)
_ = mw.SetImageAlphaChannel(imagick.ALPHA_CHANNEL_REMOVE) }
_ = mw.SetImageAlphaChannel(imagick.ALPHA_CHANNEL_DEACTIVATE) if err := mw.SetImageBackgroundColor(pw); err != nil {
_ = mw.SetImageMatte(false) return fmt.Errorf("encodeIM: %w", err)
_ = mw.SetImageCompression(imagick.COMPRESSION_NO) }
_ = mw.QuantizeImage(16, mw.GetImageColorspace(), 1, imagick.DITHER_METHOD_FLOYD_STEINBERG, true) if err := mw.SetImageAlphaChannel(imagick.ALPHA_CHANNEL_REMOVE); err != nil {
_ = mw.WriteImage(fileName) return fmt.Errorf("encodeIM: %w", err)
}
if err := mw.SetImageAlphaChannel(imagick.ALPHA_CHANNEL_DEACTIVATE); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
if err := mw.SetImageMatte(false); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
if err := mw.SetImageCompression(imagick.COMPRESSION_NO); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
if err := mw.QuantizeImage(16, mw.GetImageColorspace(), 1, imagick.DITHER_METHOD_FLOYD_STEINBERG, true); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
if err := mw.WriteImage(fileName); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
case ".jpg", ".jpeg": case ".jpg", ".jpeg":
_ = mw.SetImageFormat("JPEG") if err := mw.SetImageFormat("JPEG"); err != nil {
_ = mw.SetImageCompressionQuality(uint(c.Opts.Quality)) return fmt.Errorf("encodeIM: %w", err)
_ = mw.WriteImage(fileName) }
if err := mw.SetImageCompressionQuality(uint(c.Opts.Quality)); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
if err := mw.WriteImage(fileName); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
case ".avif": case ".avif":
_ = mw.SetImageFormat("AVIF") if err := mw.SetImageFormat("AVIF"); err != nil {
_ = mw.SetImageCompressionQuality(uint(c.Opts.Quality)) return fmt.Errorf("encodeIM: %w", err)
_ = mw.WriteImage(fileName) }
if err := mw.SetImageCompressionQuality(uint(c.Opts.Quality)); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
if err := mw.WriteImage(fileName); err != nil {
return fmt.Errorf("encodeIM: %w", err)
}
} }
return nil return nil
@@ -756,8 +789,7 @@ func (c *Convertor) coverArchive(fileName string) (image.Image, error) {
} }
defer archive.Close() defer archive.Close()
err = archive.EntryFor(cover) if err = archive.EntryFor(cover); err != nil {
if err != nil {
return nil, err return nil, err
} }
@@ -882,6 +914,7 @@ func imageToRGBA(src image.Image) *image.RGBA {
b := src.Bounds() b := src.Bounds()
dst := image.NewRGBA(b) dst := image.NewRGBA(b)
draw.Draw(dst, dst.Bounds(), src, b.Min, draw.Src) draw.Draw(dst, dst.Bounds(), src, b.Min, draw.Src)
return dst return dst
} }
@@ -894,6 +927,7 @@ func imageToGray(src image.Image) *image.Gray {
b := src.Bounds() b := src.Bounds()
dst := image.NewGray(b) dst := image.NewGray(b)
draw.Draw(dst, dst.Bounds(), src, b.Min, draw.Src) draw.Draw(dst, dst.Bounds(), src, b.Min, draw.Src)
return dst return dst
} }
@@ -905,6 +939,7 @@ func (c *Convertor) isArchive(f string) bool {
return true return true
} }
} }
return false return false
} }
@@ -916,6 +951,7 @@ func (c *Convertor) isDocument(f string) bool {
return true return true
} }
} }
return false return false
} }
@@ -927,6 +963,7 @@ func (c *Convertor) isImage(f string) bool {
return true return true
} }
} }
return false return false
} }
@@ -938,6 +975,7 @@ func (c *Convertor) isNonImage(f string) bool {
return true return true
} }
} }
return false return false
} }
@@ -948,6 +986,7 @@ func (c *Convertor) isSize(size int64) bool {
return false return false
} }
} }
return true return true
} }
@@ -957,6 +996,7 @@ func (c *Convertor) isGrayScale(img image.Image) bool {
if model == color.GrayModel || model == color.Gray16Model { if model == color.GrayModel || model == color.Gray16Model {
return true return true
} }
return false return false
} }
@@ -1086,8 +1126,7 @@ func (c *Convertor) Files(args []string) ([]string, error) {
} }
} else { } else {
if c.Opts.Recursive { if c.Opts.Recursive {
err = filepath.Walk(path, walkFiles) if err := filepath.Walk(path, walkFiles); err != nil {
if err != nil {
return files, fmt.Errorf("files: %w", err) return files, fmt.Errorf("files: %w", err)
} }
} else { } else {
@@ -1141,13 +1180,11 @@ func (c *Convertor) Cover(fileName string, fileInfo os.FileInfo) error {
switch c.Opts.Format { switch c.Opts.Format {
case "jpeg", "png", "tiff", "webp", "avif": case "jpeg", "png", "tiff", "webp", "avif":
err = c.encodeImage(cover, fName) if err := c.encodeImage(cover, fName); err != nil {
if err != nil {
return err return err
} }
case "bmp": case "bmp":
err = c.encodeIM(cover, fName) if err := c.encodeIM(cover, fName); err != nil {
if err != nil {
return err return err
} }
} }
@@ -1178,8 +1215,7 @@ func (c *Convertor) Thumbnail(fileName string, info os.FileInfo) error {
defer mw.Destroy() defer mw.Destroy()
rgba := imageToRGBA(cover) rgba := imageToRGBA(cover)
err = mw.ConstituteImage(uint(cover.Bounds().Dx()), uint(cover.Bounds().Dy()), "RGBA", imagick.PIXEL_CHAR, rgba.Pix) if err := mw.ConstituteImage(uint(cover.Bounds().Dx()), uint(cover.Bounds().Dy()), "RGBA", imagick.PIXEL_CHAR, rgba.Pix); err != nil {
if err != nil {
return fmt.Errorf("extractThumbnail: %w", err) return fmt.Errorf("extractThumbnail: %w", err)
} }
@@ -1195,32 +1231,25 @@ func (c *Convertor) Thumbnail(fileName string, info os.FileInfo) error {
fName = abs fName = abs
} }
err = mw.SetImageFormat("PNG") if err := mw.SetImageFormat("PNG"); err != nil {
if err != nil {
return fmt.Errorf("extractThumbnail: %w", err) return fmt.Errorf("extractThumbnail: %w", err)
} }
err = mw.SetImageProperty("Software", "CBconvert") if err := mw.SetImageProperty("Software", "CBconvert"); err != nil {
if err != nil {
return fmt.Errorf("extractThumbnail: %w", err) return fmt.Errorf("extractThumbnail: %w", err)
} }
err = mw.SetImageProperty("Description", "Thumbnail of "+fUri) if err := mw.SetImageProperty("Description", "Thumbnail of "+fUri); err != nil {
if err != nil {
return fmt.Errorf("extractThumbnail: %w", err) return fmt.Errorf("extractThumbnail: %w", err)
} }
err = mw.SetImageProperty("Thumb::URI", fUri) if err := mw.SetImageProperty("Thumb::URI", fUri); err != nil {
if err != nil {
return fmt.Errorf("extractThumbnail: %w", err) return fmt.Errorf("extractThumbnail: %w", err)
} }
err = mw.SetImageProperty("Thumb::MTime", strconv.FormatInt(info.ModTime().Unix(), 10)) if err := mw.SetImageProperty("Thumb::MTime", strconv.FormatInt(info.ModTime().Unix(), 10)); err != nil {
if err != nil {
return fmt.Errorf("extractThumbnail: %w", err) return fmt.Errorf("extractThumbnail: %w", err)
} }
err = mw.SetImageProperty("Thumb::Size", strconv.FormatInt(info.Size(), 10)) if err := mw.SetImageProperty("Thumb::Size", strconv.FormatInt(info.Size(), 10)); err != nil {
if err != nil {
return fmt.Errorf("extractThumbnail: %w", err) return fmt.Errorf("extractThumbnail: %w", err)
} }
err = mw.SetImageProperty("Thumb::Mimetype", mime.TypeByExtension(filepath.Ext(fileName))) if err := mw.SetImageProperty("Thumb::Mimetype", mime.TypeByExtension(filepath.Ext(fileName))); err != nil {
if err != nil {
return fmt.Errorf("extractThumbnail: %w", err) return fmt.Errorf("extractThumbnail: %w", err)
} }
@@ -1256,30 +1285,24 @@ func (c *Convertor) Convert(filename string, info os.FileInfo) error {
c.CurrFile++ c.CurrFile++
if info.IsDir() { if info.IsDir() {
err := c.convertDirectory(filename) if err := c.convertDirectory(filename); err != nil {
if err != nil {
return err return err
} }
err = c.saveArchive(filename) if err := c.saveArchive(filename); err != nil {
if err != nil {
return err return err
} }
} else if c.isDocument(filename) { } else if c.isDocument(filename) {
err := c.convertDocument(filename) if err := c.convertDocument(filename); err != nil {
if err != nil {
return err return err
} }
err = c.saveArchive(filename) if err := c.saveArchive(filename); err != nil {
if err != nil {
return err return err
} }
} else { } else {
err := c.convertArchive(filename) if err := c.convertArchive(filename); err != nil {
if err != nil {
return err return err
} }
err = c.saveArchive(filename) if err := c.saveArchive(filename); err != nil {
if err != nil {
return err return err
} }
} }

View File

@@ -21,8 +21,7 @@ func main() {
go func() { go func() {
for range c { for range c {
fmt.Println("\naborting") fmt.Println("\naborting")
err := os.RemoveAll(conv.Workdir) if err := os.RemoveAll(conv.Workdir); err != nil {
if err != nil {
fmt.Println(err) fmt.Println(err)
} }
os.Exit(1) os.Exit(1)
@@ -30,8 +29,7 @@ func main() {
}() }()
if _, err := os.Stat(opts.Outdir); err != nil { if _, err := os.Stat(opts.Outdir); err != nil {
err = os.MkdirAll(opts.Outdir, 0775) if err := os.MkdirAll(opts.Outdir, 0775); err != nil {
if err != nil {
fmt.Println(err) fmt.Println(err)
} }
os.Exit(1) os.Exit(1)
@@ -102,23 +100,20 @@ func main() {
continue continue
} else if opts.Cover { } else if opts.Cover {
err = conv.Cover(file, stat) if err := conv.Cover(file, stat); err != nil {
if err != nil {
fmt.Println(err) fmt.Println(err)
os.Exit(1) os.Exit(1)
} }
continue continue
} else if opts.Thumbnail { } else if opts.Thumbnail {
err = conv.Thumbnail(file, stat) if err = conv.Thumbnail(file, stat); err != nil {
if err != nil {
fmt.Println(err) fmt.Println(err)
os.Exit(1) os.Exit(1)
} }
continue continue
} }
err = conv.Convert(file, stat) if err := conv.Convert(file, stat); err != nil {
if err != nil {
fmt.Println(err) fmt.Println(err)
os.Exit(1) os.Exit(1)
} }