diff --git a/internal/epub/options/epub_options.go b/internal/epub/options/epub_options.go deleted file mode 100644 index d41a499..0000000 --- a/internal/epub/options/epub_options.go +++ /dev/null @@ -1,72 +0,0 @@ -// Package epuboptions Options for EPUB creation. -package epuboptions - -import "fmt" - -type Crop struct { - Enabled bool - Left, Up, Right, Bottom int - Limit int - SkipIfLimitReached bool -} - -type Color struct { - Foreground, Background string -} - -type View struct { - Width, Height int - AspectRatio float64 - PortraitOnly bool - Color Color -} - -type Image struct { - Crop Crop - Quality int - Brightness int - Contrast int - AutoContrast bool - AutoRotate bool - AutoSplitDoublePage bool - KeepDoublePageIfSplit bool - KeepSplitDoublePageAspect bool - NoBlankImage bool - Manga bool - HasCover bool - View View - GrayScale bool - GrayScaleMode int - Resize bool - Format string - AppleBookCompatibility bool -} - -type Options struct { - Input string - Output string - Title string - TitlePage int - Author string - LimitMb int - StripFirstDirectoryFromToc bool - Dry bool - DryVerbose bool - SortPathMode int - Quiet bool - Json bool - Workers int - Image Image -} - -func (o Options) WorkersRatio(pct int) (nbWorkers int) { - nbWorkers = o.Workers * pct / 100 - if nbWorkers < 1 { - nbWorkers = 1 - } - return -} - -func (o Options) ImgStorage() string { - return fmt.Sprintf("%s.tmp", o.Output) -} diff --git a/internal/epub/templates/epub_templates.go b/internal/epub/templates/epub_templates.go deleted file mode 100644 index dd80a40..0000000 --- a/internal/epub/templates/epub_templates.go +++ /dev/null @@ -1,21 +0,0 @@ -// Package epubtemplates Templates use to create xml files of the EPUB. -package epubtemplates - -import _ "embed" - -var ( - //go:embed "epub_templates_container.xml.tmpl" - Container string - - //go:embed "epub_templates_applebooks.xml.tmpl" - AppleBooks string - - //go:embed "epub_templates_style.css.tmpl" - Style string - - //go:embed "epub_templates_text.xhtml.tmpl" - Text string - - //go:embed "epub_templates_blank.xhtml.tmpl" - Blank string -) diff --git a/internal/converter/converter.go b/internal/pkg/converter/converter.go similarity index 96% rename from internal/converter/converter.go rename to internal/pkg/converter/converter.go index f7edc51..1722a05 100644 --- a/internal/converter/converter.go +++ b/internal/pkg/converter/converter.go @@ -18,27 +18,26 @@ import ( "strings" "time" - "github.com/celogeek/go-comic-converter/v2/internal/converter/options" - "github.com/celogeek/go-comic-converter/v2/internal/utils" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/utils" ) type Converter struct { - Options *options.Options + Options *Options Cmd *flag.FlagSet - order []converterOrder + order []order isZeroValueErrs []error startAt time.Time } // New Create a new parser func New() *Converter { - o := options.New() + o := NewOptions() cmd := flag.NewFlagSet("go-comic-converter", flag.ExitOnError) conv := &Converter{ Options: o, Cmd: cmd, - order: make([]converterOrder, 0), + order: make([]order, 0), startAt: time.Now(), } @@ -48,9 +47,9 @@ func New() *Converter { utils.Printf("Usage of %s:\n", filepath.Base(os.Args[0])) for _, o := range conv.order { switch v := o.(type) { - case converterOrderSection: + case orderSection: utils.Printf("\n%s:\n", o.Value()) - case converterOrderName: + case orderName: utils.Println(conv.Usage(v.isString, cmd.Lookup(v.Value()))) } } @@ -69,31 +68,31 @@ func (c *Converter) LoadConfig() error { // AddSection Create a new section of config func (c *Converter) AddSection(section string) { - c.order = append(c.order, converterOrderSection{value: section}) + c.order = append(c.order, orderSection{value: section}) } // AddStringParam Add a string parameter func (c *Converter) AddStringParam(p *string, name string, value string, usage string) { c.Cmd.StringVar(p, name, value, usage) - c.order = append(c.order, converterOrderName{value: name, isString: true}) + c.order = append(c.order, orderName{value: name, isString: true}) } // AddIntParam Add an integer parameter func (c *Converter) AddIntParam(p *int, name string, value int, usage string) { c.Cmd.IntVar(p, name, value, usage) - c.order = append(c.order, converterOrderName{value: name}) + c.order = append(c.order, orderName{value: name}) } // AddFloatParam Add an float parameter func (c *Converter) AddFloatParam(p *float64, name string, value float64, usage string) { c.Cmd.Float64Var(p, name, value, usage) - c.order = append(c.order, converterOrderName{value: name}) + c.order = append(c.order, orderName{value: name}) } // AddBoolParam Add a boolean parameter func (c *Converter) AddBoolParam(p *bool, name string, value bool, usage string) { c.Cmd.BoolVar(p, name, value, usage) - c.order = append(c.order, converterOrderName{value: name}) + c.order = append(c.order, orderName{value: name}) } // InitParse Initialize the parser with all section and parameter. diff --git a/internal/converter/options/converter_options.go b/internal/pkg/converter/options.go similarity index 96% rename from internal/converter/options/converter_options.go rename to internal/pkg/converter/options.go index b7a91df..4e06c9e 100644 --- a/internal/converter/options/converter_options.go +++ b/internal/pkg/converter/options.go @@ -1,5 +1,5 @@ // Package options manage options with default value from config. -package options +package converter import ( "encoding/json" @@ -9,8 +9,6 @@ import ( "strings" "gopkg.in/yaml.v3" - - "github.com/celogeek/go-comic-converter/v2/internal/converter/profiles" ) type Options struct { @@ -77,11 +75,11 @@ type Options struct { Help bool `yaml:"-"` // Internal - profiles profiles.Profiles + profiles Profiles } -// New Initialize default options. -func New() *Options { +// NewOptions Initialize default options. +func NewOptions() *Options { return &Options{ Profile: "SR", Quality: 85, @@ -100,7 +98,7 @@ func New() *Options { BackgroundColor: "FFF", Format: "jpeg", TitlePage: 1, - profiles: profiles.New(), + profiles: NewProfiles(), } } @@ -310,7 +308,7 @@ func (o *Options) ShowConfig() string { // ResetConfig reset all settings to default value func (o *Options) ResetConfig() error { - if err := New().SaveConfig(); err != nil { + if err := NewOptions().SaveConfig(); err != nil { return err } return o.LoadConfig() @@ -329,7 +327,7 @@ func (o *Options) SaveConfig() error { } // GetProfile shortcut to get current profile -func (o *Options) GetProfile() *profiles.Profile { +func (o *Options) GetProfile() *Profile { if p, ok := o.profiles[o.Profile]; ok { return &p } diff --git a/internal/converter/converter_order.go b/internal/pkg/converter/order.go similarity index 52% rename from internal/converter/converter_order.go rename to internal/pkg/converter/order.go index df431dd..45effd5 100644 --- a/internal/converter/converter_order.go +++ b/internal/pkg/converter/order.go @@ -1,27 +1,27 @@ package converter // Name or Section -type converterOrder interface { +type order interface { Value() string } // Section -type converterOrderSection struct { +type orderSection struct { value string } -func (s converterOrderSection) Value() string { +func (s orderSection) Value() string { return s.value } // Name // // isString is used to quote the default value. -type converterOrderName struct { +type orderName struct { value string isString bool } -func (s converterOrderName) Value() string { +func (s orderName) Value() string { return s.value } diff --git a/internal/converter/profiles/converter_profiles.go b/internal/pkg/converter/profiles.go similarity index 94% rename from internal/converter/profiles/converter_profiles.go rename to internal/pkg/converter/profiles.go index e6d1357..c01a09b 100644 --- a/internal/converter/profiles/converter_profiles.go +++ b/internal/pkg/converter/profiles.go @@ -1,5 +1,5 @@ // Package profiles manage supported profiles for go-comic-converter. -package profiles +package converter import ( "fmt" @@ -15,8 +15,8 @@ type Profile struct { type Profiles map[string]Profile -// New Initialize list of all supported profiles. -func New() Profiles { +// NewProfiles Initialize list of all supported profiles. +func NewProfiles() Profiles { res := make(Profiles) for _, r := range []Profile{ // High Resolution for Tablet diff --git a/internal/epub/epub.go b/internal/pkg/epub/epub.go similarity index 90% rename from internal/epub/epub.go rename to internal/pkg/epub/epub.go index 4c5d9d1..b72be7a 100644 --- a/internal/epub/epub.go +++ b/internal/pkg/epub/epub.go @@ -14,18 +14,18 @@ import ( "github.com/gofrs/uuid" - epubimage "github.com/celogeek/go-comic-converter/v2/internal/epub/image" - epubimageprocessor "github.com/celogeek/go-comic-converter/v2/internal/epub/imageprocessor" - epuboptions "github.com/celogeek/go-comic-converter/v2/internal/epub/options" - epubprogress "github.com/celogeek/go-comic-converter/v2/internal/epub/progress" - epubtemplates "github.com/celogeek/go-comic-converter/v2/internal/epub/templates" - epubtree "github.com/celogeek/go-comic-converter/v2/internal/epub/tree" - epubzip "github.com/celogeek/go-comic-converter/v2/internal/epub/zip" - "github.com/celogeek/go-comic-converter/v2/internal/utils" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubimage" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubimageprocessor" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epuboptions" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubprogress" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubtemplates" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubtree" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubzip" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/utils" ) type EPUB struct { - epuboptions.Options + epuboptions.EPUBOptions UID string Publisher string UpdatedAt string @@ -35,12 +35,12 @@ type EPUB struct { } type epubPart struct { - Cover epubimage.Image - Images []epubimage.Image + Cover epubimage.EPUBImage + Images []epubimage.EPUBImage } // New initialize EPUB -func New(options epuboptions.Options) EPUB { +func New(options epuboptions.EPUBOptions) EPUB { uid := uuid.Must(uuid.NewV4()) tmpl := template.New("parser") tmpl.Funcs(template.FuncMap{ @@ -49,7 +49,7 @@ func New(options epuboptions.Options) EPUB { }) return EPUB{ - Options: options, + EPUBOptions: options, UID: uid.String(), Publisher: "GO Comic Converter", UpdatedAt: time.Now().UTC().Format("2006-01-02T15:04:05Z"), @@ -69,7 +69,7 @@ func (e EPUB) render(templateString string, data map[string]any) string { } // write image to the zip -func (e EPUB) writeImage(wz epubzip.EPUBZip, img epubimage.Image, zipImg *zip.File) error { +func (e EPUB) writeImage(wz epubzip.EPUBZip, img epubimage.EPUBImage, zipImg *zip.File) error { err := wz.WriteContent( img.EPUBPagePath(), []byte(e.render(epubtemplates.Text, map[string]any{ @@ -87,7 +87,7 @@ func (e EPUB) writeImage(wz epubzip.EPUBZip, img epubimage.Image, zipImg *zip.Fi } // write blank page -func (e EPUB) writeBlank(wz epubzip.EPUBZip, img epubimage.Image) error { +func (e EPUB) writeBlank(wz epubzip.EPUBZip, img epubimage.EPUBImage) error { return wz.WriteContent( img.EPUBSpacePath(), []byte(e.render(epubtemplates.Blank, map[string]any{ @@ -98,7 +98,7 @@ func (e EPUB) writeBlank(wz epubzip.EPUBZip, img epubimage.Image) error { } // write title image -func (e EPUB) writeCoverImage(wz epubzip.EPUBZip, img epubimage.Image, part, totalParts int) error { +func (e EPUB) writeCoverImage(wz epubzip.EPUBZip, img epubimage.EPUBImage, part, totalParts int) error { title := "Cover" text := "" if totalParts > 1 { @@ -141,7 +141,7 @@ func (e EPUB) writeCoverImage(wz epubzip.EPUBZip, img epubimage.Image, part, tot } // write title image -func (e EPUB) writeTitleImage(wz epubzip.EPUBZip, img epubimage.Image, title string) error { +func (e EPUB) writeTitleImage(wz epubzip.EPUBZip, img epubimage.EPUBImage, title string) error { titleAlign := "" if !e.Image.View.PortraitOnly { if e.Image.Manga { @@ -238,7 +238,7 @@ func (e EPUB) getParts() (parts []epubPart, imgStorage epubzip.StorageImageReade baseSize := uint64(128*1024) + imgStorage.Size(cover.EPUBImgPath())*2 currentSize := baseSize - currentImages := make([]epubimage.Image, 0) + currentImages := make([]epubimage.EPUBImage, 0) part := 1 for _, img := range images { @@ -250,7 +250,7 @@ func (e EPUB) getParts() (parts []epubPart, imgStorage epubzip.StorageImageReade }) part += 1 currentSize = baseSize - currentImages = make([]epubimage.Image, 0) + currentImages = make([]epubimage.EPUBImage, 0) } currentSize += imgSize currentImages = append(currentImages, img) @@ -268,7 +268,7 @@ func (e EPUB) getParts() (parts []epubPart, imgStorage epubzip.StorageImageReade // create a tree from the directories. // // this is used to simulate the toc. -func (e EPUB) getTree(images []epubimage.Image, skipFiles bool) string { +func (e EPUB) getTree(images []epubimage.EPUBImage, skipFiles bool) string { t := epubtree.New() for _, img := range images { if skipFiles { @@ -423,7 +423,7 @@ func (e EPUB) Write() error { utils.Printf("TOC:\n - %s\n%s\n", e.Title, e.getTree(p.Images, true)) if e.DryVerbose { if e.Image.HasCover { - utils.Printf("Cover:\n%s\n", e.getTree([]epubimage.Image{p.Cover}, false)) + utils.Printf("Cover:\n%s\n", e.getTree([]epubimage.EPUBImage{p.Cover}, false)) } utils.Printf("Files:\n%s\n", e.getTree(p.Images, false)) } diff --git a/internal/epub/image/epub_image.go b/internal/pkg/epubimage/epub_image.go similarity index 80% rename from internal/epub/image/epub_image.go rename to internal/pkg/epubimage/epub_image.go index 1578ceb..fe33cf2 100644 --- a/internal/epub/image/epub_image.go +++ b/internal/pkg/epubimage/epub_image.go @@ -1,4 +1,4 @@ -// Package epubimage Image helpers to transform image. +// Package epubimage EPUBImage helpers to transform image. package epubimage import ( @@ -7,7 +7,7 @@ import ( "strings" ) -type Image struct { +type EPUBImage struct { Id int Part int Raw image.Image @@ -24,47 +24,47 @@ type Image struct { } // SpaceKey key name of the blank page after the image -func (i Image) SpaceKey() string { +func (i EPUBImage) SpaceKey() string { return fmt.Sprintf("space_%d", i.Id) } // SpacePath path of the blank page -func (i Image) SpacePath() string { +func (i EPUBImage) SpacePath() string { return fmt.Sprintf("Text/%s.xhtml", i.SpaceKey()) } // EPUBSpacePath path of the blank page into the EPUB -func (i Image) EPUBSpacePath() string { +func (i EPUBImage) EPUBSpacePath() string { return fmt.Sprintf("OEBPS/%s", i.SpacePath()) } // PageKey key for page -func (i Image) PageKey() string { +func (i EPUBImage) PageKey() string { return fmt.Sprintf("page_%d_p%d", i.Id, i.Part) } // PagePath page path linked to the image -func (i Image) PagePath() string { +func (i EPUBImage) PagePath() string { return fmt.Sprintf("Text/%s.xhtml", i.PageKey()) } // EPUBPagePath page path into the EPUB -func (i Image) EPUBPagePath() string { +func (i EPUBImage) EPUBPagePath() string { return fmt.Sprintf("OEBPS/%s", i.PagePath()) } // ImgKey key for image -func (i Image) ImgKey() string { +func (i EPUBImage) ImgKey() string { return fmt.Sprintf("img_%d_p%d", i.Id, i.Part) } // ImgPath image path -func (i Image) ImgPath() string { +func (i EPUBImage) ImgPath() string { return fmt.Sprintf("Images/%s.%s", i.ImgKey(), i.Format) } // EPUBImgPath image path into the EPUB -func (i Image) EPUBImgPath() string { +func (i EPUBImage) EPUBImgPath() string { return fmt.Sprintf("OEBPS/%s", i.ImgPath()) } @@ -72,7 +72,7 @@ func (i Image) EPUBImgPath() string { // // center by default. // align to left or right if it's part of the split double page. -func (i Image) ImgStyle(viewWidth, viewHeight int, align string) string { +func (i EPUBImage) ImgStyle(viewWidth, viewHeight int, align string) string { relWidth, relHeight := i.RelSize(viewWidth, viewHeight) marginW, marginH := float64(viewWidth-relWidth)/2, float64(viewHeight-relHeight)/2 @@ -97,7 +97,7 @@ func (i Image) ImgStyle(viewWidth, viewHeight int, align string) string { return strings.Join(style, "; ") } -func (i Image) RelSize(viewWidth, viewHeight int) (relWidth, relHeight int) { +func (i EPUBImage) RelSize(viewWidth, viewHeight int) (relWidth, relHeight int) { w, h := viewWidth, viewHeight srcw, srch := i.Width, i.Height diff --git a/internal/epub/imagefilters/epub_image_filters_autocontrast.go b/internal/pkg/epubimagefilters/auto_contrast.go similarity index 100% rename from internal/epub/imagefilters/epub_image_filters_autocontrast.go rename to internal/pkg/epubimagefilters/auto_contrast.go diff --git a/internal/epub/imagefilters/epub_image_filters_autocrop.go b/internal/pkg/epubimagefilters/auto_crop.go similarity index 100% rename from internal/epub/imagefilters/epub_image_filters_autocrop.go rename to internal/pkg/epubimagefilters/auto_crop.go diff --git a/internal/epub/imagefilters/epub_image_filters_cover_title.go b/internal/pkg/epubimagefilters/cover_title.go similarity index 100% rename from internal/epub/imagefilters/epub_image_filters_cover_title.go rename to internal/pkg/epubimagefilters/cover_title.go diff --git a/internal/epub/imagefilters/epub_image_filters_crop_split_double_page.go b/internal/pkg/epubimagefilters/crop_split_double_page.go similarity index 100% rename from internal/epub/imagefilters/epub_image_filters_crop_split_double_page.go rename to internal/pkg/epubimagefilters/crop_split_double_page.go diff --git a/internal/epub/imagefilters/epub_image_filters_pixel.go b/internal/pkg/epubimagefilters/pixel.go similarity index 100% rename from internal/epub/imagefilters/epub_image_filters_pixel.go rename to internal/pkg/epubimagefilters/pixel.go diff --git a/internal/epub/imageprocessor/epub_image_processor_loader.go b/internal/pkg/epubimageprocessor/loader.go similarity index 98% rename from internal/epub/imageprocessor/epub_image_processor_loader.go rename to internal/pkg/epubimageprocessor/loader.go index d34c828..cfdf7e1 100644 --- a/internal/epub/imageprocessor/epub_image_processor_loader.go +++ b/internal/pkg/epubimageprocessor/loader.go @@ -27,8 +27,9 @@ import ( pdfimage "github.com/raff/pdfreader/image" "github.com/raff/pdfreader/pdfread" - "github.com/celogeek/go-comic-converter/v2/internal/sortpath" - "github.com/celogeek/go-comic-converter/v2/internal/utils" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/sortpath" + + "github.com/celogeek/go-comic-converter/v2/internal/pkg/utils" ) type task struct { diff --git a/internal/epub/imageprocessor/epub_image_processor.go b/internal/pkg/epubimageprocessor/processor.go similarity index 88% rename from internal/epub/imageprocessor/epub_image_processor.go rename to internal/pkg/epubimageprocessor/processor.go index c2cad84..daf92b7 100644 --- a/internal/epub/imageprocessor/epub_image_processor.go +++ b/internal/pkg/epubimageprocessor/processor.go @@ -11,25 +11,25 @@ import ( "github.com/disintegration/gift" - epubimage "github.com/celogeek/go-comic-converter/v2/internal/epub/image" - epubimagefilters "github.com/celogeek/go-comic-converter/v2/internal/epub/imagefilters" - epuboptions "github.com/celogeek/go-comic-converter/v2/internal/epub/options" - epubprogress "github.com/celogeek/go-comic-converter/v2/internal/epub/progress" - epubzip "github.com/celogeek/go-comic-converter/v2/internal/epub/zip" - "github.com/celogeek/go-comic-converter/v2/internal/utils" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubimage" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubimagefilters" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epuboptions" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubprogress" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubzip" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/utils" ) type EPUBImageProcessor struct { - epuboptions.Options + epuboptions.EPUBOptions } -func New(o epuboptions.Options) EPUBImageProcessor { +func New(o epuboptions.EPUBOptions) EPUBImageProcessor { return EPUBImageProcessor{o} } // Load extract and convert images -func (e EPUBImageProcessor) Load() (images []epubimage.Image, err error) { - images = make([]epubimage.Image, 0) +func (e EPUBImageProcessor) Load() (images []epubimage.EPUBImage, err error) { + images = make([]epubimage.EPUBImage, 0) imageCount, imageInput, err := e.load() if err != nil { return nil, err @@ -38,7 +38,7 @@ func (e EPUBImageProcessor) Load() (images []epubimage.Image, err error) { // dry run, skip conversion if e.Dry { for img := range imageInput { - images = append(images, epubimage.Image{ + images = append(images, epubimage.EPUBImage{ Id: img.Id, Path: img.Path, Name: img.Name, @@ -49,7 +49,7 @@ func (e EPUBImageProcessor) Load() (images []epubimage.Image, err error) { return images, nil } - imageOutput := make(chan epubimage.Image) + imageOutput := make(chan epubimage.EPUBImage) // processing bar := epubprogress.New(epubprogress.Options{ @@ -82,7 +82,7 @@ func (e EPUBImageProcessor) Load() (images []epubimage.Image, err error) { // do not keep double page if requested if !(img.DoublePage && input.Id > 0 && - e.Options.Image.AutoSplitDoublePage && !e.Options.Image.KeepDoublePageIfSplit) { + e.EPUBOptions.Image.AutoSplitDoublePage && !e.EPUBOptions.Image.KeepDoublePageIfSplit) { if err = imgStorage.Add(img.EPUBImgPath(), img.Raw, e.Image.Quality); err != nil { _ = bar.Close() utils.Printf("error with %s: %s", input.Name, err) @@ -141,7 +141,7 @@ func (e EPUBImageProcessor) Load() (images []epubimage.Image, err error) { } func (e EPUBImageProcessor) createImage(src image.Image, r image.Rectangle) draw.Image { - if e.Options.Image.GrayScale { + if e.EPUBOptions.Image.GrayScale { return image.NewGray(r) } @@ -173,7 +173,7 @@ func (e EPUBImageProcessor) createImage(src image.Image, r image.Rectangle) draw // transform image into 1 or 3 images // only doublepage with autosplit has 3 versions -func (e EPUBImageProcessor) transformImage(input task, part int, right bool) epubimage.Image { +func (e EPUBImageProcessor) transformImage(input task, part int, right bool) epubimage.EPUBImage { g := gift.New() src := input.Image srcBounds := src.Bounds() @@ -262,7 +262,7 @@ func (e EPUBImageProcessor) transformImage(input task, part int, right bool) epu dst := e.createImage(src, g.Bounds(src.Bounds())) g.Draw(dst, src) - return epubimage.Image{ + return epubimage.EPUBImage{ Id: input.Id, Part: part, Raw: dst, @@ -312,7 +312,7 @@ func (e EPUBImageProcessor) Cover16LevelOfGray(bounds image.Rectangle) draw.Imag } // CoverTitleData create a title page with the cover -func (e EPUBImageProcessor) CoverTitleData(o CoverTitleDataOptions) (epubzip.ZipImage, error) { +func (e EPUBImageProcessor) CoverTitleData(o CoverTitleDataOptions) (epubzip.Image, error) { // Create a blur version of the cover g := gift.New(epubimagefilters.CoverTitle(o.Text, o.Align, o.PctWidth, o.PctMargin, o.MaxFontSize, o.BorderSize)) var dst draw.Image diff --git a/internal/pkg/epuboptions/color.go b/internal/pkg/epuboptions/color.go new file mode 100644 index 0000000..75112b5 --- /dev/null +++ b/internal/pkg/epuboptions/color.go @@ -0,0 +1,5 @@ +package epuboptions + +type Color struct { + Foreground, Background string +} diff --git a/internal/pkg/epuboptions/crop.go b/internal/pkg/epuboptions/crop.go new file mode 100644 index 0000000..4cc66bb --- /dev/null +++ b/internal/pkg/epuboptions/crop.go @@ -0,0 +1,8 @@ +package epuboptions + +type Crop struct { + Enabled bool + Left, Up, Right, Bottom int + Limit int + SkipIfLimitReached bool +} diff --git a/internal/pkg/epuboptions/epub_options.go b/internal/pkg/epuboptions/epub_options.go new file mode 100644 index 0000000..8018566 --- /dev/null +++ b/internal/pkg/epuboptions/epub_options.go @@ -0,0 +1,33 @@ +// Package epuboptions EPUBOptions for EPUB creation. +package epuboptions + +import "fmt" + +type EPUBOptions struct { + Input string + Output string + Title string + TitlePage int + Author string + LimitMb int + StripFirstDirectoryFromToc bool + Dry bool + DryVerbose bool + SortPathMode int + Quiet bool + Json bool + Workers int + Image Image +} + +func (o EPUBOptions) WorkersRatio(pct int) (nbWorkers int) { + nbWorkers = o.Workers * pct / 100 + if nbWorkers < 1 { + nbWorkers = 1 + } + return +} + +func (o EPUBOptions) ImgStorage() string { + return fmt.Sprintf("%s.tmp", o.Output) +} diff --git a/internal/pkg/epuboptions/image.go b/internal/pkg/epuboptions/image.go new file mode 100644 index 0000000..807d583 --- /dev/null +++ b/internal/pkg/epuboptions/image.go @@ -0,0 +1,22 @@ +package epuboptions + +type Image struct { + Crop Crop + Quality int + Brightness int + Contrast int + AutoContrast bool + AutoRotate bool + AutoSplitDoublePage bool + KeepDoublePageIfSplit bool + KeepSplitDoublePageAspect bool + NoBlankImage bool + Manga bool + HasCover bool + View View + GrayScale bool + GrayScaleMode int + Resize bool + Format string + AppleBookCompatibility bool +} diff --git a/internal/pkg/epuboptions/view.go b/internal/pkg/epuboptions/view.go new file mode 100644 index 0000000..d2fbdd5 --- /dev/null +++ b/internal/pkg/epuboptions/view.go @@ -0,0 +1,8 @@ +package epuboptions + +type View struct { + Width, Height int + AspectRatio float64 + PortraitOnly bool + Color Color +} diff --git a/internal/epub/progress/epub_progress.go b/internal/pkg/epubprogress/epub_progress.go similarity index 84% rename from internal/epub/progress/epub_progress.go rename to internal/pkg/epubprogress/epub_progress.go index ab3d2f8..0cefb67 100644 --- a/internal/epub/progress/epub_progress.go +++ b/internal/pkg/epubprogress/epub_progress.go @@ -2,13 +2,14 @@ package epubprogress import ( + "encoding/json" "fmt" "os" "time" "github.com/schollz/progressbar/v3" - "github.com/celogeek/go-comic-converter/v2/internal/utils" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/utils" ) type Options struct { @@ -20,18 +21,21 @@ type Options struct { TotalJob int } -type EpubProgress interface { +type EPUBProgress interface { Add(num int) error Close() error } -func New(o Options) EpubProgress { +func New(o Options) EPUBProgress { if o.Quiet { return progressbar.DefaultSilent(int64(o.Max)) } if o.Json { - return newEpubProgressJson(o) + return &jsonprogress{ + o: o, + e: json.NewEncoder(os.Stdout), + } } fmtJob := fmt.Sprintf("%%0%dd", len(fmt.Sprint(o.TotalJob))) diff --git a/internal/epub/progress/epub_progress_json.go b/internal/pkg/epubprogress/json.go similarity index 60% rename from internal/epub/progress/epub_progress_json.go rename to internal/pkg/epubprogress/json.go index cce3709..cb495fb 100644 --- a/internal/epub/progress/epub_progress_json.go +++ b/internal/pkg/epubprogress/json.go @@ -2,28 +2,20 @@ package epubprogress import ( "encoding/json" - "os" ) -type Json struct { +type jsonprogress struct { o Options e *json.Encoder current int } -func newEpubProgressJson(o Options) EpubProgress { - return &Json{ - o: o, - e: json.NewEncoder(os.Stdout), - } -} - -func (p *Json) Add(num int) error { +func (p *jsonprogress) Add(num int) error { p.current += num return p.e.Encode(map[string]any{ - "type": "progress", + "type": "epubprogress", "data": map[string]any{ - "progress": map[string]any{ + "epubprogress": map[string]any{ "current": p.current, "total": p.o.Max, }, @@ -36,6 +28,6 @@ func (p *Json) Add(num int) error { }) } -func (p *Json) Close() error { +func (p *jsonprogress) Close() error { return nil } diff --git a/internal/pkg/epubtemplates/applebooks.go b/internal/pkg/epubtemplates/applebooks.go new file mode 100644 index 0000000..4e5257a --- /dev/null +++ b/internal/pkg/epubtemplates/applebooks.go @@ -0,0 +1,6 @@ +package epubtemplates + +import _ "embed" + +//go:embed "applebooks.xml.tmpl" +var AppleBooks string diff --git a/internal/epub/templates/epub_templates_applebooks.xml.tmpl b/internal/pkg/epubtemplates/applebooks.xml.tmpl similarity index 100% rename from internal/epub/templates/epub_templates_applebooks.xml.tmpl rename to internal/pkg/epubtemplates/applebooks.xml.tmpl diff --git a/internal/pkg/epubtemplates/blank.go b/internal/pkg/epubtemplates/blank.go new file mode 100644 index 0000000..5267aa3 --- /dev/null +++ b/internal/pkg/epubtemplates/blank.go @@ -0,0 +1,7 @@ +// Package epubtemplates Templates use to create xml files of the EPUB. +package epubtemplates + +import _ "embed" + +//go:embed "blank.xhtml.tmpl" +var Blank string diff --git a/internal/epub/templates/epub_templates_blank.xhtml.tmpl b/internal/pkg/epubtemplates/blank.xhtml.tmpl similarity index 100% rename from internal/epub/templates/epub_templates_blank.xhtml.tmpl rename to internal/pkg/epubtemplates/blank.xhtml.tmpl diff --git a/internal/pkg/epubtemplates/container.go b/internal/pkg/epubtemplates/container.go new file mode 100644 index 0000000..e08f916 --- /dev/null +++ b/internal/pkg/epubtemplates/container.go @@ -0,0 +1,6 @@ +package epubtemplates + +import _ "embed" + +//go:embed "container.xml.tmpl" +var Container string diff --git a/internal/epub/templates/epub_templates_container.xml.tmpl b/internal/pkg/epubtemplates/container.xml.tmpl similarity index 100% rename from internal/epub/templates/epub_templates_container.xml.tmpl rename to internal/pkg/epubtemplates/container.xml.tmpl diff --git a/internal/epub/templates/epub_templates_content.go b/internal/pkg/epubtemplates/content.go similarity index 96% rename from internal/epub/templates/epub_templates_content.go rename to internal/pkg/epubtemplates/content.go index 5c46d98..c263f09 100644 --- a/internal/epub/templates/epub_templates_content.go +++ b/internal/pkg/epubtemplates/content.go @@ -5,8 +5,8 @@ import ( "github.com/beevik/etree" - epubimage "github.com/celogeek/go-comic-converter/v2/internal/epub/image" - epuboptions "github.com/celogeek/go-comic-converter/v2/internal/epub/options" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubimage" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epuboptions" ) type Content struct { @@ -17,8 +17,8 @@ type Content struct { Publisher string UpdatedAt string ImageOptions epuboptions.Image - Cover epubimage.Image - Images []epubimage.Image + Cover epubimage.EPUBImage + Images []epubimage.EPUBImage Current int Total int } @@ -143,7 +143,7 @@ func (o Content) getMeta() []tag { func (o Content) getManifest() []tag { var imageTags, pageTags, spaceTags []tag - addTag := func(img epubimage.Image, withSpace bool) { + addTag := func(img epubimage.EPUBImage, withSpace bool) { imageTags = append(imageTags, tag{"item", tagAttrs{"id": img.ImgKey(), "href": img.ImgPath(), "media-type": fmt.Sprintf("image/%s", o.ImageOptions.Format)}, ""}, ) diff --git a/internal/epub/templates/epub_templates_style.css.tmpl b/internal/pkg/epubtemplates/style.css.tmpl similarity index 100% rename from internal/epub/templates/epub_templates_style.css.tmpl rename to internal/pkg/epubtemplates/style.css.tmpl diff --git a/internal/pkg/epubtemplates/style.go b/internal/pkg/epubtemplates/style.go new file mode 100644 index 0000000..4711a7a --- /dev/null +++ b/internal/pkg/epubtemplates/style.go @@ -0,0 +1,6 @@ +package epubtemplates + +import _ "embed" + +//go:embed "style.css.tmpl" +var Style string diff --git a/internal/pkg/epubtemplates/text.go b/internal/pkg/epubtemplates/text.go new file mode 100644 index 0000000..4b5ddc3 --- /dev/null +++ b/internal/pkg/epubtemplates/text.go @@ -0,0 +1,6 @@ +package epubtemplates + +import _ "embed" + +//go:embed "text.xhtml.tmpl" +var Text string diff --git a/internal/epub/templates/epub_templates_text.xhtml.tmpl b/internal/pkg/epubtemplates/text.xhtml.tmpl similarity index 100% rename from internal/epub/templates/epub_templates_text.xhtml.tmpl rename to internal/pkg/epubtemplates/text.xhtml.tmpl diff --git a/internal/epub/templates/epub_templates_toc.go b/internal/pkg/epubtemplates/toc.go similarity index 94% rename from internal/epub/templates/epub_templates_toc.go rename to internal/pkg/epubtemplates/toc.go index ac5d625..96636dc 100644 --- a/internal/epub/templates/epub_templates_toc.go +++ b/internal/pkg/epubtemplates/toc.go @@ -6,13 +6,13 @@ import ( "github.com/beevik/etree" - epubimage "github.com/celogeek/go-comic-converter/v2/internal/epub/image" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epubimage" ) // Toc create toc // //goland:noinspection HttpUrlsUsage -func Toc(title string, hasTitle bool, stripFirstDirectoryFromToc bool, images []epubimage.Image) string { +func Toc(title string, hasTitle bool, stripFirstDirectoryFromToc bool, images []epubimage.EPUBImage) string { doc := etree.NewDocument() doc.CreateProcInst("xml", `version="1.0" encoding="UTF-8"`) doc.CreateDirective("DOCTYPE html") diff --git a/internal/epub/tree/epub_tree.go b/internal/pkg/epubtree/epub_tree.go similarity index 89% rename from internal/epub/tree/epub_tree.go rename to internal/pkg/epubtree/epub_tree.go index 6afac0a..0f6dbec 100644 --- a/internal/epub/tree/epub_tree.go +++ b/internal/pkg/epubtree/epub_tree.go @@ -23,7 +23,7 @@ import ( "strings" ) -type Tree struct { +type EPUBTree struct { nodes map[string]*Node } @@ -33,19 +33,19 @@ type Node struct { } // New initialize tree with a root node -func New() *Tree { - return &Tree{map[string]*Node{ +func New() *EPUBTree { + return &EPUBTree{map[string]*Node{ ".": {".", []*Node{}}, }} } // Root root node -func (n *Tree) Root() *Node { +func (n *EPUBTree) Root() *Node { return n.nodes["."] } // Add the filename to the tree -func (n *Tree) Add(filename string) { +func (n *EPUBTree) Add(filename string) { cn := n.Root() cp := "" for _, p := range strings.Split(filepath.Clean(filename), string(filepath.Separator)) { diff --git a/internal/epub/zip/epub_zip.go b/internal/pkg/epubzip/epub_zip.go similarity index 97% rename from internal/epub/zip/epub_zip.go rename to internal/pkg/epubzip/epub_zip.go index 3dd054f..62f3058 100644 --- a/internal/epub/zip/epub_zip.go +++ b/internal/pkg/epubzip/epub_zip.go @@ -67,7 +67,7 @@ func (e EPUBZip) Copy(fz *zip.File) error { } // 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 Image) 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/pkg/epubzip/image.go similarity index 87% rename from internal/epub/zip/epub_zip_image.go rename to internal/pkg/epubzip/image.go index 5df69ae..df87c4f 100644 --- a/internal/epub/zip/epub_zip_image.go +++ b/internal/pkg/epubzip/image.go @@ -12,13 +12,13 @@ import ( "time" ) -type ZipImage struct { +type Image struct { Header *zip.FileHeader Data []byte } // 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) (Image, error) { var ( data, cdata bytes.Buffer err error @@ -33,27 +33,27 @@ func CompressImage(filename string, format string, img image.Image, quality int) err = fmt.Errorf("unknown format %q", format) } if err != nil { - return ZipImage{}, err + return Image{}, err } wcdata, err := flate.NewWriter(&cdata, flate.BestCompression) if err != nil { - return ZipImage{}, err + return Image{}, err } _, err = wcdata.Write(data.Bytes()) if err != nil { - return ZipImage{}, err + return Image{}, err } err = wcdata.Close() if err != nil { - return ZipImage{}, err + return Image{}, err } t := time.Now() //goland:noinspection GoDeprecation - return ZipImage{ + return Image{ &zip.FileHeader{ Name: filename, CompressedSize64: uint64(cdata.Len()), diff --git a/internal/epub/zip/epub_zip_storage_image.go b/internal/pkg/epubzip/storage_image_reader.go similarity index 53% rename from internal/epub/zip/epub_zip_storage_image.go rename to internal/pkg/epubzip/storage_image_reader.go index f08f7d8..42acaef 100644 --- a/internal/epub/zip/epub_zip_storage_image.go +++ b/internal/pkg/epubzip/storage_image_reader.go @@ -2,55 +2,9 @@ package epubzip import ( "archive/zip" - "image" "os" - "sync" ) -type StorageImageWriter struct { - fh *os.File - fz *zip.Writer - format string - mut *sync.Mutex -} - -func NewStorageImageWriter(filename string, format string) (StorageImageWriter, error) { - fh, err := os.Create(filename) - if err != nil { - return StorageImageWriter{}, err - } - fz := zip.NewWriter(fh) - return StorageImageWriter{fh, fz, format, &sync.Mutex{}}, nil -} - -func (e StorageImageWriter) Close() error { - if err := e.fz.Close(); err != nil { - _ = e.fh.Close() - return err - } - return e.fh.Close() -} - -func (e StorageImageWriter) 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 StorageImageReader struct { filename string fh *os.File diff --git a/internal/pkg/epubzip/storage_image_writer.go b/internal/pkg/epubzip/storage_image_writer.go new file mode 100644 index 0000000..ccec171 --- /dev/null +++ b/internal/pkg/epubzip/storage_image_writer.go @@ -0,0 +1,52 @@ +package epubzip + +import ( + "archive/zip" + "image" + "os" + "sync" +) + +type StorageImageWriter struct { + fh *os.File + fz *zip.Writer + format string + mut *sync.Mutex +} + +func NewStorageImageWriter(filename string, format string) (StorageImageWriter, error) { + fh, err := os.Create(filename) + if err != nil { + return StorageImageWriter{}, err + } + fz := zip.NewWriter(fh) + return StorageImageWriter{fh, fz, format, &sync.Mutex{}}, nil +} + +func (e StorageImageWriter) Close() error { + if err := e.fz.Close(); err != nil { + _ = e.fh.Close() + return err + } + return e.fh.Close() +} + +func (e StorageImageWriter) 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 +} diff --git a/internal/sortpath/sortpath.go b/internal/pkg/sortpath/by.go similarity index 100% rename from internal/sortpath/sortpath.go rename to internal/pkg/sortpath/by.go diff --git a/internal/sortpath/sortpath_parser.go b/internal/pkg/sortpath/parser.go similarity index 100% rename from internal/sortpath/sortpath_parser.go rename to internal/pkg/sortpath/parser.go diff --git a/internal/utils/utils.go b/internal/pkg/utils/utils.go similarity index 100% rename from internal/utils/utils.go rename to internal/pkg/utils/utils.go diff --git a/main.go b/main.go index d751563..856253c 100644 --- a/main.go +++ b/main.go @@ -14,10 +14,10 @@ import ( "github.com/tcnksm/go-latest" - "github.com/celogeek/go-comic-converter/v2/internal/converter" - "github.com/celogeek/go-comic-converter/v2/internal/epub" - epuboptions "github.com/celogeek/go-comic-converter/v2/internal/epub/options" - "github.com/celogeek/go-comic-converter/v2/internal/utils" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/converter" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epub" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/epuboptions" + "github.com/celogeek/go-comic-converter/v2/internal/pkg/utils" ) func main() { @@ -110,7 +110,7 @@ $ go install github.com/celogeek/go-comic-converter/v%d@%s profile := cmd.Options.GetProfile() - if err := epub.New(epuboptions.Options{ + if err := epub.New(epuboptions.EPUBOptions{ Input: cmd.Options.Input, Output: cmd.Options.Output, LimitMb: cmd.Options.LimitMb,