106 lines
2.0 KiB
Go
106 lines
2.0 KiB
Go
package scanner
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
var DarktableCli = newDarktableWorker()
|
|
var FfmpegCli = newFfmpegWorker()
|
|
|
|
type ExecutableWorker interface {
|
|
Path() string
|
|
}
|
|
|
|
type DarktableWorker struct {
|
|
path string
|
|
}
|
|
|
|
type FfmpegWorker struct {
|
|
path string
|
|
}
|
|
|
|
func newDarktableWorker() DarktableWorker {
|
|
path, err := exec.LookPath("darktable-cli")
|
|
if err != nil {
|
|
log.Println("Executable worker not found: darktable")
|
|
} else {
|
|
log.Println("Found executable worker: darktable")
|
|
}
|
|
|
|
return DarktableWorker{
|
|
path: path,
|
|
}
|
|
}
|
|
|
|
func newFfmpegWorker() FfmpegWorker {
|
|
path, err := exec.LookPath("ffmpeg")
|
|
if err != nil {
|
|
log.Println("Executable worker not found: ffmpeg")
|
|
} else {
|
|
log.Println("Found executable worker: ffmpeg")
|
|
}
|
|
|
|
return FfmpegWorker{
|
|
path: path,
|
|
}
|
|
}
|
|
|
|
func (worker *DarktableWorker) IsInstalled() bool {
|
|
return worker.path != ""
|
|
}
|
|
|
|
func (worker *FfmpegWorker) IsInstalled() bool {
|
|
return worker.path != ""
|
|
}
|
|
|
|
func (worker *DarktableWorker) EncodeJpeg(inputPath string, outputPath string, jpegQuality int) error {
|
|
tmpDir, err := ioutil.TempDir("/tmp", "photoview-darktable")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tmpDir)
|
|
|
|
args := []string{
|
|
inputPath,
|
|
outputPath,
|
|
"--core",
|
|
"--conf",
|
|
fmt.Sprintf("plugins/imageio/format/jpeg/quality=%d", jpegQuality),
|
|
"--configdir",
|
|
tmpDir,
|
|
}
|
|
|
|
cmd := exec.Command(worker.path, args...)
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return errors.Wrapf(err, "encoding image using: %s %v", worker.path, args)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (worker *FfmpegWorker) EncodeMp4(inputPath string, outputPath string) error {
|
|
args := []string{
|
|
"-i",
|
|
inputPath,
|
|
"-vcodec", "h264",
|
|
"-acodec", "aac",
|
|
"-vf", "scale='min(1080,iw)':'min(1080,ih)':force_original_aspect_ratio=decrease",
|
|
outputPath,
|
|
}
|
|
|
|
cmd := exec.Command(worker.path, args...)
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
return errors.Wrapf(err, "encoding video using: %s", worker.path)
|
|
}
|
|
|
|
return nil
|
|
}
|