feat: basic active url validation:
- Does not check if the link is actually a video. Change isValidURL() for better validation Signed-off-by: HeshamTB <hishaminv@gmail.com>
This commit is contained in:
parent
72e6543415
commit
b88ca836ef
30
main.go
30
main.go
@ -20,6 +20,11 @@ type DownloadFormats struct {
|
||||
audioOnly bool
|
||||
}
|
||||
|
||||
type URLValidationCtx struct {
|
||||
URL string
|
||||
Valid bool
|
||||
}
|
||||
|
||||
type apiMessageResponse struct {
|
||||
Message string
|
||||
}
|
||||
@ -169,6 +174,7 @@ func main() {
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
handler.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := NewContext(r)
|
||||
formats := []DownloadFormats{}
|
||||
@ -185,6 +191,30 @@ func main() {
|
||||
}
|
||||
})
|
||||
|
||||
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{
|
||||
ReadTimeout: 10 * time.Second,
|
||||
|
@ -13,14 +13,21 @@
|
||||
<main class="container">
|
||||
<h1>Viddle your fiddle</h1>
|
||||
<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 .Formats }} <option>{{ .VideoRes }}</option>{{ end }}
|
||||
</select>
|
||||
<div hx-target="this" hx-swap="outerHTML">
|
||||
<label>Link
|
||||
<input
|
||||
type="url" id="URL" name="URL"
|
||||
hx-post="/valid-link" hx-indicator="#url-validation-progress" required>
|
||||
</label>
|
||||
<progress class="htmx-indicator" id="url-validation-progress"></progress>
|
||||
</div>
|
||||
<label>Format
|
||||
<select required>
|
||||
<option value="" disabled selected>Format</option>
|
||||
{{ range .Formats }} <option>{{ .VideoRes }}</option>{{ end }}
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
<button id="get-btn">Get
|
||||
<!-- <a class="htmx-indicator" href="#" aria-busy="true"></a> -->
|
||||
|
11
templates/url-validation.html
Normal file
11
templates/url-validation.html
Normal file
@ -0,0 +1,11 @@
|
||||
<div hx-target="this" hx-swap="outerHTML">
|
||||
<label>
|
||||
Link
|
||||
<input name="URL" id="URL" type="url" hx-post="/valid-link"
|
||||
aria-invalid="{{ if .Valid }}false{{ else }}true{{ end }}"
|
||||
required value="{{ .URL }}"
|
||||
hx-indicator="#url-validation-progress"
|
||||
>
|
||||
</label>
|
||||
<progress class="htmx-indicator" id="url-validation-progress"></progress>
|
||||
</div>
|
Loading…
Reference in New Issue
Block a user