diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/pipeline/pipeline.go (renamed from internal/pipeline/main.go) | 4 | ||||
| -rw-r--r-- | internal/pipeline/put.go | 85 | 
2 files changed, 89 insertions, 0 deletions
| diff --git a/internal/pipeline/main.go b/internal/pipeline/pipeline.go index 6e03c50..b1c3cb9 100644 --- a/internal/pipeline/main.go +++ b/internal/pipeline/pipeline.go @@ -1,3 +1,7 @@ +// Copyright 2020 Nick White. +// Use of this source code is governed by the GPLv3 +// license that can be found in the LICENSE file. +  // pipeline is a package used by the bookpipeline command, which  // handles the core functionality, using channels heavily to  // coordinate jobs. Note that it is considered an "internal" package, diff --git a/internal/pipeline/put.go b/internal/pipeline/put.go new file mode 100644 index 0000000..8ada41f --- /dev/null +++ b/internal/pipeline/put.go @@ -0,0 +1,85 @@ +// Copyright 2020 Nick White. +// Use of this source code is governed by the GPLv3 +// license that can be found in the LICENSE file. + +package pipeline + +import ( +	"fmt" +	"image" +	_ "image/png" +	_ "image/jpeg" +	"os" +	"path/filepath" +) + +// null writer to enable non-verbose logging to be discarded +type NullWriter bool + +func (w NullWriter) Write(p []byte) (n int, err error) { +	return len(p), nil +} + +type fileWalk chan string + +func (f fileWalk) Walk(path string, info os.FileInfo, err error) error { +	if err != nil { +		return err +	} +	if !info.IsDir() { +		f <- path +	} +	return nil +} + +func CheckImages(dir string) error { +	checker := make(fileWalk) +	go func() { +		_ = filepath.Walk(dir, checker.Walk) +		close(checker) +	}() + +	for path := range checker { +		f, err := os.Open(path) +		if err != nil { +			return fmt.Errorf("Opening image %s failed: %v", path, err) +		} +		_, _, err = image.Decode(f) +		if err != nil { +			return fmt.Errorf("Decoding image %s failed: %v", path, err) +		} +	} + +	return nil +} + +func DetectQueueType(dir string, conn Pipeliner) string { +	// Auto detect type of queue to send to based on file extension +	pngdirs, _ := filepath.Glob(dir + "/*.png") +	jpgdirs, _ := filepath.Glob(dir + "/*.jpg") +	pngcount := len(pngdirs) +	jpgcount := len(jpgdirs) +	if pngcount > jpgcount { +		return conn.WipeQueueId() +	} else { +		return conn.PreQueueId() +	} +} + +func UploadImages(dir string, bookname string, conn Pipeliner) error { +	walker := make(fileWalk) +	go func() { +		_ = filepath.Walk(dir, walker.Walk) +		close(walker) +	}() + +	for path := range walker { +		name := filepath.Base(path) +		err := conn.Upload(conn.WIPStorageId(), filepath.Join(bookname, name), path) +		if err != nil { +			return fmt.Errorf("Failed to upload %s: %v", path, err) +		} +	} + +	return nil +} | 
