feat: Working download with mp3-convx
This commit is contained in:
parent
fb91a431a5
commit
598fd51412
70
main.go
70
main.go
@ -3,6 +3,8 @@ package main
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"html/template"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
@ -13,6 +15,12 @@ const (
|
||||
DEFAULT_HTTPS_PORT = "4433"
|
||||
)
|
||||
|
||||
type DownloadFormats struct {
|
||||
VideoRes string
|
||||
videoOnly bool
|
||||
audioOnly bool
|
||||
}
|
||||
|
||||
type apiMessageResponse struct {
|
||||
Message string
|
||||
}
|
||||
@ -53,6 +61,7 @@ func NewLogger(handler http.Handler) *Logger {
|
||||
|
||||
func writeJSONResponse(w http.ResponseWriter, s string) http.ResponseWriter {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
jsonResp, err := json.Marshal(apiMessageResponse{Message: s})
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
@ -75,18 +84,71 @@ func main() {
|
||||
handler.HandleFunc(
|
||||
"/download",
|
||||
func(w http.ResponseWriter, r *http.Request) {
|
||||
userURL := r.URL.Query().Get("url")
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
if r.Method != "POST" {
|
||||
w.WriteHeader(400)
|
||||
return
|
||||
}
|
||||
err := r.ParseForm()
|
||||
if err != nil {
|
||||
w.WriteHeader(400)
|
||||
return
|
||||
}
|
||||
userURL := r.FormValue("URL")
|
||||
if userURL == "" {
|
||||
w = writeJSONResponse(w, "Provide URL as query")
|
||||
return
|
||||
}
|
||||
w = writeJSONResponse(w, fmt.Sprintf("You sent %s ", userURL))},
|
||||
// Get URL from convx
|
||||
req, err := http.Get(fmt.Sprintf("http://localhost:80?url=%s", userURL))
|
||||
|
||||
if err != nil {
|
||||
log.Println(err.Error())
|
||||
w.WriteHeader(500)
|
||||
return
|
||||
}
|
||||
if req.StatusCode != 200 {
|
||||
log.Printf("Got %v from convx\n", req)
|
||||
w.WriteHeader(500)
|
||||
return
|
||||
}
|
||||
body, err := io.ReadAll(req.Body)
|
||||
if err != nil {
|
||||
w.WriteHeader(500)
|
||||
log.Printf("Error while reading convx response body. \n%v", err.Error())
|
||||
return
|
||||
}
|
||||
downloadURL := string(body)
|
||||
log.Println("URL from convx", downloadURL)
|
||||
|
||||
// Serve Button Template
|
||||
tmpl := template.Must(template.ParseFiles("templates/download-result.html"))
|
||||
err = tmpl.Execute(w, downloadURL)
|
||||
if err != nil {
|
||||
log.Println(err.Error())
|
||||
w.WriteHeader(500)
|
||||
return
|
||||
}
|
||||
},
|
||||
)
|
||||
handler.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||
tmpl := template.Must(template.ParseFiles("templates/download.html"))
|
||||
formats := []DownloadFormats{}
|
||||
formats = append(formats, DownloadFormats{
|
||||
VideoRes: "720p",
|
||||
audioOnly: false,
|
||||
videoOnly: false,
|
||||
})
|
||||
err := tmpl.Execute(w, formats)
|
||||
if err != nil {
|
||||
log.Println(err.Error())
|
||||
w.WriteHeader(500)
|
||||
return
|
||||
}
|
||||
})
|
||||
|
||||
wrappedHandler := NewLogger(handler)
|
||||
srv := http.Server{
|
||||
ReadTimeout: 3 * time.Second,
|
||||
ReadTimeout: 10 * time.Second,
|
||||
WriteTimeout: 10 * time.Second,
|
||||
Addr: ":" + DEFAULT_HTTP_PORT,
|
||||
Handler: wrappedHandler,
|
||||
|
1
templates/download-result.html
Normal file
1
templates/download-result.html
Normal file
@ -0,0 +1 @@
|
||||
<a href="{{ . }}" rel="nofollow" download>Download</a>
|
30
templates/download.html
Normal file
30
templates/download.html
Normal file
@ -0,0 +1,30 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css">
|
||||
<script src="https://unpkg.com/htmx.org@1.9.5"></script>
|
||||
<title>YT Download</title>
|
||||
</head>
|
||||
<main class="container">
|
||||
<form hx-post="/download" hx-target="#get-btn" hx-swap="outerHTML" hx-indicator="#progress">
|
||||
<label for="URL">Link</label>
|
||||
<div class="grid">
|
||||
<input type="url" id="URL" name="URL" placeholder="Video Link" required>
|
||||
<!-- Select -->
|
||||
<select required>
|
||||
<option value="" disabled selected>Format</option>
|
||||
{{ range . }} <option>{{ .VideoRes }}</option>{{ end }}
|
||||
</select>
|
||||
</div>
|
||||
<button id="get-btn">Get
|
||||
<!-- <a class="htmx-indicator" href="#" aria-busy="true"></a> -->
|
||||
</button>
|
||||
</form>
|
||||
<progress class="htmx-indicator" id="progress"></progress>
|
||||
</main>
|
||||
<footer class="container">
|
||||
<small>By cronos</small>
|
||||
</footer>
|
||||
</html>
|
@ -12,7 +12,7 @@
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css" />
|
||||
|
||||
<!-- Custom styles for this example -->
|
||||
<link rel="stylesheet" href="custom.css" />
|
||||
<!-- <link rel="stylesheet" href="custom.css" />-->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@ -85,8 +85,6 @@
|
||||
</footer>
|
||||
<!-- ./ Footer -->
|
||||
|
||||
<!-- Minimal theme switcher -->
|
||||
<script src="js/minimal-theme-switcher.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user