mirror of
https://github.com/celogeek/go-comic-converter.git
synced 2025-05-25 00:02:37 +02:00
passthrough, support rar/cbr
This commit is contained in:
parent
277dff8161
commit
506cd1ad6c
@ -15,6 +15,8 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/nwaples/rardecode/v2"
|
||||||
|
|
||||||
"github.com/celogeek/go-comic-converter/v3/internal/pkg/epubimage"
|
"github.com/celogeek/go-comic-converter/v3/internal/pkg/epubimage"
|
||||||
"github.com/celogeek/go-comic-converter/v3/internal/pkg/epubprogress"
|
"github.com/celogeek/go-comic-converter/v3/internal/pkg/epubprogress"
|
||||||
"github.com/celogeek/go-comic-converter/v3/internal/pkg/epubzip"
|
"github.com/celogeek/go-comic-converter/v3/internal/pkg/epubzip"
|
||||||
@ -94,10 +96,17 @@ func (e EPUBImageProcessor) passThroughDir() (images []epubimage.EPUBImage, err
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var uncompressedData []byte
|
||||||
|
uncompressedData, err = io.ReadAll(f)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
|
||||||
var img epubimage.EPUBImage
|
var img epubimage.EPUBImage
|
||||||
img, err = copyRawDataToStorage(
|
img, err = copyRawDataToStorage(
|
||||||
imgStorage,
|
imgStorage,
|
||||||
f,
|
uncompressedData,
|
||||||
i,
|
i,
|
||||||
input,
|
input,
|
||||||
imgPath,
|
imgPath,
|
||||||
@ -171,16 +180,27 @@ func (e EPUBImageProcessor) passThroughCbz() (images []epubimage.EPUBImage, err
|
|||||||
defer bar.Close()
|
defer bar.Close()
|
||||||
|
|
||||||
for _, imgZip := range imagesZip {
|
for _, imgZip := range imagesZip {
|
||||||
|
if _, ok := indexedNames[imgZip.Name]; !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
var f io.ReadCloser
|
var f io.ReadCloser
|
||||||
f, err = imgZip.Open()
|
f, err = imgZip.Open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var uncompressedData []byte
|
||||||
|
uncompressedData, err = io.ReadAll(f)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
|
||||||
var img epubimage.EPUBImage
|
var img epubimage.EPUBImage
|
||||||
img, err = copyRawDataToStorage(
|
img, err = copyRawDataToStorage(
|
||||||
imgStorage,
|
imgStorage,
|
||||||
f,
|
uncompressedData,
|
||||||
indexedNames[imgZip.Name],
|
indexedNames[imgZip.Name],
|
||||||
"",
|
"",
|
||||||
imgZip.Name,
|
imgZip.Name,
|
||||||
@ -203,10 +223,139 @@ func (e EPUBImageProcessor) passThroughCbz() (images []epubimage.EPUBImage, err
|
|||||||
|
|
||||||
func (e EPUBImageProcessor) passThroughCbr() (images []epubimage.EPUBImage, err error) {
|
func (e EPUBImageProcessor) passThroughCbr() (images []epubimage.EPUBImage, err error) {
|
||||||
images = make([]epubimage.EPUBImage, 0)
|
images = make([]epubimage.EPUBImage, 0)
|
||||||
|
|
||||||
|
var isSolid bool
|
||||||
|
files, err := rardecode.List(e.Input)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
names := make([]string, 0)
|
||||||
|
for _, f := range files {
|
||||||
|
if filterCopyPath(f.IsDir, f.Name) {
|
||||||
|
if f.Solid {
|
||||||
|
isSolid = true
|
||||||
|
}
|
||||||
|
names = append(names, f.Name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(names) == 0 {
|
||||||
err = errNoImagesFound
|
err = errNoImagesFound
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sort.Sort(sortpath.By(names, e.SortPathMode))
|
||||||
|
|
||||||
|
indexedNames := make(map[string]int)
|
||||||
|
for i, name := range names {
|
||||||
|
indexedNames[name] = i
|
||||||
|
}
|
||||||
|
|
||||||
|
var imgStorage epubzip.StorageImageWriter
|
||||||
|
imgStorage, err = epubzip.NewStorageImageWriter(e.ImgStorage(), e.Image.Format)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer imgStorage.Close()
|
||||||
|
|
||||||
|
// processing
|
||||||
|
bar := epubprogress.New(epubprogress.Options{
|
||||||
|
Quiet: e.Quiet,
|
||||||
|
Json: e.Json,
|
||||||
|
Max: len(names),
|
||||||
|
Description: "Copying",
|
||||||
|
CurrentJob: 1,
|
||||||
|
TotalJob: 2,
|
||||||
|
})
|
||||||
|
defer bar.Close()
|
||||||
|
|
||||||
|
if isSolid {
|
||||||
|
var r *rardecode.ReadCloser
|
||||||
|
r, err = rardecode.OpenReader(e.Input)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer r.Close()
|
||||||
|
|
||||||
|
for {
|
||||||
|
f, rerr := r.Next()
|
||||||
|
if rerr != nil {
|
||||||
|
if rerr == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
err = rerr
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := indexedNames[f.Name]; !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var uncompressedData []byte
|
||||||
|
uncompressedData, err = io.ReadAll(r)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var img epubimage.EPUBImage
|
||||||
|
img, err = copyRawDataToStorage(
|
||||||
|
imgStorage,
|
||||||
|
uncompressedData,
|
||||||
|
indexedNames[f.Name],
|
||||||
|
"",
|
||||||
|
f.Name,
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
images = append(images, img)
|
||||||
|
_ = bar.Add(1)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for _, file := range files {
|
||||||
|
if i, ok := indexedNames[file.Name]; ok {
|
||||||
|
var f io.ReadCloser
|
||||||
|
f, err = file.Open()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var uncompressedData []byte
|
||||||
|
uncompressedData, err = io.ReadAll(f)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
f.Close()
|
||||||
|
|
||||||
|
var img epubimage.EPUBImage
|
||||||
|
img, err = copyRawDataToStorage(
|
||||||
|
imgStorage,
|
||||||
|
uncompressedData,
|
||||||
|
i,
|
||||||
|
"",
|
||||||
|
file.Name,
|
||||||
|
)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
images = append(images, img)
|
||||||
|
_ = bar.Add(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(images) == 0 {
|
||||||
|
err = errNoImagesFound
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func filterCopyPath(isDir bool, filename string) bool {
|
func filterCopyPath(isDir bool, filename string) bool {
|
||||||
return !isDir &&
|
return !isDir &&
|
||||||
!strings.HasPrefix(filepath.Base(filename), ".") &&
|
!strings.HasPrefix(filepath.Base(filename), ".") &&
|
||||||
@ -215,22 +364,11 @@ func filterCopyPath(isDir bool, filename string) bool {
|
|||||||
|
|
||||||
func copyRawDataToStorage(
|
func copyRawDataToStorage(
|
||||||
imgStorage epubzip.StorageImageWriter,
|
imgStorage epubzip.StorageImageWriter,
|
||||||
f io.ReadCloser,
|
uncompressedData []byte,
|
||||||
id int,
|
id int,
|
||||||
dirname string,
|
dirname string,
|
||||||
filename string,
|
filename string,
|
||||||
) (img epubimage.EPUBImage, err error) {
|
) (img epubimage.EPUBImage, err error) {
|
||||||
var uncompressedData []byte
|
|
||||||
uncompressedData, err = io.ReadAll(f)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = f.Close()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
p, fn := filepath.Split(filepath.Clean(filename))
|
p, fn := filepath.Split(filepath.Clean(filename))
|
||||||
if p == dirname {
|
if p == dirname {
|
||||||
p = ""
|
p = ""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user