feat: handle subtitles for video streaming (format code)

This commit is contained in:
root 2018-07-25 13:13:30 +02:00
parent d82bce8e33
commit 4b2f3feca1
2 changed files with 48 additions and 48 deletions

View File

@ -166,9 +166,9 @@ func apiHandler(c *fb.Context, w http.ResponseWriter, r *http.Request) (int, err
case "share": case "share":
code, err = shareHandler(c, w, r) code, err = shareHandler(c, w, r)
case "subtitles": case "subtitles":
code, err = subtitlesHandler(c, w, r) code, err = subtitlesHandler(c, w, r)
case "subtitle": case "subtitle":
code, err = subtitleHandler(c, w, r) code, err = subtitleHandler(c, w, r)
default: default:
code = http.StatusNotFound code = http.StatusNotFound
} }

View File

@ -1,83 +1,83 @@
package http package http
import ( import (
"os"
"io/ioutil"
"net/http"
"path/filepath"
"regexp"
"bytes" "bytes"
fb "github.com/filebrowser/filebrowser" 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) { func subtitlesHandler(c *fb.Context, w http.ResponseWriter, r *http.Request) (int, error) {
files, err := ReadDir(filepath.Dir(c.File.Path)) files, err := ReadDir(filepath.Dir(c.File.Path))
if(err != nil) { if err != nil {
return http.StatusInternalServerError, err return http.StatusInternalServerError, err
} }
var subtitles = make([]map[string]string, 0) var subtitles = make([]map[string]string, 0)
for _, file := range files { for _, file := range files {
ext := filepath.Ext(file.Name()) ext := filepath.Ext(file.Name())
if(ext == ".vtt" || ext == ".srt") { if ext == ".vtt" || ext == ".srt" {
var sub map[string]string = make(map[string]string) var sub map[string]string = make(map[string]string)
sub["src"] = filepath.Dir(c.File.Path) + "/" + file.Name() sub["src"] = filepath.Dir(c.File.Path) + "/" + file.Name()
sub["kind"] = "subtitles" sub["kind"] = "subtitles"
sub["label"] = file.Name() sub["label"] = file.Name()
subtitles = append(subtitles, sub) 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) { func subtitleHandler(c *fb.Context, w http.ResponseWriter, r *http.Request) (int, error) {
str, err := CleanSubtitle(c.File.Path) str, err := CleanSubtitle(c.File.Path)
if err != nil { if err != nil {
return http.StatusInternalServerError, err return http.StatusInternalServerError, err
} }
file, err := os.Open(c.File.Path) file, err := os.Open(c.File.Path)
defer file.Close() defer file.Close()
if err != nil { if err != nil {
return http.StatusInternalServerError, err return http.StatusInternalServerError, err
} }
stat, err := file.Stat() stat, err := file.Stat()
if err != nil { if err != nil {
return http.StatusInternalServerError, err return http.StatusInternalServerError, err
} }
w.Header().Set("Content-Disposition", "inline") w.Header().Set("Content-Disposition", "inline")
w.Header().Set("Content-Type", "text/vtt") w.Header().Set("Content-Type", "text/vtt")
http.ServeContent(w, r, stat.Name(), stat.ModTime(), bytes.NewReader([]byte(str))) http.ServeContent(w, r, stat.Name(), stat.ModTime(), bytes.NewReader([]byte(str)))
return 0, nil return 0, nil
} }
func CleanSubtitle(filename string) (string, error) { func CleanSubtitle(filename string) (string, error) {
b, err := ioutil.ReadFile(filename) b, err := ioutil.ReadFile(filename)
if(err != nil) { if err != nil {
return "", err return "", err
} }
str := string(b) // convert content to a 'string' str := string(b) // convert content to a 'string'
ext := filepath.Ext(filename) ext := filepath.Ext(filename)
if(ext == ".srt") { if ext == ".srt" {
re := regexp.MustCompile("([0-9]{2}:[0-9]{2}:[0-9]{2}),([0-9]{3})") re := regexp.MustCompile("([0-9]{2}:[0-9]{2}:[0-9]{2}),([0-9]{3})")
str = "WEBVTT\n\n" + re.ReplaceAllString(str, "$1.$2") str = "WEBVTT\n\n" + re.ReplaceAllString(str, "$1.$2")
} }
return str, err return str, err
} }
func ReadDir(dirname string) ([]os.FileInfo, error) { func ReadDir(dirname string) ([]os.FileInfo, error) {
f, err := os.Open(dirname) f, err := os.Open(dirname)
if err != nil { if err != nil {
return nil, err return nil, err
} }
list, err := f.Readdir(-1) list, err := f.Readdir(-1)
f.Close() f.Close()
if err != nil { if err != nil {
return nil, err return nil, err
} }
return list, nil return list, nil
} }