From d71de8ab2490081c184dd8a30cc8c8d2cf718286 Mon Sep 17 00:00:00 2001 From: Julian Hurst Date: Wed, 11 Sep 2024 00:57:26 +0200 Subject: Handle downloading with yt-dlp and serving video --- grimtube.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++- templates/search.html | 6 ++++-- templates/vid.html | 6 ++++++ 3 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 templates/vid.html diff --git a/grimtube.go b/grimtube.go index 9f8061b..5ef91de 100644 --- a/grimtube.go +++ b/grimtube.go @@ -5,10 +5,11 @@ import ( "text/template" "net/http" "fmt" - //"io" + "io" "log" "strconv" "path" + "os/exec" "git.sr.ht/~ark/ytparser" ) @@ -165,6 +166,53 @@ func favicon(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "favicon.ico") } +func nativeStreamb(w http.ResponseWriter, r *http.Request) { + values := r.URL.Query() + if !values.Has("url") { + w.WriteHeader(http.StatusBadRequest) + return + } + cmd := exec.Command("yt-dlp", "-o", "/tmp/nativestreamgrimtube.%(ext)s",values.Get("url")) + stderr, err := cmd.StderrPipe() + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + if err := cmd.Start(); err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + io.Copy(w, stderr) +} + +func nativeStream(w http.ResponseWriter, r *http.Request) { + values := r.URL.Query() + if !values.Has("url") { + w.WriteHeader(http.StatusBadRequest) + return + } + cmd := exec.Command("yt-dlp", "-o", "/tmp/nativestreamgrimtube", "--force-overwrites", values.Get("url")) + if err := cmd.Run(); err != nil { + w.WriteHeader(http.StatusInternalServerError) + return + } + data := struct { + Name string + }{ + "nativestreamgrimtube.webm", + } + serve(w, "templates/vid.html", data) +} + +func stream(w http.ResponseWriter, r *http.Request) { + values := r.URL.Query() + if !values.Has("name") { + w.WriteHeader(http.StatusBadRequest) + return + } + http.ServeFile(w, r, "/tmp/" + values.Get("name")) +} + func main() { port := flag.Int("p", 8080, "The port to bind to.") dir := flag.String("d", "", "Location of the templates and static resources.") @@ -180,6 +228,8 @@ func main() { http.HandleFunc("/", index) http.HandleFunc("/search", search) http.HandleFunc("/embed", embed) + http.HandleFunc("/native", nativeStream) + http.HandleFunc("/stream", stream) log.Printf("Listening on port %d\n", *port) log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil)) diff --git a/templates/search.html b/templates/search.html index 6a9ce28..30e96b9 100644 --- a/templates/search.html +++ b/templates/search.html @@ -26,10 +26,12 @@ {{range .Items}} - + + - {{.Title}} + + {{.Title}}
{{.ChannelTitle}} | Atom feed
diff --git a/templates/vid.html b/templates/vid.html new file mode 100644 index 0000000..6383e2b --- /dev/null +++ b/templates/vid.html @@ -0,0 +1,6 @@ +{{define "title"}}Index{{end}} +{{define "content"}} + +{{end}} -- cgit v1.2.3