Add UI controls for selecting lower quality video resolutions

This commit is contained in:
James Mills 2020-03-28 17:18:01 +10:00
parent ef8afabf3f
commit 58a6502c83
No known key found for this signature in database
GPG key ID: AC4C014F1440EBD6
3 changed files with 93 additions and 4 deletions

View file

@ -28,6 +28,15 @@ import (
//go:generate rice embed-go //go:generate rice embed-go
var (
SizeMap = map[string]string{
"hd720": "720p",
"hd480": "480p",
"nhd": "360p",
"film": "240p",
}
)
// App represents main application. // App represents main application.
type App struct { type App struct {
Config *Config Config *Config
@ -311,6 +320,41 @@ func (a *App) uploadHandler(w http.ResponseWriter, r *http.Request) {
return 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!") fmt.Fprintf(w, "Video successfully uploaded!")
} else { } else {
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) 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) http.Error(w, err.Error(), http.StatusInternalServerError)
return 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!") fmt.Fprintf(w, "Video successfully imported!")
} else { } else {
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)

View file

@ -123,9 +123,9 @@ func init() {
} }
filee := &embedded.EmbeddedFile{ filee := &embedded.EmbeddedFile{
Filename: "index.html", Filename: "index.html",
FileModTime: time.Unix(1585374250, 0), FileModTime: time.Unix(1585378864, 0),
Content: string("{{ define \"content\" }}\r\n{{ $playing := .Playing }}\r\n<div id=\"player\">\r\n {{ if $playing.ID }}\r\n <video id=\"video\" controls preload=\"metadata\" poster=\"/t/{{ $playing.ID}}\">\r\n <source src=\"/v/{{ $playing.ID }}.mp4?quality={{ $.Quality }}\" type=\"video/mp4\" />\r\n </video>\r\n <h1>{{ $playing.Title }}</h1>\r\n <h2>{{ $playing.Views }} views • {{ $playing.Modified }}<br />{{ $playing.Size | bytes }}</h2>\r\n <p>{{ $playing.Description }}</p>\r\n {{ else }}\r\n <video id=\"video\" controls></video>\r\n {{ end }}\r\n</div>\r\n<div id=\"playlist\">\r\n <div class=\"nav\">\r\n <ul>\r\n <li><a {{ if or (eq $.Sort \"timestamp\") (eq $.Sort \"\") }}class=\"active\"{{ end }} href=\"?sort=timestamp\">Recent</a></li>\r\n <li><a {{ if eq $.Sort \"views\" }}class=\"active\"{{ end }} href=\"?sort=views\">Views</a></li>\r\n </ul>\r\n </div>\r\n {{ range $m := .Playlist }}\r\n {{ if eq $m.ID $playing.ID }}\r\n <a href=\"/v/{{ $m.ID }}\" class=\"playing\">\r\n {{ else }}\r\n <a href=\"/v/{{ $m.ID }}\">\r\n {{ end }}\r\n <img src=\"/t/{{ $m.ID }}\">\r\n <div>\r\n <h1>{{ $m.Title }}</h1>\r\n <h2>{{ $m.Views }} views • {{ $m.Modified }}<br />{{ $m.Size | bytes }}</h2>\r\n </div>\r\n </a>\r\n {{ end }}\r\n</div>\r\n{{end}}\r\n"), Content: string("{{ define \"content\" }}\r\n{{ $playing := .Playing }}\r\n<div class=\"nav\">\r\n <ul>\r\n <li><a {{ if eq $.Quality \"\" }}class=\"active\"{{ end }} href=\"/v/{{ $playing.ID }}\">fullHD</a></li>\r\n <li><a {{ if eq $.Quality \"720p\" }}class=\"active\"{{ end }} href=\"/v/{{ $playing.ID }}?quality=720p\">720p</a></li>\r\n <li><a {{ if eq $.Quality \"480p\" }}class=\"active\"{{ end }} href=\"/v/{{ $playing.ID }}?quality=480p\">480p</a></li>\r\n <li><a {{ if eq $.Quality \"360p\" }}class=\"active\"{{ end }} href=\"/v/{{ $playing.ID }}?quality=360p\">360p</a></li>\r\n <li><a {{ if eq $.Quality \"240p\" }}class=\"active\"{{ end }} href=\"/v/{{ $playing.ID }}?quality=240p\">240p</a></li>\r\n </ul>\r\n</div>\r\n<div id=\"player\">\r\n {{ if $playing.ID }}\r\n <video id=\"video\" controls preload=\"metadata\" poster=\"/t/{{ $playing.ID}}\">\r\n <source src=\"/v/{{ $playing.ID }}.mp4?quality={{ $.Quality }}\" type=\"video/mp4\" />\r\n </video>\r\n <h1>{{ $playing.Title }}</h1>\r\n <h2>{{ $playing.Views }} views • {{ $playing.Modified }}<br />{{ $playing.Size | bytes }}</h2>\r\n <p>{{ $playing.Description }}</p>\r\n {{ else }}\r\n <video id=\"video\" controls></video>\r\n {{ end }}\r\n</div>\r\n<div id=\"playlist\">\r\n <div class=\"nav\">\r\n <ul>\r\n <li><a {{ if or (eq $.Sort \"timestamp\") (eq $.Sort \"\") }}class=\"active\"{{ end }} href=\"?sort=timestamp\">Recent</a></li>\r\n <li><a {{ if eq $.Sort \"views\" }}class=\"active\"{{ end }} href=\"?sort=views\">Views</a></li>\r\n </ul>\r\n </div>\r\n {{ range $m := .Playlist }}\r\n {{ if eq $m.ID $playing.ID }}\r\n <a href=\"/v/{{ $m.ID }}\" class=\"playing\">\r\n {{ else }}\r\n <a href=\"/v/{{ $m.ID }}\">\r\n {{ end }}\r\n <img src=\"/t/{{ $m.ID }}\">\r\n <div>\r\n <h1>{{ $m.Title }}</h1>\r\n <h2>{{ $m.Views }} views • {{ $m.Modified }}<br />{{ $m.Size | bytes }}</h2>\r\n </div>\r\n </a>\r\n {{ end }}\r\n</div>\r\n{{end}}\r\n"),
} }
filef := &embedded.EmbeddedFile{ filef := &embedded.EmbeddedFile{
Filename: "upload.html", Filename: "upload.html",
@ -137,7 +137,7 @@ func init() {
// define dirs // define dirs
dirb := &embedded.EmbeddedDir{ dirb := &embedded.EmbeddedDir{
Filename: "", Filename: "",
DirModTime: time.Unix(1585374250, 0), DirModTime: time.Unix(1585378864, 0),
ChildFiles: []*embedded.EmbeddedFile{ ChildFiles: []*embedded.EmbeddedFile{
filec, // "base.html" filec, // "base.html"
filed, // "import.html" filed, // "import.html"
@ -153,7 +153,7 @@ func init() {
// register embeddedBox // register embeddedBox
embedded.RegisterEmbeddedBox(`../templates`, &embedded.EmbeddedBox{ embedded.RegisterEmbeddedBox(`../templates`, &embedded.EmbeddedBox{
Name: `../templates`, Name: `../templates`,
Time: time.Unix(1585374250, 0), Time: time.Unix(1585378864, 0),
Dirs: map[string]*embedded.EmbeddedDir{ Dirs: map[string]*embedded.EmbeddedDir{
"": dirb, "": dirb,
}, },

View file

@ -1,5 +1,14 @@
{{ define "content" }} {{ define "content" }}
{{ $playing := .Playing }} {{ $playing := .Playing }}
<div class="nav">
<ul>
<li><a {{ if eq $.Quality "" }}class="active"{{ end }} href="/v/{{ $playing.ID }}">fullHD</a></li>
<li><a {{ if eq $.Quality "720p" }}class="active"{{ end }} href="/v/{{ $playing.ID }}?quality=720p">720p</a></li>
<li><a {{ if eq $.Quality "480p" }}class="active"{{ end }} href="/v/{{ $playing.ID }}?quality=480p">480p</a></li>
<li><a {{ if eq $.Quality "360p" }}class="active"{{ end }} href="/v/{{ $playing.ID }}?quality=360p">360p</a></li>
<li><a {{ if eq $.Quality "240p" }}class="active"{{ end }} href="/v/{{ $playing.ID }}?quality=240p">240p</a></li>
</ul>
</div>
<div id="player"> <div id="player">
{{ if $playing.ID }} {{ if $playing.ID }}
<video id="video" controls preload="metadata" poster="/t/{{ $playing.ID}}"> <video id="video" controls preload="metadata" poster="/t/{{ $playing.ID}}">