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