remove pointer from epub zip

This commit is contained in:
Celogeek 2024-05-11 14:26:51 +02:00
parent a94e67dd06
commit 3d31108aba
Signed by: celogeek
SSH Key Fingerprint: SHA256:njNJLzoLQdbV9PC6ehcruRb0QnEgxABoCYZ+0+aUIYc
3 changed files with 31 additions and 32 deletions

View File

@ -17,17 +17,17 @@ type EPUBZip struct {
} }
// New create a new EPUB // New create a new EPUB
func New(path string) (*EPUBZip, error) { func New(path string) (EPUBZip, error) {
w, err := os.Create(path) w, err := os.Create(path)
if err != nil { if err != nil {
return nil, err return EPUBZip{}, err
} }
wz := zip.NewWriter(w) wz := zip.NewWriter(w)
return &EPUBZip{w, wz}, nil return EPUBZip{w, wz}, nil
} }
// Close compress pipe and file. // Close compress pipe and file.
func (e *EPUBZip) Close() error { func (e EPUBZip) Close() error {
if err := e.wz.Close(); err != nil { if err := e.wz.Close(); err != nil {
return err return err
} }
@ -37,10 +37,10 @@ func (e *EPUBZip) Close() error {
// WriteMagic Write mimetype, in a very specific way. // WriteMagic Write mimetype, in a very specific way.
// //
// This will be valid with epubcheck tools. // This will be valid with epubcheck tools.
func (e *EPUBZip) WriteMagic() error { func (e EPUBZip) WriteMagic() error {
t := time.Now().UTC() t := time.Now().UTC()
//goland:noinspection GoDeprecation //goland:noinspection GoDeprecation
fh := &zip.FileHeader{ fh := zip.FileHeader{
Name: "mimetype", Name: "mimetype",
Method: zip.Store, Method: zip.Store,
Modified: t, Modified: t,
@ -53,7 +53,7 @@ func (e *EPUBZip) WriteMagic() error {
fh.CreatorVersion = fh.CreatorVersion&0xff00 | 20 // preserve compatibility byte fh.CreatorVersion = fh.CreatorVersion&0xff00 | 20 // preserve compatibility byte
fh.ReaderVersion = 20 fh.ReaderVersion = 20
fh.SetMode(0600) fh.SetMode(0600)
m, err := e.wz.CreateRaw(fh) m, err := e.wz.CreateRaw(&fh)
if err != nil { if err != nil {
return err return err
@ -62,12 +62,12 @@ func (e *EPUBZip) WriteMagic() error {
return err return err
} }
func (e *EPUBZip) Copy(fz *zip.File) error { func (e EPUBZip) Copy(fz *zip.File) error {
return e.wz.Copy(fz) return e.wz.Copy(fz)
} }
// WriteRaw Write image. They are already compressed, so we write them down directly. // WriteRaw Write image. They are already compressed, so we write them down directly.
func (e *EPUBZip) WriteRaw(raw *ZipImage) error { func (e EPUBZip) WriteRaw(raw ZipImage) error {
m, err := e.wz.CreateRaw(raw.Header) m, err := e.wz.CreateRaw(raw.Header)
if err != nil { if err != nil {
return err return err
@ -77,7 +77,7 @@ func (e *EPUBZip) WriteRaw(raw *ZipImage) error {
} }
// WriteContent Write file. Compressed it using deflate. // WriteContent Write file. Compressed it using deflate.
func (e *EPUBZip) WriteContent(file string, content []byte) error { func (e EPUBZip) WriteContent(file string, content []byte) error {
m, err := e.wz.CreateHeader(&zip.FileHeader{ m, err := e.wz.CreateHeader(&zip.FileHeader{
Name: file, Name: file,
Modified: time.Now(), Modified: time.Now(),

View File

@ -18,7 +18,7 @@ type ZipImage struct {
} }
// CompressImage create gzip encoded jpeg // CompressImage 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) (ZipImage, error) {
var ( var (
data, cdata bytes.Buffer data, cdata bytes.Buffer
err error err error
@ -33,27 +33,27 @@ func CompressImage(filename string, format string, img image.Image, quality int)
err = fmt.Errorf("unknown format %q", format) err = fmt.Errorf("unknown format %q", format)
} }
if err != nil { if err != nil {
return nil, err return ZipImage{}, err
} }
wcdata, err := flate.NewWriter(&cdata, flate.BestCompression) wcdata, err := flate.NewWriter(&cdata, flate.BestCompression)
if err != nil { if err != nil {
return nil, err return ZipImage{}, err
} }
_, err = wcdata.Write(data.Bytes()) _, err = wcdata.Write(data.Bytes())
if err != nil { if err != nil {
return nil, err return ZipImage{}, err
} }
err = wcdata.Close() err = wcdata.Close()
if err != nil { if err != nil {
return nil, err return ZipImage{}, err
} }
t := time.Now() t := time.Now()
//goland:noinspection GoDeprecation //goland:noinspection GoDeprecation
return &ZipImage{ return ZipImage{
&zip.FileHeader{ &zip.FileHeader{
Name: filename, Name: filename,
CompressedSize64: uint64(cdata.Len()), CompressedSize64: uint64(cdata.Len()),

View File

@ -14,16 +14,16 @@ type StorageImageWriter struct {
mut *sync.Mutex mut *sync.Mutex
} }
func NewStorageImageWriter(filename string, format string) (*StorageImageWriter, error) { func NewStorageImageWriter(filename string, format string) (StorageImageWriter, error) {
fh, err := os.Create(filename) fh, err := os.Create(filename)
if err != nil { if err != nil {
return nil, err return StorageImageWriter{}, err
} }
fz := zip.NewWriter(fh) fz := zip.NewWriter(fh)
return &StorageImageWriter{fh, fz, format, &sync.Mutex{}}, nil return StorageImageWriter{fh, fz, format, &sync.Mutex{}}, nil
} }
func (e *StorageImageWriter) Close() error { func (e StorageImageWriter) Close() error {
if err := e.fz.Close(); err != nil { if err := e.fz.Close(); err != nil {
_ = e.fh.Close() _ = e.fh.Close()
return err return err
@ -31,7 +31,7 @@ func (e *StorageImageWriter) Close() error {
return e.fh.Close() return e.fh.Close()
} }
func (e *StorageImageWriter) Add(filename string, img image.Image, quality int) error { func (e StorageImageWriter) Add(filename string, img image.Image, quality int) error {
zipImage, err := CompressImage(filename, e.format, img, quality) zipImage, err := CompressImage(filename, e.format, img, quality)
if err != nil { if err != nil {
return err return err
@ -59,42 +59,41 @@ type StorageImageReader struct {
files map[string]*zip.File files map[string]*zip.File
} }
func NewStorageImageReader(filename string) (*StorageImageReader, error) { func NewStorageImageReader(filename string) (StorageImageReader, error) {
fh, err := os.Open(filename) fh, err := os.Open(filename)
if err != nil { if err != nil {
return nil, err return StorageImageReader{}, err
} }
s, err := fh.Stat() s, err := fh.Stat()
if err != nil { if err != nil {
return nil, err return StorageImageReader{}, err
} }
fz, err := zip.NewReader(fh, s.Size()) fz, err := zip.NewReader(fh, s.Size())
if err != nil { if err != nil {
return nil, err return StorageImageReader{}, err
} }
files := map[string]*zip.File{} files := map[string]*zip.File{}
for _, z := range fz.File { for _, z := range fz.File {
files[z.Name] = z files[z.Name] = z
} }
return &StorageImageReader{filename, fh, fz, files}, nil return StorageImageReader{filename, fh, fz, files}, nil
} }
func (e *StorageImageReader) Get(filename string) *zip.File { func (e StorageImageReader) Get(filename string) *zip.File {
return e.files[filename] return e.files[filename]
} }
func (e *StorageImageReader) Size(filename string) uint64 { func (e StorageImageReader) Size(filename string) uint64 {
img := e.Get(filename) if img, ok := e.files[filename]; ok {
if img != nil {
return img.CompressedSize64 + 30 + uint64(len(img.Name)) return img.CompressedSize64 + 30 + uint64(len(img.Name))
} }
return 0 return 0
} }
func (e *StorageImageReader) Close() error { func (e StorageImageReader) Close() error {
return e.fh.Close() return e.fh.Close()
} }
func (e *StorageImageReader) Remove() error { func (e StorageImageReader) Remove() error {
return os.Remove(e.filename) return os.Remove(e.filename)
} }