mirror of
https://github.com/navidrome/navidrome.git
synced 2025-05-09 14:51:06 +03:00
The http connection is being closed before sending all data. May have something to do with the Range header
48 lines
1.0 KiB
Go
48 lines
1.0 KiB
Go
package stream
|
|
|
|
import (
|
|
"github.com/astaxie/beego"
|
|
"io"
|
|
"os"
|
|
"os/exec"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func Stream(path string, bitRate int, maxBitRate int, w io.Writer) error {
|
|
if maxBitRate > 0 && bitRate > maxBitRate {
|
|
cmdLine, args := createDownsamplingCommand(path, maxBitRate)
|
|
cmd := exec.Command(cmdLine, args...)
|
|
beego.Debug("Executing cmd:", cmdLine, args)
|
|
|
|
cmd.Stdout = w
|
|
cmd.Stderr = os.Stderr
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
beego.Error("Error executing", cmdLine, ":", err)
|
|
}
|
|
return err
|
|
} else {
|
|
f, err := os.Open(path)
|
|
if err != nil {
|
|
beego.Error("Error opening file", path, ":", err)
|
|
return err
|
|
}
|
|
_, err = io.Copy(w, f)
|
|
return err
|
|
}
|
|
}
|
|
|
|
func createDownsamplingCommand(path string, maxBitRate int) (string, []string) {
|
|
cmd := beego.AppConfig.String("downsampleCommand")
|
|
|
|
split := strings.Split(cmd, " ")
|
|
for i, s := range split {
|
|
s = strings.Replace(s, "%s", path, -1)
|
|
s = strings.Replace(s, "%b", strconv.Itoa(maxBitRate), -1)
|
|
split[i] = s
|
|
}
|
|
|
|
return split[0], split[1:len(split)]
|
|
}
|