84 lines
1.9 KiB
Go
84 lines
1.9 KiB
Go
package handlers
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/mux"
|
|
)
|
|
|
|
type playData struct {
|
|
AuthID string
|
|
AuthName string
|
|
Url string
|
|
}
|
|
|
|
func (server *Server) play(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
xid := vars["xid"]
|
|
data := playData{
|
|
Url: "/media/" + xid + "/stream/",
|
|
}
|
|
auth, err := server.withCookie(r)
|
|
if err == nil {
|
|
data.AuthID = auth.AuthID
|
|
data.AuthName = auth.AuthName
|
|
}
|
|
render(w, data, "web/templates/video/play.html.tmpl", "web/templates/base/header.html.tmpl", "web/templates/base/footer.html.tmpl")
|
|
}
|
|
|
|
/*
|
|
// 直接播放mp4
|
|
video, err := os.Open("web/statics/git.mp4")
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
w.Write([]byte("failed to open file"))
|
|
return
|
|
}
|
|
defer video.Close()
|
|
|
|
http.ServeContent(w, r, "git", time.Now(), video)
|
|
*/
|
|
|
|
func (server *Server) stream(response http.ResponseWriter, request *http.Request) {
|
|
vars := mux.Vars(request)
|
|
mId := vars["xid"]
|
|
fmt.Println(mId)
|
|
|
|
segName, ok := vars["segName"]
|
|
|
|
if !ok {
|
|
mediaBase := getMediaBase(mId)
|
|
m3u8Name := "index.m3u8"
|
|
serveHlsM3u8(response, request, mediaBase, m3u8Name)
|
|
} else {
|
|
mediaBase := getMediaBase(mId)
|
|
serveHlsTs(response, request, mediaBase, segName)
|
|
}
|
|
|
|
}
|
|
func getMediaBase(mId string) string {
|
|
mediaRoot := "media"
|
|
return fmt.Sprintf("%s/%s", mediaRoot, mId)
|
|
}
|
|
|
|
func serveHlsM3u8(w http.ResponseWriter, r *http.Request, mediaBase, m3u8Name string) {
|
|
fmt.Println("serveHlsM3u8...")
|
|
|
|
mediaFile := fmt.Sprintf("%s/%s", mediaBase, m3u8Name)
|
|
fmt.Println(mediaFile)
|
|
http.ServeFile(w, r, mediaFile)
|
|
w.Header().Set("Content-Type", "application/x-mpegURL")
|
|
|
|
}
|
|
|
|
func serveHlsTs(w http.ResponseWriter, r *http.Request, mediaBase, segName string) {
|
|
fmt.Println("serveHlsTs...")
|
|
|
|
mediaFile := fmt.Sprintf("%s/%s", mediaBase, segName)
|
|
fmt.Println(mediaFile)
|
|
|
|
http.ServeFile(w, r, mediaFile)
|
|
w.Header().Set("Content-Type", "video/MP2T")
|
|
}
|