From 4b2f3feca14f876719dcbe383579b7bdc2bbd4ee Mon Sep 17 00:00:00 2001 From: root Date: Wed, 25 Jul 2018 13:13:30 +0200 Subject: [PATCH] feat: handle subtitles for video streaming (format code) --- http/http.go | 4 +-- http/subtitle.go | 92 ++++++++++++++++++++++++------------------------ 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/http/http.go b/http/http.go index e71e894c..a5e93311 100644 --- a/http/http.go +++ b/http/http.go @@ -166,9 +166,9 @@ func apiHandler(c *fb.Context, w http.ResponseWriter, r *http.Request) (int, err case "share": code, err = shareHandler(c, w, r) case "subtitles": - code, err = subtitlesHandler(c, w, r) + code, err = subtitlesHandler(c, w, r) case "subtitle": - code, err = subtitleHandler(c, w, r) + code, err = subtitleHandler(c, w, r) default: code = http.StatusNotFound } diff --git a/http/subtitle.go b/http/subtitle.go index d6dcd4c2..be54cd55 100644 --- a/http/subtitle.go +++ b/http/subtitle.go @@ -1,83 +1,83 @@ package http import ( - "os" - "io/ioutil" - "net/http" - "path/filepath" - "regexp" "bytes" fb "github.com/filebrowser/filebrowser" + "io/ioutil" + "net/http" + "os" + "path/filepath" + "regexp" ) func subtitlesHandler(c *fb.Context, w http.ResponseWriter, r *http.Request) (int, error) { files, err := ReadDir(filepath.Dir(c.File.Path)) - if(err != nil) { + if err != nil { return http.StatusInternalServerError, err } var subtitles = make([]map[string]string, 0) for _, file := range files { - ext := filepath.Ext(file.Name()) - if(ext == ".vtt" || ext == ".srt") { - var sub map[string]string = make(map[string]string) - sub["src"] = filepath.Dir(c.File.Path) + "/" + file.Name() - sub["kind"] = "subtitles" - sub["label"] = file.Name() - subtitles = append(subtitles, sub) + ext := filepath.Ext(file.Name()) + if ext == ".vtt" || ext == ".srt" { + var sub map[string]string = make(map[string]string) + sub["src"] = filepath.Dir(c.File.Path) + "/" + file.Name() + sub["kind"] = "subtitles" + sub["label"] = file.Name() + subtitles = append(subtitles, sub) } - } - return renderJSON(w, subtitles) + } + return renderJSON(w, subtitles) } func subtitleHandler(c *fb.Context, w http.ResponseWriter, r *http.Request) (int, error) { - str, err := CleanSubtitle(c.File.Path) - if err != nil { - return http.StatusInternalServerError, err - } + str, err := CleanSubtitle(c.File.Path) + if err != nil { + return http.StatusInternalServerError, err + } file, err := os.Open(c.File.Path) - defer file.Close() + defer file.Close() - if err != nil { - return http.StatusInternalServerError, err - } + if err != nil { + return http.StatusInternalServerError, err + } - stat, err := file.Stat() - if err != nil { - return http.StatusInternalServerError, err - } + stat, err := file.Stat() + if err != nil { + return http.StatusInternalServerError, err + } - w.Header().Set("Content-Disposition", "inline") - w.Header().Set("Content-Type", "text/vtt") - http.ServeContent(w, r, stat.Name(), stat.ModTime(), bytes.NewReader([]byte(str))) + w.Header().Set("Content-Disposition", "inline") + w.Header().Set("Content-Type", "text/vtt") + http.ServeContent(w, r, stat.Name(), stat.ModTime(), bytes.NewReader([]byte(str))) - return 0, nil + return 0, nil } func CleanSubtitle(filename string) (string, error) { b, err := ioutil.ReadFile(filename) - if(err != nil) { + if err != nil { return "", err } str := string(b) // convert content to a 'string' ext := filepath.Ext(filename) - if(ext == ".srt") { - re := regexp.MustCompile("([0-9]{2}:[0-9]{2}:[0-9]{2}),([0-9]{3})") - str = "WEBVTT\n\n" + re.ReplaceAllString(str, "$1.$2") + if ext == ".srt" { + re := regexp.MustCompile("([0-9]{2}:[0-9]{2}:[0-9]{2}),([0-9]{3})") + str = "WEBVTT\n\n" + re.ReplaceAllString(str, "$1.$2") } return str, err -} +} func ReadDir(dirname string) ([]os.FileInfo, error) { - f, err := os.Open(dirname) - if err != nil { - return nil, err - } - list, err := f.Readdir(-1) - f.Close() - if err != nil { - return nil, err - } - return list, nil + f, err := os.Open(dirname) + if err != nil { + return nil, err + } + list, err := f.Readdir(-1) + f.Close() + if err != nil { + return nil, err + } + return list, nil }