Kyoo/transcoder/src/extract.go
2024-02-19 17:14:41 +01:00

63 lines
1.3 KiB
Go

package src
import (
"fmt"
"log"
"os"
"os/exec"
)
var extracted = NewCMap[string, <-chan struct{}]()
func Extract(path string, sha string, route string) (<-chan struct{}, error) {
ret := make(chan struct{})
existing, created := extracted.GetOrSet(sha, ret)
if !created {
return existing, nil
}
go func() {
defer printExecTime("Starting extraction of %s", path)()
info, err := GetInfo(path, sha, route)
if err != nil {
extracted.Remove(sha)
close(ret)
return
}
attachment_path := fmt.Sprintf("%s/%s/att", Settings.Metadata, sha)
subs_path := fmt.Sprintf("%s/%s/sub", Settings.Metadata, sha)
os.MkdirAll(attachment_path, 0o644)
os.MkdirAll(subs_path, 0o755)
cmd := exec.Command(
"ffmpeg",
"-dump_attachment:t", "",
// override old attachments
"-y",
"-i", path,
)
cmd.Dir = attachment_path
for _, sub := range info.Subtitles {
if ext := sub.Extension; ext != nil {
cmd.Args = append(
cmd.Args,
"-map", fmt.Sprintf("0:s:%d", sub.Index),
"-c:s", "copy",
fmt.Sprintf("%s/%d.%s", subs_path, sub.Index, *ext),
)
}
}
log.Printf("Starting extraction with the command: %s", cmd)
cmd.Stdout = nil
err = cmd.Run()
if err != nil {
extracted.Remove(sha)
fmt.Println("Error starting ffmpeg extract:", err)
}
close(ret)
}()
return ret, nil
}