Compare commits
No commits in common. "61f8a48798a779a40c91222460aae97f1a9c74a4" and "3805679ec4a526d8665623ca99a74b07520de31d" have entirely different histories.
61f8a48798
...
3805679ec4
Binary file not shown.
Before Width: | Height: | Size: 50 KiB |
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 91 KiB |
|
@ -1,5 +0,0 @@
|
||||||
module dlserver
|
|
||||||
|
|
||||||
go 1.14
|
|
||||||
|
|
||||||
require github.com/gorilla/mux v1.8.0
|
|
|
@ -1,2 +0,0 @@
|
||||||
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
|
||||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
|
229
dlserver/main.go
229
dlserver/main.go
|
@ -1,229 +0,0 @@
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"os/exec"
|
|
||||||
"regexp"
|
|
||||||
"runtime"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/gorilla/mux"
|
|
||||||
)
|
|
||||||
|
|
||||||
func limitLength(s string, length int) string {
|
|
||||||
if len(s) < length {
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
return s[:length]
|
|
||||||
}
|
|
||||||
|
|
||||||
// globals, huh, faster than channels and oddly more appropriate, we care less about races than feedback.
|
|
||||||
var lastPercentage float64
|
|
||||||
var lastFilename string
|
|
||||||
|
|
||||||
func convertFile(sourceFileName string, destinationFilename string) error {
|
|
||||||
launch := "./ffmpeg"
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
launch += ".exe"
|
|
||||||
}
|
|
||||||
|
|
||||||
os.Remove(destinationFilename)
|
|
||||||
DurationRe := regexp.MustCompile(`DURATION *: ([0-9]+):([0-9]+):([0-9]+)\.([0-9]+)`)
|
|
||||||
FrameRe := regexp.MustCompile(`frame= ?([0-9]+) `)
|
|
||||||
FPSValue := 0.0
|
|
||||||
finalFramesValue := 0.0
|
|
||||||
FPSRe := regexp.MustCompile(`, ([0-9\.]+) fps,`)
|
|
||||||
fmt.Printf("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s", launch, "-loglevel", "repeat+level+verbose", "-i", sourceFileName, "-c:v", "libvpx", "-crf", "10", "-b:v", "1M", "-c:a", "libvorbis", "-y", destinationFilename)
|
|
||||||
cmd := exec.Command(launch, "-progress", "pipe:2", "-i", sourceFileName, "-c:v", "libvpx", "-crf", "10", "-b:v", "1M", "-c:a", "libvorbis", "-y", destinationFilename)
|
|
||||||
stdout, err := cmd.StderrPipe()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if err := cmd.Start(); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start reading from the file with a reader.
|
|
||||||
reader := bufio.NewReader(stdout)
|
|
||||||
var line string
|
|
||||||
for {
|
|
||||||
line, err = reader.ReadString('\n')
|
|
||||||
if err != nil && err != io.EOF {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
fpses := FPSRe.FindAllStringSubmatch(line, 1)
|
|
||||||
if len(fpses) > 0 {
|
|
||||||
fmt.Printf("FPS' is %v\n", fpses)
|
|
||||||
FPSValue, _ = strconv.ParseFloat(fpses[0][1], 64)
|
|
||||||
}
|
|
||||||
durations := DurationRe.FindAllStringSubmatch(line, 1)
|
|
||||||
if len(durations) > 0 {
|
|
||||||
fmt.Printf("Durations is %v\n", durations)
|
|
||||||
if FPSValue != 0.0 {
|
|
||||||
// we have an fps, we can work out max frames!
|
|
||||||
hrs, _ := strconv.ParseFloat(durations[0][1], 64)
|
|
||||||
mins, _ := strconv.ParseFloat(durations[0][2], 64)
|
|
||||||
secs, _ := strconv.ParseFloat(durations[0][3], 64)
|
|
||||||
aaand, _ := strconv.ParseFloat("0."+durations[0][4], 64)
|
|
||||||
total := (hrs * 60 * 60) + (mins * 60) + secs + aaand
|
|
||||||
finalFramesValue = total * FPSValue
|
|
||||||
fmt.Printf("%0f:%0f:%0f%0.4f * %0.2f = %0.2f seconds = %0.2f frames\n", hrs, mins, secs, aaand, FPSValue, total, finalFramesValue)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
currentFrames := FrameRe.FindAllStringSubmatch(line, 1)
|
|
||||||
if len(currentFrames) > 0 {
|
|
||||||
currentFrame, _ := strconv.ParseFloat(currentFrames[0][1], 64)
|
|
||||||
percentage := currentFrame / finalFramesValue * 100
|
|
||||||
lastPercentage = (percentage / 2) + 50
|
|
||||||
fmt.Printf("Frame %0f / %0f = Percent : %0.2f\n", currentFrame, finalFramesValue, lastPercentage)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(fpses) == 0 && len(durations) == 0 && len(currentFrames) == 0 {
|
|
||||||
//fmt.Printf("X: %s", line)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err != io.EOF {
|
|
||||||
fmt.Printf(" > Failed with error: %v\n", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
lastPercentage = 100
|
|
||||||
fmt.Printf("Setting to %0f percent.\n", lastPercentage)
|
|
||||||
os.Remove(sourceFileName)
|
|
||||||
go func() {
|
|
||||||
time.Sleep(10 * time.Second)
|
|
||||||
lastPercentage = 0
|
|
||||||
}()
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func downloadFile(sourceURL string, outputFile string, statusChannel chan float64, nameChannel chan string) error {
|
|
||||||
progressBackwards := false
|
|
||||||
lastLastPercentage := 0.0
|
|
||||||
launch := "./youtube-dl"
|
|
||||||
if runtime.GOOS == "windows" {
|
|
||||||
launch += ".exe"
|
|
||||||
}
|
|
||||||
fmt.Printf("%s %s %s %s %s\n", launch, sourceURL, "-o", outputFile, "--newline")
|
|
||||||
cmd := exec.Command(launch, sourceURL, "-o", outputFile, "--newline")
|
|
||||||
stdout, err := cmd.StdoutPipe()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if err := cmd.Start(); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
re := regexp.MustCompile(`([0-9.]+)%`)
|
|
||||||
reName := regexp.MustCompile(`Merging formats into "([^"]+)"`)
|
|
||||||
|
|
||||||
// Start reading from the file with a reader.
|
|
||||||
reader := bufio.NewReader(stdout)
|
|
||||||
var line string
|
|
||||||
for {
|
|
||||||
line, err = reader.ReadString('\n')
|
|
||||||
if err != nil && err != io.EOF {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
percentages := re.FindAllStringSubmatch(line, 1)
|
|
||||||
if len(percentages) > 0 {
|
|
||||||
p, err := strconv.ParseFloat(string(percentages[0][1]), 64)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("What kind of number is %v", percentages[0][1])
|
|
||||||
} else {
|
|
||||||
if lastLastPercentage > p {
|
|
||||||
progressBackwards = true
|
|
||||||
}
|
|
||||||
lastLastPercentage = p
|
|
||||||
if progressBackwards {
|
|
||||||
// youtube-dl does video, then audio - it's not really half but an estimation
|
|
||||||
lastPercentage = float64(25) + p/4
|
|
||||||
} else {
|
|
||||||
lastPercentage = p / 4
|
|
||||||
}
|
|
||||||
statusChannel <- lastPercentage
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fmt.Printf("%s\n", line)
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
filenames := reName.FindAllStringSubmatch(line, 1)
|
|
||||||
if len(filenames) > 0 {
|
|
||||||
fmt.Printf("Filename: %v", filenames)
|
|
||||||
lastFilename = filenames[0][1]
|
|
||||||
nameChannel <- filenames[0][1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := cmd.Wait(); err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if err != io.EOF {
|
|
||||||
fmt.Printf(" > Failed with error: %v\n", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return convertFile(lastFilename, "converted.webm")
|
|
||||||
}
|
|
||||||
|
|
||||||
func HomeHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
fmt.Fprintf(w, "Hello %s\n", "world")
|
|
||||||
}
|
|
||||||
|
|
||||||
var c chan float64
|
|
||||||
var n chan string
|
|
||||||
|
|
||||||
func FetchHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
//vars := mux.Vars(r)
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
if lastFilename != "" {
|
|
||||||
os.Remove(lastFilename)
|
|
||||||
}
|
|
||||||
go downloadFile(r.FormValue("url"), "test", c, n)
|
|
||||||
fmt.Fprint(w, "OK\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
func StatusHandler(w http.ResponseWriter, r *http.Request) {
|
|
||||||
w.Header().Set("Content-type", "application/json")
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
// Oddly, using channels here is slower and we don't actually care if there's a race condition.
|
|
||||||
/* if len(c) > 0 {
|
|
||||||
lastPercentage = <-c
|
|
||||||
}
|
|
||||||
if len(n) > 0 {
|
|
||||||
lastFilename = <-n
|
|
||||||
} */
|
|
||||||
fmt.Printf("Returning %0.2f for %s\n", lastPercentage, lastFilename)
|
|
||||||
fmt.Fprintf(w, `{"filename": "%s","percentage":%0.2f}`+"\n", lastFilename, lastPercentage)
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
if len(os.Args) > 0 {
|
|
||||||
os.Chdir(os.Args[1])
|
|
||||||
}
|
|
||||||
r := mux.NewRouter()
|
|
||||||
r.SkipClean(true)
|
|
||||||
r.Path("/get").Queries("url", "{.*}").HandlerFunc(FetchHandler)
|
|
||||||
r.HandleFunc("/status/", StatusHandler)
|
|
||||||
r.HandleFunc("/", HomeHandler)
|
|
||||||
http.Handle("/", r)
|
|
||||||
c = make(chan float64, 999)
|
|
||||||
n = make(chan string, 999)
|
|
||||||
srv := &http.Server{
|
|
||||||
Handler: r,
|
|
||||||
Addr: "127.0.0.1:10435",
|
|
||||||
// Good practice: enforce timeouts for servers you create!
|
|
||||||
WriteTimeout: 15 * time.Second,
|
|
||||||
ReadTimeout: 15 * time.Second,
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Fatal(srv.ListenAndServe())
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue