mirror of
https://github.com/Belphemur/CBZOptimizer.git
synced 2026-01-12 08:30:45 +01:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
62638517e4 | ||
|
|
dbf7f6c262 | ||
|
|
9ecd5ff3a5 | ||
|
|
a63d2395f0 |
@@ -2,7 +2,9 @@ package converter
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"github.com/belphemur/CBZOptimizer/converter/constant"
|
||||||
"github.com/belphemur/CBZOptimizer/manga"
|
"github.com/belphemur/CBZOptimizer/manga"
|
||||||
|
"golang.org/x/exp/slices"
|
||||||
"image"
|
"image"
|
||||||
"image/jpeg"
|
"image/jpeg"
|
||||||
"os"
|
"os"
|
||||||
@@ -15,21 +17,31 @@ func TestConvertChapter(t *testing.T) {
|
|||||||
name string
|
name string
|
||||||
genTestChapter func(path string) (*manga.Chapter, error)
|
genTestChapter func(path string) (*manga.Chapter, error)
|
||||||
split bool
|
split bool
|
||||||
|
expectFailure []constant.ConversionFormat
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "All split pages",
|
name: "All split pages",
|
||||||
genTestChapter: genBigPages,
|
genTestChapter: genBigPages,
|
||||||
split: true,
|
split: true,
|
||||||
|
expectFailure: []constant.ConversionFormat{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Big Pages, no split",
|
||||||
|
genTestChapter: genBigPages,
|
||||||
|
split: false,
|
||||||
|
expectFailure: []constant.ConversionFormat{constant.WebP},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "No split pages",
|
name: "No split pages",
|
||||||
genTestChapter: genSmallPages,
|
genTestChapter: genSmallPages,
|
||||||
split: false,
|
split: false,
|
||||||
|
expectFailure: []constant.ConversionFormat{},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Mix of split and no split pages",
|
name: "Mix of split and no split pages",
|
||||||
genTestChapter: genMixSmallBig,
|
genTestChapter: genMixSmallBig,
|
||||||
split: true,
|
split: true,
|
||||||
|
expectFailure: []constant.ConversionFormat{},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
// Load test genTestChapter from testdata
|
// Load test genTestChapter from testdata
|
||||||
@@ -58,9 +70,15 @@ func TestConvertChapter(t *testing.T) {
|
|||||||
t.Log(msg)
|
t.Log(msg)
|
||||||
}
|
}
|
||||||
|
|
||||||
convertedChapter, err := converter.ConvertChapter(chapter, quality, false, progress)
|
convertedChapter, err := converter.ConvertChapter(chapter, quality, tc.split, progress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if slices.Contains(tc.expectFailure, converter.Format()) {
|
||||||
|
t.Logf("Expected failure to convert genTestChapter: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
t.Fatalf("failed to convert genTestChapter: %v", err)
|
t.Fatalf("failed to convert genTestChapter: %v", err)
|
||||||
|
} else if slices.Contains(tc.expectFailure, converter.Format()) {
|
||||||
|
t.Fatalf("expected failure to convert genTestChapter didn't happen")
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(convertedChapter.Pages) == 0 {
|
if len(convertedChapter.Pages) == 0 {
|
||||||
@@ -87,7 +105,7 @@ func genBigPages(path string) (*manga.Chapter, error) {
|
|||||||
|
|
||||||
var pages []*manga.Page
|
var pages []*manga.Page
|
||||||
for i := 0; i < 5; i++ { // Assuming there are 5 pages for the test
|
for i := 0; i < 5; i++ { // Assuming there are 5 pages for the test
|
||||||
img := image.NewRGBA(image.Rect(0, 0, 300, 10000))
|
img := image.NewRGBA(image.Rect(0, 0, 300, 17000))
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
err := jpeg.Encode(buf, img, nil)
|
err := jpeg.Encode(buf, img, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ import (
|
|||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const webpMaxHeight = 16383
|
||||||
|
|
||||||
type Converter struct {
|
type Converter struct {
|
||||||
maxHeight int
|
maxHeight int
|
||||||
cropHeight int
|
cropHeight int
|
||||||
@@ -104,9 +106,7 @@ func (converter *Converter) ConvertChapter(chapter *manga.Chapter, quality uint8
|
|||||||
go func(page *manga.Page) {
|
go func(page *manga.Page) {
|
||||||
defer wgPages.Done()
|
defer wgPages.Done()
|
||||||
|
|
||||||
splitNeeded, img, format, err := converter.checkPageNeedsSplit(page)
|
splitNeeded, img, format, err := converter.checkPageNeedsSplit(page, split)
|
||||||
// Respect choice to split or not
|
|
||||||
splitNeeded = split && splitNeeded
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errChan <- fmt.Errorf("error checking if page %d of genTestChapter %s needs split: %v", page.Index, chapter.FilePath, err)
|
errChan <- fmt.Errorf("error checking if page %d of genTestChapter %s needs split: %v", page.Index, chapter.FilePath, err)
|
||||||
return
|
return
|
||||||
@@ -192,7 +192,7 @@ func (converter *Converter) cropImage(img image.Image) ([]image.Image, error) {
|
|||||||
return parts, nil
|
return parts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (converter *Converter) checkPageNeedsSplit(page *manga.Page) (bool, image.Image, string, error) {
|
func (converter *Converter) checkPageNeedsSplit(page *manga.Page, splitRequested bool) (bool, image.Image, string, error) {
|
||||||
reader := io.Reader(bytes.NewBuffer(page.Contents.Bytes()))
|
reader := io.Reader(bytes.NewBuffer(page.Contents.Bytes()))
|
||||||
img, format, err := image.Decode(reader)
|
img, format, err := image.Decode(reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -202,7 +202,10 @@ func (converter *Converter) checkPageNeedsSplit(page *manga.Page) (bool, image.I
|
|||||||
bounds := img.Bounds()
|
bounds := img.Bounds()
|
||||||
height := bounds.Dy()
|
height := bounds.Dy()
|
||||||
|
|
||||||
return height >= converter.maxHeight, img, format, nil
|
if height >= webpMaxHeight && !splitRequested {
|
||||||
|
return false, img, format, fmt.Errorf("page[%d] height %d exceeds maximum height %d of webp format", page.Index, height, webpMaxHeight)
|
||||||
|
}
|
||||||
|
return height >= converter.maxHeight && splitRequested, img, format, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (converter *Converter) convertPage(container *manga.PageContainer, quality uint8) (*manga.PageContainer, error) {
|
func (converter *Converter) convertPage(container *manga.PageContainer, quality uint8) (*manga.PageContainer, error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user