From f34ba5a37c2cf4e7ecc7ef60d16e77185a2cc77c Mon Sep 17 00:00:00 2001 From: celogeek <65178+celogeek@users.noreply.github.com> Date: Fri, 5 Jan 2024 17:54:41 +0100 Subject: [PATCH] move epubzip --- internal/epub/zip/epub_zip_storage_image.go | 100 ------------------ .../zip/epub_zip.go => epubzip/epubzip.go} | 2 +- .../epubzip_image.go} | 6 +- internal/epubzip/epubzip_image_reader.go | 54 ++++++++++ internal/epubzip/epubzip_image_writer.go | 52 +++++++++ 5 files changed, 110 insertions(+), 104 deletions(-) delete mode 100644 internal/epub/zip/epub_zip_storage_image.go rename internal/{epub/zip/epub_zip.go => epubzip/epubzip.go} (96%) rename internal/{epub/zip/epub_zip_image.go => epubzip/epubzip_image.go} (93%) create mode 100644 internal/epubzip/epubzip_image_reader.go create mode 100644 internal/epubzip/epubzip_image_writer.go diff --git a/internal/epub/zip/epub_zip_storage_image.go b/internal/epub/zip/epub_zip_storage_image.go deleted file mode 100644 index 7073315..0000000 --- a/internal/epub/zip/epub_zip_storage_image.go +++ /dev/null @@ -1,100 +0,0 @@ -package epubzip - -import ( - "archive/zip" - "image" - "os" - "sync" -) - -type EPUBZipStorageImageWriter struct { - fh *os.File - fz *zip.Writer - format string - mut *sync.Mutex -} - -func NewEPUBZipStorageImageWriter(filename string, format string) (*EPUBZipStorageImageWriter, error) { - fh, err := os.Create(filename) - if err != nil { - return nil, err - } - fz := zip.NewWriter(fh) - return &EPUBZipStorageImageWriter{fh, fz, format, &sync.Mutex{}}, nil -} - -func (e *EPUBZipStorageImageWriter) Close() error { - if err := e.fz.Close(); err != nil { - e.fh.Close() - return err - } - return e.fh.Close() -} - -func (e *EPUBZipStorageImageWriter) Add(filename string, img image.Image, quality int) error { - zipImage, err := CompressImage(filename, e.format, img, quality) - if err != nil { - return err - } - - e.mut.Lock() - defer e.mut.Unlock() - fh, err := e.fz.CreateRaw(zipImage.Header) - if err != nil { - return err - } - _, err = fh.Write(zipImage.Data) - if err != nil { - return err - } - - return nil -} - -type EPUBZipStorageImageReader struct { - filename string - fh *os.File - fz *zip.Reader - - files map[string]*zip.File -} - -func NewEPUBZipStorageImageReader(filename string) (*EPUBZipStorageImageReader, error) { - fh, err := os.Open(filename) - if err != nil { - return nil, err - } - s, err := fh.Stat() - if err != nil { - return nil, err - } - fz, err := zip.NewReader(fh, s.Size()) - if err != nil { - return nil, err - } - files := map[string]*zip.File{} - for _, z := range fz.File { - files[z.Name] = z - } - return &EPUBZipStorageImageReader{filename, fh, fz, files}, nil -} - -func (e *EPUBZipStorageImageReader) Get(filename string) *zip.File { - return e.files[filename] -} - -func (e *EPUBZipStorageImageReader) Size(filename string) uint64 { - img := e.Get(filename) - if img != nil { - return img.CompressedSize64 + 30 + uint64(len(img.Name)) - } - return 0 -} - -func (e *EPUBZipStorageImageReader) Close() error { - return e.fh.Close() -} - -func (e *EPUBZipStorageImageReader) Remove() error { - return os.Remove(e.filename) -} diff --git a/internal/epub/zip/epub_zip.go b/internal/epubzip/epubzip.go similarity index 96% rename from internal/epub/zip/epub_zip.go rename to internal/epubzip/epubzip.go index 98809f7..2dba285 100644 --- a/internal/epub/zip/epub_zip.go +++ b/internal/epubzip/epubzip.go @@ -63,7 +63,7 @@ func (e *EPUBZip) Copy(fz *zip.File) error { } // Write image. They are already compressed, so we write them down directly. -func (e *EPUBZip) WriteRaw(raw *ZipImage) error { +func (e *EPUBZip) WriteRaw(raw *EPUBZipImage) error { m, err := e.wz.CreateRaw(raw.Header) if err != nil { return err diff --git a/internal/epub/zip/epub_zip_image.go b/internal/epubzip/epubzip_image.go similarity index 93% rename from internal/epub/zip/epub_zip_image.go rename to internal/epubzip/epubzip_image.go index 1439687..063edea 100644 --- a/internal/epub/zip/epub_zip_image.go +++ b/internal/epubzip/epubzip_image.go @@ -12,13 +12,13 @@ import ( "time" ) -type ZipImage struct { +type EPUBZipImage struct { Header *zip.FileHeader Data []byte } // create gzip encoded jpeg -func CompressImage(filename string, format string, img image.Image, quality int) (*ZipImage, error) { +func CompressImage(filename string, format string, img image.Image, quality int) (*EPUBZipImage, error) { var ( data, cdata bytes.Buffer err error @@ -52,7 +52,7 @@ func CompressImage(filename string, format string, img image.Image, quality int) } t := time.Now() - return &ZipImage{ + return &EPUBZipImage{ &zip.FileHeader{ Name: filename, CompressedSize64: uint64(cdata.Len()), diff --git a/internal/epubzip/epubzip_image_reader.go b/internal/epubzip/epubzip_image_reader.go new file mode 100644 index 0000000..d17d882 --- /dev/null +++ b/internal/epubzip/epubzip_image_reader.go @@ -0,0 +1,54 @@ +package epubzip + +import ( + "archive/zip" + "os" +) + +type EPUBZipImageReader struct { + filename string + fh *os.File + fz *zip.Reader + + files map[string]*zip.File +} + +func NewImageReader(filename string) (*EPUBZipImageReader, error) { + fh, err := os.Open(filename) + if err != nil { + return nil, err + } + s, err := fh.Stat() + if err != nil { + return nil, err + } + fz, err := zip.NewReader(fh, s.Size()) + if err != nil { + return nil, err + } + files := map[string]*zip.File{} + for _, z := range fz.File { + files[z.Name] = z + } + return &EPUBZipImageReader{filename, fh, fz, files}, nil +} + +func (e *EPUBZipImageReader) Get(filename string) *zip.File { + return e.files[filename] +} + +func (e *EPUBZipImageReader) Size(filename string) uint64 { + img := e.Get(filename) + if img != nil { + return img.CompressedSize64 + 30 + uint64(len(img.Name)) + } + return 0 +} + +func (e *EPUBZipImageReader) Close() error { + return e.fh.Close() +} + +func (e *EPUBZipImageReader) Remove() error { + return os.Remove(e.filename) +} diff --git a/internal/epubzip/epubzip_image_writer.go b/internal/epubzip/epubzip_image_writer.go new file mode 100644 index 0000000..2ed4b15 --- /dev/null +++ b/internal/epubzip/epubzip_image_writer.go @@ -0,0 +1,52 @@ +package epubzip + +import ( + "archive/zip" + "image" + "os" + "sync" +) + +type EPUBZipImageWriter struct { + fh *os.File + fz *zip.Writer + format string + mut *sync.Mutex +} + +func NewImageWriter(filename string, format string) (*EPUBZipImageWriter, error) { + fh, err := os.Create(filename) + if err != nil { + return nil, err + } + fz := zip.NewWriter(fh) + return &EPUBZipImageWriter{fh, fz, format, &sync.Mutex{}}, nil +} + +func (e *EPUBZipImageWriter) Close() error { + if err := e.fz.Close(); err != nil { + e.fh.Close() + return err + } + return e.fh.Close() +} + +func (e *EPUBZipImageWriter) Add(filename string, img image.Image, quality int) error { + zipImage, err := CompressImage(filename, e.format, img, quality) + if err != nil { + return err + } + + e.mut.Lock() + defer e.mut.Unlock() + fh, err := e.fz.CreateRaw(zipImage.Header) + if err != nil { + return err + } + _, err = fh.Write(zipImage.Data) + if err != nil { + return err + } + + return nil +}