From 58a6502c836bb50dd4424c75311d48553db488ca Mon Sep 17 00:00:00 2001 From: James Mills Date: Sat, 28 Mar 2020 17:18:01 +1000 Subject: [PATCH] Add UI controls for selecting lower quality video resolutions --- app/app.go | 80 ++++++++++++++++++++++++++++++++++++++++++++ app/rice-box.go | 8 ++--- templates/index.html | 9 +++++ 3 files changed, 93 insertions(+), 4 deletions(-) diff --git a/app/app.go b/app/app.go index 8899de1..bc2802d 100644 --- a/app/app.go +++ b/app/app.go @@ -28,6 +28,15 @@ import ( //go:generate rice embed-go +var ( + SizeMap = map[string]string{ + "hd720": "720p", + "hd480": "480p", + "nhd": "360p", + "film": "240p", + } +) + // App represents main application. type App struct { Config *Config @@ -311,6 +320,41 @@ func (a *App) uploadHandler(w http.ResponseWriter, r *http.Request) { return } + // TODO: Make this a background job + // Resize for lower quality options + for size, suffix := range SizeMap { + log. + WithField("size", size). + WithField("vf", filepath.Base(vf)). + Info("resizing video for lower quality playback") + sf := fmt.Sprintf( + "%s#%s.mp4", + strings.TrimSuffix(vf, filepath.Ext(vf)), + suffix, + ) + + if err := utils.RunCmd( + a.Config.Transcoder.Timeout, + "ffmpeg", + "-y", + "-i", vf, + "-s", size, + "-c:v", "libx264", + "-c:a", "aac", + "-crf", "18", + "-strict", "-2", + "-loglevel", "quiet", + "-metadata", fmt.Sprintf("title=%s", title), + "-metadata", fmt.Sprintf("comment=%s", description), + sf, + ); err != nil { + err := fmt.Errorf("error transcoding video: %w", err) + log.Error(err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } + fmt.Fprintf(w, "Video successfully uploaded!") } else { http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) @@ -435,6 +479,42 @@ func (a *App) importHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } + + // TODO: Make this a background job + // Resize for lower quality options + for size, suffix := range SizeMap { + log. + WithField("size", size). + WithField("vf", filepath.Base(vf)). + Info("resizing video for lower quality playback") + sf := fmt.Sprintf( + "%s#%s.mp4", + strings.TrimSuffix(vf, filepath.Ext(vf)), + suffix, + ) + + if err := utils.RunCmd( + a.Config.Transcoder.Timeout, + "ffmpeg", + "-y", + "-i", vf, + "-s", size, + "-c:v", "libx264", + "-c:a", "aac", + "-crf", "18", + "-strict", "-2", + "-loglevel", "quiet", + "-metadata", fmt.Sprintf("title=%s", videoInfo.Title), + "-metadata", fmt.Sprintf("comment=%s", videoInfo.Description), + sf, + ); err != nil { + err := fmt.Errorf("error transcoding video: %w", err) + log.Error(err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + } + fmt.Fprintf(w, "Video successfully imported!") } else { http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) diff --git a/app/rice-box.go b/app/rice-box.go index 42c9fee..7f56f54 100644 --- a/app/rice-box.go +++ b/app/rice-box.go @@ -123,9 +123,9 @@ func init() { } filee := &embedded.EmbeddedFile{ Filename: "index.html", - FileModTime: time.Unix(1585374250, 0), + FileModTime: time.Unix(1585378864, 0), - Content: string("{{ define \"content\" }}\r\n{{ $playing := .Playing }}\r\n
\r\n {{ if $playing.ID }}\r\n \r\n

{{ $playing.Title }}

\r\n

{{ $playing.Views }} views • {{ $playing.Modified }}
{{ $playing.Size | bytes }}

\r\n

{{ $playing.Description }}

\r\n {{ else }}\r\n \r\n {{ end }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n {{ range $m := .Playlist }}\r\n {{ if eq $m.ID $playing.ID }}\r\n \r\n {{ else }}\r\n \r\n {{ end }}\r\n \r\n
\r\n

{{ $m.Title }}

\r\n

{{ $m.Views }} views • {{ $m.Modified }}
{{ $m.Size | bytes }}

\r\n
\r\n
\r\n {{ end }}\r\n
\r\n{{end}}\r\n"), + Content: string("{{ define \"content\" }}\r\n{{ $playing := .Playing }}\r\n
\r\n \r\n
\r\n
\r\n {{ if $playing.ID }}\r\n \r\n

{{ $playing.Title }}

\r\n

{{ $playing.Views }} views • {{ $playing.Modified }}
{{ $playing.Size | bytes }}

\r\n

{{ $playing.Description }}

\r\n {{ else }}\r\n \r\n {{ end }}\r\n
\r\n
\r\n
\r\n \r\n
\r\n {{ range $m := .Playlist }}\r\n {{ if eq $m.ID $playing.ID }}\r\n \r\n {{ else }}\r\n \r\n {{ end }}\r\n \r\n
\r\n

{{ $m.Title }}

\r\n

{{ $m.Views }} views • {{ $m.Modified }}
{{ $m.Size | bytes }}

\r\n
\r\n
\r\n {{ end }}\r\n
\r\n{{end}}\r\n"), } filef := &embedded.EmbeddedFile{ Filename: "upload.html", @@ -137,7 +137,7 @@ func init() { // define dirs dirb := &embedded.EmbeddedDir{ Filename: "", - DirModTime: time.Unix(1585374250, 0), + DirModTime: time.Unix(1585378864, 0), ChildFiles: []*embedded.EmbeddedFile{ filec, // "base.html" filed, // "import.html" @@ -153,7 +153,7 @@ func init() { // register embeddedBox embedded.RegisterEmbeddedBox(`../templates`, &embedded.EmbeddedBox{ Name: `../templates`, - Time: time.Unix(1585374250, 0), + Time: time.Unix(1585378864, 0), Dirs: map[string]*embedded.EmbeddedDir{ "": dirb, }, diff --git a/templates/index.html b/templates/index.html index 5d8cd18..4d5c350 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,5 +1,14 @@ {{ define "content" }} {{ $playing := .Playing }} +
{{ if $playing.ID }}