mirror of
https://github.com/celogeek/go-comic-converter.git
synced 2025-05-24 07:42:37 +02:00
improve processing
This commit is contained in:
parent
eaba40018a
commit
837a50c950
@ -47,10 +47,7 @@ type EPub struct {
|
|||||||
FirstImageTitle string
|
FirstImageTitle string
|
||||||
Error error
|
Error error
|
||||||
|
|
||||||
Processors func()
|
ProcessingImages func() chan *ImageDetails
|
||||||
ProcessorsCount int
|
|
||||||
ProcessorsWG *sync.WaitGroup
|
|
||||||
ProcessorsResult []chan *ImageDetails
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewEpub(path string) *EPub {
|
func NewEpub(path string) *EPub {
|
||||||
@ -59,12 +56,6 @@ func NewEpub(path string) *EPub {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
nbcpu := runtime.NumCPU()
|
|
||||||
results := make([]chan *ImageDetails, nbcpu)
|
|
||||||
for r := range results {
|
|
||||||
results[r] = make(chan *ImageDetails)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &EPub{
|
return &EPub{
|
||||||
Path: path,
|
Path: path,
|
||||||
|
|
||||||
@ -76,10 +67,6 @@ func NewEpub(path string) *EPub {
|
|||||||
ViewWidth: 0,
|
ViewWidth: 0,
|
||||||
ViewHeight: 0,
|
ViewHeight: 0,
|
||||||
Quality: 75,
|
Quality: 75,
|
||||||
|
|
||||||
ProcessorsCount: nbcpu,
|
|
||||||
ProcessorsWG: &sync.WaitGroup{},
|
|
||||||
ProcessorsResult: results,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,31 +157,30 @@ func (e *EPub) LoadDir(dirname string) *EPub {
|
|||||||
Path string
|
Path string
|
||||||
}
|
}
|
||||||
|
|
||||||
todo := make([]chan *Todo, e.ProcessorsCount)
|
todo := make(chan *Todo)
|
||||||
for i := range todo {
|
|
||||||
todo[i] = make(chan *Todo)
|
|
||||||
}
|
|
||||||
|
|
||||||
e.Processors = func() {
|
e.ProcessingImages = func() chan *ImageDetails {
|
||||||
for i := 0; i < e.ProcessorsCount; i++ {
|
wg := &sync.WaitGroup{}
|
||||||
e.ProcessorsWG.Add(1)
|
results := make(chan *ImageDetails)
|
||||||
go func(ticket int) {
|
for i := 0; i < runtime.NumCPU(); i++ {
|
||||||
defer e.ProcessorsWG.Done()
|
wg.Add(1)
|
||||||
defer close(e.ProcessorsResult[ticket])
|
go func() {
|
||||||
for task := range todo[ticket] {
|
defer wg.Done()
|
||||||
|
for task := range todo {
|
||||||
data, w, h := imageconverter.Convert(task.Path, true, e.ViewWidth, e.ViewHeight, e.Quality)
|
data, w, h := imageconverter.Convert(task.Path, true, e.ViewWidth, e.ViewHeight, e.Quality)
|
||||||
e.ProcessorsResult[ticket] <- &ImageDetails{task.Images, data, w, h}
|
results <- &ImageDetails{task.Images, data, w, h}
|
||||||
}
|
}
|
||||||
}(i % e.ProcessorsCount)
|
}()
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
for i, path := range images {
|
for i, path := range images {
|
||||||
todo[i%e.ProcessorsCount] <- &Todo{e.Images[i], path}
|
todo <- &Todo{e.Images[i], path}
|
||||||
}
|
|
||||||
for i := range todo {
|
|
||||||
close(todo[i])
|
|
||||||
}
|
}
|
||||||
|
close(todo)
|
||||||
|
wg.Wait()
|
||||||
|
close(results)
|
||||||
}()
|
}()
|
||||||
|
return results
|
||||||
}
|
}
|
||||||
|
|
||||||
e.FirstImageTitle = e.Images[0].Title
|
e.FirstImageTitle = e.Images[0].Title
|
||||||
@ -228,21 +214,16 @@ func (e *EPub) Write() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
e.Processors()
|
for img := range e.ProcessingImages() {
|
||||||
for i, img := range e.Images {
|
|
||||||
fmt.Printf("%03d/%03d\n", i+1, len(e.Images))
|
|
||||||
|
|
||||||
text := fmt.Sprintf("OEBPS/Text/%s.xhtml", img.Title)
|
text := fmt.Sprintf("OEBPS/Text/%s.xhtml", img.Title)
|
||||||
image := fmt.Sprintf("OEBPS/Images/%s.jpg", img.Title)
|
image := fmt.Sprintf("OEBPS/Images/%s.jpg", img.Title)
|
||||||
details := <-e.ProcessorsResult[i%e.ProcessorsCount]
|
if err := e.WriteFile(wz, text, e.Render(TEMPLATE_TEXT, img)); err != nil {
|
||||||
if err := e.WriteFile(wz, text, e.Render(TEMPLATE_TEXT, details)); err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := e.WriteFile(wz, image, details.Data); err != nil {
|
if err := e.WriteFile(wz, image, img.Data); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
e.ProcessorsWG.Wait()
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user