2021-12-27 20:13:06 +01:00

97 lines
1.7 KiB
Go

package piwigo
import (
"bytes"
"crypto/md5"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
"net/url"
"os"
"strings"
)
var CHUNK_BUFF_SIZE int64 = 32 * 1024
var CHUNK_BUFF_COUNT int = 32
var CHUNK_PRECOMPUTE_SIZE int = 8
func DumpResponse(v interface{}) (err error) {
b, err := json.MarshalIndent(v, "", " ")
if err == nil {
fmt.Println(string(b))
}
return
}
func ArgsToForm(args []string) (*url.Values, error) {
params := &url.Values{}
for _, arg := range args {
r := strings.SplitN(arg, "=", 2)
if len(r) != 2 {
return nil, errors.New("args should be key=value")
}
params.Add(r[0], strings.ReplaceAll(r[1], "'", `\'`))
}
return params, nil
}
func Md5File(filename string) (result string, err error) {
file, err := os.Open(filename)
if err != nil {
return
}
defer file.Close()
hash := md5.New()
_, err = io.Copy(hash, file)
if err != nil {
return
}
result = fmt.Sprintf("%x", hash.Sum(nil))
return
}
type Base64ChunkResult struct {
Position int64
Size int64
Buffer bytes.Buffer
}
func Base64Chunker(filename string) (out chan *Base64ChunkResult, err error) {
f, err := os.Open(filename)
if err != nil {
return
}
out = make(chan *Base64ChunkResult, CHUNK_PRECOMPUTE_SIZE)
go func() {
b := make([]byte, CHUNK_BUFF_SIZE)
defer f.Close()
defer close(out)
ok := false
for position := int64(0); !ok; position += 1 {
bf := &Base64ChunkResult{
Position: position,
}
b64 := base64.NewEncoder(base64.StdEncoding, &bf.Buffer)
for i := 0; i < CHUNK_BUFF_COUNT; i++ {
n, _ := f.Read(b)
if n == 0 {
ok = true
break
}
bf.Size += int64(n)
b64.Write(b[:n])
}
b64.Close()
if bf.Size > 0 {
out <- bf
}
}
}()
return
}