Add flash message for errors
This commit is contained in:
		
							parent
							
								
									de8a4d9e80
								
							
						
					
					
						commit
						733a8f4d7a
					
				| 
						 | 
				
			
			@ -3,7 +3,7 @@ testdata_dir = "testdata"
 | 
			
		|||
tmp_dir = "tmp"
 | 
			
		||||
 | 
			
		||||
[build]
 | 
			
		||||
args_bin = []
 | 
			
		||||
args_bin = ["-l", "0.0.0.0"]
 | 
			
		||||
bin = "./tmp/main"
 | 
			
		||||
cmd = "go build -o ./tmp/main ."
 | 
			
		||||
delay = 1000
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										1
									
								
								go.mod
								
								
								
								
							| 
						 | 
				
			
			@ -9,6 +9,7 @@ require (
 | 
			
		|||
	github.com/samber/lo v1.38.1
 | 
			
		||||
	github.com/spf13/cobra v1.7.0
 | 
			
		||||
	github.com/spf13/viper v1.10.0
 | 
			
		||||
	github.com/sujit-baniya/flash v0.1.8
 | 
			
		||||
	golang.org/x/exp v0.0.0-20230321023759-10a507213a29
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										12
									
								
								go.sum
								
								
								
								
							| 
						 | 
				
			
			@ -60,6 +60,7 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
 | 
			
		|||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
			
		||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
			
		||||
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
			
		||||
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
 | 
			
		||||
github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs=
 | 
			
		||||
github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
 | 
			
		||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 | 
			
		||||
| 
						 | 
				
			
			@ -131,6 +132,7 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
 | 
			
		|||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
 | 
			
		||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
			
		||||
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 | 
			
		||||
github.com/gofiber/fiber/v2 v2.36.0/go.mod h1:tgCr+lierLwLoVHHO/jn3Niannv34WRkQETU8wiL9fQ=
 | 
			
		||||
github.com/gofiber/fiber/v2 v2.43.0 h1:yit3E4kHf178B60p5CQBa/3v+WVuziWMa/G2ZNyLJB0=
 | 
			
		||||
github.com/gofiber/fiber/v2 v2.43.0/go.mod h1:mpS1ZNE5jU+u+BA4FbM+KKnUzJ4wzTK+FT2tG3tU+6I=
 | 
			
		||||
github.com/gofiber/template v1.8.0 h1:jOn9RhxYO7rHTHGLNRpYfDoVm8b5GH/dtl15ZT5NifE=
 | 
			
		||||
| 
						 | 
				
			
			@ -257,6 +259,8 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X
 | 
			
		|||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 | 
			
		||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 | 
			
		||||
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
 | 
			
		||||
github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY=
 | 
			
		||||
github.com/klauspost/compress v1.16.3/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
 | 
			
		||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 | 
			
		||||
| 
						 | 
				
			
			@ -378,12 +382,15 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc
 | 
			
		|||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 | 
			
		||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
			
		||||
github.com/sujit-baniya/flash v0.1.8 h1:BwcrybCatPU30VMA9IBA5q3ZE0VSr5c7qTqwZrSvyRI=
 | 
			
		||||
github.com/sujit-baniya/flash v0.1.8/go.mod h1:kmlAIkLDMlLshEeeE6fETEW8kSOopKN5WA3KXLmS/U0=
 | 
			
		||||
github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw=
 | 
			
		||||
github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0=
 | 
			
		||||
github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw=
 | 
			
		||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
 | 
			
		||||
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
 | 
			
		||||
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 | 
			
		||||
github.com/valyala/fasthttp v1.38.0/go.mod h1:t/G+3rLek+CyY9bnIE+YlMRddxVAAGjhxndDB4i4C0I=
 | 
			
		||||
github.com/valyala/fasthttp v1.45.0 h1:zPkkzpIn8tdHZUrVa6PzYd0i5verqiPSkgTd3bSUcpA=
 | 
			
		||||
github.com/valyala/fasthttp v1.45.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
 | 
			
		||||
github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
 | 
			
		||||
| 
						 | 
				
			
			@ -421,6 +428,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
 | 
			
		|||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 | 
			
		||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 | 
			
		||||
| 
						 | 
				
			
			@ -507,6 +515,8 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy
 | 
			
		|||
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
			
		||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
			
		||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 | 
			
		||||
golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
 | 
			
		||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 | 
			
		||||
| 
						 | 
				
			
			@ -608,6 +618,8 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc
 | 
			
		|||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								web/serve.go
								
								
								
								
							
							
						
						
									
										21
									
								
								web/serve.go
								
								
								
								
							| 
						 | 
				
			
			@ -8,6 +8,7 @@ import (
 | 
			
		|||
	"github.com/gofiber/fiber/v2"
 | 
			
		||||
	"github.com/samber/lo"
 | 
			
		||||
	"github.com/spf13/viper"
 | 
			
		||||
	"github.com/sujit-baniya/flash"
 | 
			
		||||
	"go.fifitido.net/ytdl-web/ytdl"
 | 
			
		||||
	"golang.org/x/exp/slog"
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -19,28 +20,36 @@ func Serve() error {
 | 
			
		|||
	app.Get("/", func(c *fiber.Ctx) error {
 | 
			
		||||
		return c.Render("views/index", fiber.Map{
 | 
			
		||||
			"BasePath": viper.GetString("base_path"),
 | 
			
		||||
			"Flash":    flash.Get(c),
 | 
			
		||||
		}, "views/layouts/main")
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	app.Get("/download", func(c *fiber.Ctx) error {
 | 
			
		||||
		urlBytes, err := url.QueryUnescape(c.Query("url"))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			slog.Error("Failed to decode url param", slog.String("error", err.Error()))
 | 
			
		||||
			return fiber.ErrBadRequest
 | 
			
		||||
			return flash.WithError(c, fiber.Map{
 | 
			
		||||
				"error":   true,
 | 
			
		||||
				"message": "Invalid URL",
 | 
			
		||||
			}).Redirect("/")
 | 
			
		||||
		}
 | 
			
		||||
		url := string(urlBytes)
 | 
			
		||||
		if len(url) < 1 {
 | 
			
		||||
			return fiber.ErrBadRequest
 | 
			
		||||
			return flash.WithError(c, fiber.Map{
 | 
			
		||||
				"error":   true,
 | 
			
		||||
				"message": "Invalid URL",
 | 
			
		||||
			}).Redirect("/")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		meta, err := ytdl.GetMetadata(url)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			slog.Error("Failed to get metadata", slog.String("error", err.Error()))
 | 
			
		||||
			return fiber.ErrInternalServerError
 | 
			
		||||
			return flash.WithError(c, fiber.Map{
 | 
			
		||||
				"error":   true,
 | 
			
		||||
				"message": "Could not find a video at that url, maybe try again?",
 | 
			
		||||
			}).Redirect("/")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		formats := lo.Filter(meta.Formats, func(item ytdl.Format, _ int) bool {
 | 
			
		||||
			return item.ACodec != "none" && item.VCodec != "none"
 | 
			
		||||
			return item.ACodec != "none" && item.VCodec != "none" && item.Protocol != "m3u8_native"
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		sort.Slice(formats, func(i, j int) bool {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,8 @@
 | 
			
		|||
    >Download Another Video</a
 | 
			
		||||
  >
 | 
			
		||||
</div>
 | 
			
		||||
{{$id := .Meta.ID}} {{$url := .Url}} {{range .Formats}}
 | 
			
		||||
{{$id := .Meta.ID}} {{$url := .Url}} {{$basePath := .BasePath}} {{range
 | 
			
		||||
.Formats}}
 | 
			
		||||
<div class="d-flex gap-3 mt-5 align-items-center">
 | 
			
		||||
  <div style="width: 10rem">{{.Format}}</div>
 | 
			
		||||
  <div class="flex-grow-1 d-flex gap-3">
 | 
			
		||||
| 
						 | 
				
			
			@ -28,7 +29,7 @@
 | 
			
		|||
    <a
 | 
			
		||||
      class="btn btn-primary flex-grow-1"
 | 
			
		||||
      download="{{$id}}-{{.Resolution}}.{{.Ext}}"
 | 
			
		||||
      href="{{.BasePath}}/download/proxy?url={{queryEscape $url}}&format={{.FormatID}}"
 | 
			
		||||
      href="{{$basePath}}/download/proxy?url={{queryEscape $url}}&format={{.FormatID}}"
 | 
			
		||||
    >
 | 
			
		||||
      Download (proxied)
 | 
			
		||||
    </a>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,4 +34,7 @@
 | 
			
		|||
  <div class="d-grid">
 | 
			
		||||
    <button type="submit" class="btn btn-primary">Download</button>
 | 
			
		||||
  </div>
 | 
			
		||||
  {{if .Flash}}
 | 
			
		||||
  <div class="alert alert-danger mt-4" role="" alert>{{.Flash.message}}</div>
 | 
			
		||||
  {{end}}
 | 
			
		||||
</form>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ type Metdata struct {
 | 
			
		|||
	Creator *string `json:"creator"`
 | 
			
		||||
 | 
			
		||||
	// UNIX timestamp of the moment the video was uploaded
 | 
			
		||||
	Timestamp *int64 `json:"timestamp"`
 | 
			
		||||
	Timestamp *float64 `json:"timestamp"`
 | 
			
		||||
 | 
			
		||||
	// Video upload date in UTC (YYYYMMDD).
 | 
			
		||||
	// If not explicitly set, calculated from timestamp
 | 
			
		||||
| 
						 | 
				
			
			@ -60,14 +60,14 @@ type Metdata struct {
 | 
			
		|||
 | 
			
		||||
	// UNIX timestamp of the moment the video was released.
 | 
			
		||||
	// If it is not clear whether to use timestamp or this, use the former
 | 
			
		||||
	ReleaseTimestamp *int64 `json:"release_timestamp"`
 | 
			
		||||
	ReleaseTimestamp *float64 `json:"release_timestamp"`
 | 
			
		||||
 | 
			
		||||
	// The date (YYYYMMDD) when the video was released in UTC.
 | 
			
		||||
	// If not explicitly set, calculated from release_timestamp
 | 
			
		||||
	ReleaseDate *string `json:"release_date"`
 | 
			
		||||
 | 
			
		||||
	// UNIX timestamp of the moment the video was last modified.
 | 
			
		||||
	ModifiedTimestamp *int64 `json:"modified_timestamp"`
 | 
			
		||||
	ModifiedTimestamp *float64 `json:"modified_timestamp"`
 | 
			
		||||
 | 
			
		||||
	// The date (YYYYMMDD) when the video was last modified in UTC.
 | 
			
		||||
	// If not explicitly set, calculated from modified_timestamp
 | 
			
		||||
| 
						 | 
				
			
			@ -408,7 +408,7 @@ type Comment struct {
 | 
			
		|||
	Text *string `json:"text"`
 | 
			
		||||
 | 
			
		||||
	// UNIX timestamp of comment
 | 
			
		||||
	Timestamp *int64 `json:"timestamp"`
 | 
			
		||||
	Timestamp *float64 `json:"timestamp"`
 | 
			
		||||
 | 
			
		||||
	// ID of the comment this one is replying to.
 | 
			
		||||
	// Set to "root" to indicate that this is a
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue