refactor: move route handlers to named functions
This commit is contained in:
		
							parent
							
								
									e9aafd0cea
								
							
						
					
					
						commit
						36b012ac92
					
				
							
								
								
									
										345
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										345
									
								
								main.go
									
									
									
									
									
								
							@ -146,6 +146,175 @@ func handleToAudio(ctx *Context, w http.ResponseWriter) http.ResponseWriter {
 | 
			
		||||
    return w
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func handleDownload(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
    ctx := NewContext(r)
 | 
			
		||||
    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
 | 
			
		||||
    }
 | 
			
		||||
    toAudio := r.FormValue("toaudio")
 | 
			
		||||
    if toAudio == "on" {
 | 
			
		||||
        log.Println("User requested audio")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    filenameChan := make(chan string)
 | 
			
		||||
 | 
			
		||||
    go GetContentFilename(userURL, filenameChan)
 | 
			
		||||
    downloadURL, err := getYoutubeDownloadURL(userURL)
 | 
			
		||||
    filename := <- filenameChan
 | 
			
		||||
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Println(err.Error())
 | 
			
		||||
        ctx.StatusCode = 500
 | 
			
		||||
        ctx.Err = &err
 | 
			
		||||
        err = templates.ExecuteTemplate(w,"download-result.html", ctx)
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ctx.DownloadURL = downloadURL
 | 
			
		||||
    w.Header().Add(
 | 
			
		||||
        "Hx-Redirect", 
 | 
			
		||||
        fmt.Sprintf("/download-direct?URL=%s&filename=%s",
 | 
			
		||||
        url.QueryEscape(ctx.DownloadURL), 
 | 
			
		||||
        url.QueryEscape(filename)),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    err = templates.ExecuteTemplate(w,"download-result.html", ctx)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Println(err.Error())
 | 
			
		||||
        ctx.StatusCode = 500
 | 
			
		||||
        ctx.Err = &err
 | 
			
		||||
        err = templates.ExecuteTemplate(w,"download-result.html", ctx)
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func handleDirectDownload(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
    ctx := NewContext(r)
 | 
			
		||||
    if r.Method != "GET" {
 | 
			
		||||
        w.WriteHeader(400)
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    userURL := strings.Trim(r.URL.Query().Get("URL"), "\n")
 | 
			
		||||
    filename := strings.Trim(r.URL.Query().Get("filename"), "\n")
 | 
			
		||||
 | 
			
		||||
    if userURL == "" {
 | 
			
		||||
        log.Println("Empty URL")
 | 
			
		||||
        w.WriteHeader(400)
 | 
			
		||||
        ctx.StatusCode = 400
 | 
			
		||||
        if err := templates.ExecuteTemplate(w,"download-result.html", ctx); err != nil {
 | 
			
		||||
            log.Println(err.Error())
 | 
			
		||||
        }
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
    ctx.DownloadURL = userURL
 | 
			
		||||
 | 
			
		||||
    req, err := http.NewRequest("GET", ctx.DownloadURL, nil)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Println(err.Error())
 | 
			
		||||
        ctx.StatusCode = 500
 | 
			
		||||
        ctx.Err = &err
 | 
			
		||||
        if err := templates.ExecuteTemplate(w,"download-result.html", ctx); err != nil {
 | 
			
		||||
            log.Println(err.Error())
 | 
			
		||||
        }
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
    req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0")
 | 
			
		||||
 | 
			
		||||
    client := http.Client{}
 | 
			
		||||
 | 
			
		||||
    dataRequest, err := client.Do(req)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Println(err.Error())
 | 
			
		||||
        ctx.StatusCode = 500
 | 
			
		||||
        ctx.Err = &err
 | 
			
		||||
        if err := templates.ExecuteTemplate(w,"download-result.html", ctx); err != nil {
 | 
			
		||||
            log.Println(err.Error())
 | 
			
		||||
        }
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
    defer dataRequest.Body.Close()
 | 
			
		||||
 | 
			
		||||
    if dataRequest.StatusCode != 200 {
 | 
			
		||||
        log.Println("Failed to get content for URL", userURL)
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
    contentLength := dataRequest.Header.Get("Content-Length")
 | 
			
		||||
    if dataRequest.ContentLength == 0 {
 | 
			
		||||
        log.Println("Empty body from content url")
 | 
			
		||||
        w.WriteHeader(500)
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    w.Header().Set(
 | 
			
		||||
        "Content-Disposition",
 | 
			
		||||
        fmt.Sprintf("attachment;filename=%s;", filename),
 | 
			
		||||
    )
 | 
			
		||||
    w.Header().Set("Content-Length", contentLength)
 | 
			
		||||
    w.WriteHeader(206)
 | 
			
		||||
 | 
			
		||||
    n, err := io.Copy(w, dataRequest.Body)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Println(err.Error())
 | 
			
		||||
    }
 | 
			
		||||
    log.Printf("Copied %d bytes", n)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func handleRoot(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
    ctx := NewContext(r)
 | 
			
		||||
    formats := []DownloadFormats{}
 | 
			
		||||
    formats = append(formats, DownloadFormats{
 | 
			
		||||
        VideoRes: "720p",
 | 
			
		||||
        audioOnly: false,
 | 
			
		||||
        videoOnly: false,
 | 
			
		||||
    })
 | 
			
		||||
    err := templates.ExecuteTemplate(w, "download.html", ctx)
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Println(err.Error())
 | 
			
		||||
        w.WriteHeader(500)
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func handleValidLink(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
    if r.Method != "POST" {
 | 
			
		||||
        w.WriteHeader(400)
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    err := r.ParseForm()
 | 
			
		||||
    if err != nil {
 | 
			
		||||
        log.Println(err.Error())
 | 
			
		||||
        w.WriteHeader(400)
 | 
			
		||||
        return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    url := r.FormValue("URL")
 | 
			
		||||
 | 
			
		||||
    ctx := URLValidationCtx{
 | 
			
		||||
        URL: url,
 | 
			
		||||
        Valid: isValidURL(url),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    templates.ExecuteTemplate(w, "url-validation.html", ctx)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
    
 | 
			
		||||
    log.Println("[ init ] Starting...")
 | 
			
		||||
@ -194,179 +363,11 @@ func main() {
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    handler.HandleFunc(
 | 
			
		||||
        "/download", 
 | 
			
		||||
        func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
            ctx := NewContext(r)
 | 
			
		||||
            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
 | 
			
		||||
            }
 | 
			
		||||
            toAudio := r.FormValue("toaudio")
 | 
			
		||||
            if toAudio == "on" {
 | 
			
		||||
                log.Println("User requested audio")
 | 
			
		||||
            }
 | 
			
		||||
    handler.HandleFunc("/", handleRoot)
 | 
			
		||||
    handler.HandleFunc("/download", handleDownload)
 | 
			
		||||
    handler.HandleFunc("/download-direct", handleDirectDownload)
 | 
			
		||||
    handler.HandleFunc("/valid-link", handleValidLink)
 | 
			
		||||
 | 
			
		||||
            filenameChan := make(chan string)
 | 
			
		||||
 | 
			
		||||
            go GetContentFilename(userURL, filenameChan)
 | 
			
		||||
            downloadURL, err := getYoutubeDownloadURL(userURL)
 | 
			
		||||
            filename := <- filenameChan
 | 
			
		||||
 | 
			
		||||
            if err != nil {
 | 
			
		||||
                log.Println(err.Error())
 | 
			
		||||
                ctx.StatusCode = 500
 | 
			
		||||
                ctx.Err = &err
 | 
			
		||||
                err = templates.ExecuteTemplate(w,"download-result.html", ctx)
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            ctx.DownloadURL = downloadURL
 | 
			
		||||
            w.Header().Add(
 | 
			
		||||
                "Hx-Redirect", 
 | 
			
		||||
                fmt.Sprintf("/download-direct?URL=%s&filename=%s",
 | 
			
		||||
                url.QueryEscape(ctx.DownloadURL), 
 | 
			
		||||
                url.QueryEscape(filename)),
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            err = templates.ExecuteTemplate(w,"download-result.html", ctx)
 | 
			
		||||
            if err != nil {
 | 
			
		||||
                log.Println(err.Error())
 | 
			
		||||
                ctx.StatusCode = 500
 | 
			
		||||
                ctx.Err = &err
 | 
			
		||||
                err = templates.ExecuteTemplate(w,"download-result.html", ctx)
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    handler.HandleFunc(
 | 
			
		||||
        "/download-direct", 
 | 
			
		||||
        func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
            ctx := NewContext(r)
 | 
			
		||||
            if r.Method != "GET" {
 | 
			
		||||
                w.WriteHeader(400)
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            userURL := strings.Trim(r.URL.Query().Get("URL"), "\n")
 | 
			
		||||
            filename := strings.Trim(r.URL.Query().Get("filename"), "\n")
 | 
			
		||||
 | 
			
		||||
            if userURL == "" {
 | 
			
		||||
                log.Println("Empty URL")
 | 
			
		||||
                w.WriteHeader(400)
 | 
			
		||||
                ctx.StatusCode = 400
 | 
			
		||||
                if err := templates.ExecuteTemplate(w,"download-result.html", ctx); err != nil {
 | 
			
		||||
                    log.Println(err.Error())
 | 
			
		||||
                }
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
            ctx.DownloadURL = userURL
 | 
			
		||||
 | 
			
		||||
            req, err := http.NewRequest("GET", ctx.DownloadURL, nil)
 | 
			
		||||
            if err != nil {
 | 
			
		||||
                log.Println(err.Error())
 | 
			
		||||
                ctx.StatusCode = 500
 | 
			
		||||
                ctx.Err = &err
 | 
			
		||||
                if err := templates.ExecuteTemplate(w,"download-result.html", ctx); err != nil {
 | 
			
		||||
                    log.Println(err.Error())
 | 
			
		||||
                }
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
            req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/117.0")
 | 
			
		||||
 | 
			
		||||
            client := http.Client{}
 | 
			
		||||
 | 
			
		||||
            dataRequest, err := client.Do(req)
 | 
			
		||||
            if err != nil {
 | 
			
		||||
                log.Println(err.Error())
 | 
			
		||||
                ctx.StatusCode = 500
 | 
			
		||||
                ctx.Err = &err
 | 
			
		||||
                if err := templates.ExecuteTemplate(w,"download-result.html", ctx); err != nil {
 | 
			
		||||
                    log.Println(err.Error())
 | 
			
		||||
                }
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
            defer dataRequest.Body.Close()
 | 
			
		||||
 | 
			
		||||
            if dataRequest.StatusCode != 200 {
 | 
			
		||||
                log.Println("Failed to get content for URL", userURL)
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
            contentLength := dataRequest.Header.Get("Content-Length")
 | 
			
		||||
            if dataRequest.ContentLength == 0 {
 | 
			
		||||
                log.Println("Empty body from content url")
 | 
			
		||||
                w.WriteHeader(500)
 | 
			
		||||
                return
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            w.Header().Set(
 | 
			
		||||
                "Content-Disposition",
 | 
			
		||||
                fmt.Sprintf("attachment;filename=%s;", filename),
 | 
			
		||||
            )
 | 
			
		||||
            w.Header().Set("Content-Length", contentLength)
 | 
			
		||||
            w.WriteHeader(206)
 | 
			
		||||
 | 
			
		||||
            n, err := io.Copy(w, dataRequest.Body)
 | 
			
		||||
            if err != nil {
 | 
			
		||||
                log.Println(err.Error())
 | 
			
		||||
            }
 | 
			
		||||
            log.Printf("Copied %d bytes", n)
 | 
			
		||||
        },
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    handler.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
        ctx := NewContext(r)
 | 
			
		||||
        formats := []DownloadFormats{}
 | 
			
		||||
        formats = append(formats, DownloadFormats{
 | 
			
		||||
            VideoRes: "720p",
 | 
			
		||||
            audioOnly: false,
 | 
			
		||||
            videoOnly: false,
 | 
			
		||||
        })
 | 
			
		||||
        err := templates.ExecuteTemplate(w, "download.html", ctx)
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            log.Println(err.Error())
 | 
			
		||||
            w.WriteHeader(500)
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    handler.HandleFunc("/valid-link", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
 | 
			
		||||
        if r.Method != "POST" {
 | 
			
		||||
            w.WriteHeader(400)
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        err := r.ParseForm()
 | 
			
		||||
        if err != nil {
 | 
			
		||||
            log.Println(err.Error())
 | 
			
		||||
            w.WriteHeader(400)
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        url := r.FormValue("URL")
 | 
			
		||||
 | 
			
		||||
        ctx := URLValidationCtx{
 | 
			
		||||
            URL: url,
 | 
			
		||||
            Valid: isValidURL(url),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        templates.ExecuteTemplate(w, "url-validation.html", ctx)
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    wrappedHandler := NewLogger(handler)
 | 
			
		||||
    srv := http.Server{
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user