Skip to content

Commit

Permalink
added support for CORS request when ts is proxied.
Browse files Browse the repository at this point in the history
improved compatibility of proxied playlist
  • Loading branch information
snowie2000 committed Jul 25, 2024
1 parent 35a96b1 commit 1c02a6c
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 30 deletions.
10 changes: 10 additions & 0 deletions handler/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,16 @@ func LogoutHandler(c *gin.Context) {
c.String(http.StatusOK, "")
}

func CORSHandler(c *gin.Context) {
if strings.HasPrefix(c.Request.URL.Path, "/api") {
c.Status(http.StatusForbidden)
return
}
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "*")
c.Status(http.StatusOK)
}

func ChangePasswordHandler(c *gin.Context) {
if sessions.Default(c).Get("logined") != true {
c.String(http.StatusUnauthorized, "Unauthorized")
Expand Down
6 changes: 6 additions & 0 deletions handler/live.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ func LiveHandler(c *gin.Context) {
global.M3U8Cache.Set(channelCacheKey, m3u8Body, 3*time.Second)
}
}
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "*")
c.Data(http.StatusOK, "application/vnd.apple.mpegurl", []byte(m3u8Body))
}

Expand Down Expand Up @@ -235,6 +237,8 @@ func M3U8ProxyHandler(c *gin.Context) {
// make prefixURL from ourselves
prefixUrl, _ := global.GetConfig("base_url")
newList := service.M3U8Process(remoteURL, buffer.String(), prefixUrl, global.GetLiveToken(), true, nil)
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "*")
c.Data(http.StatusOK, "application/vnd.apple.mpegurl", []byte(newList))
}

Expand Down Expand Up @@ -299,6 +303,8 @@ func TsProxyHandler(c *gin.Context) {
}
}
defer resp.Body.Close()
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "*")
c.Writer.WriteHeader(resp.StatusCode)
io.Copy(c.Writer, resp.Body)
}
Expand Down
3 changes: 3 additions & 0 deletions plugin/rtmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ func (p *RTMPParser) Host(c *gin.Context, info *model.LiveInfo) error {
log.Println("Start transcoding", info.LiveUrl)
defer conn.Close()
defer log.Println("Transcoding finished")

c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "*")
c.Writer.Header().Set("Content-Type", "video/x-flv")
c.Writer.Header().Set("Transfer-Encoding", "chunked")
c.Writer.WriteHeader(200)
Expand Down
1 change: 1 addition & 0 deletions route/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
)

func Register(r *gin.Engine) {
r.OPTIONS("/", handler.CORSHandler)
r.GET("/lives.m3u", handler.M3UHandler)
r.GET("/live.m3u8", handler.LiveHandler)
r.HEAD("/live.m3u8", handler.LivePreHandler)
Expand Down
57 changes: 27 additions & 30 deletions service/m3u8.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package service

import (
"bufio"
"bytes"
"fmt"
"github.com/grafov/m3u8"
Expand Down Expand Up @@ -54,37 +53,37 @@ func cleanUrl(Url string) string {
return cleanURL
}

func processMediaPlaylist(playlistUrl string, data string, prefixURL string, proxy bool, fnTransform func(raw string, ts string) string) string {
var sb strings.Builder
scanner := bufio.NewScanner(strings.NewReader(data))
func processMediaPlaylist(playlistUrl string, pl *m3u8.MediaPlaylist, prefixURL string, proxyToken string, proxy bool, fnTransform func(raw string, ts string) string) string {
baseUrl := global.GetBaseURL(playlistUrl)
for scanner.Scan() {
l := strings.TrimSpace(scanner.Text())
if l == "" {
continue
handleUri := func(uri string) string {
if uri == "" {
return uri
}
if strings.HasPrefix(l, "#") {
sb.WriteString(l)
} else {
if !global.IsValidURL(l) {
l = cleanUrl(global.MergeUrl(baseUrl, l))
}
if proxy {
tsLink := prefixURL + util.CompressString(l)
if fnTransform != nil {
tsLink = fnTransform(l, tsLink)
}
sb.WriteString(tsLink)
} else {
sb.WriteString(l)
if !global.IsValidURL(uri) {
uri = cleanUrl(global.MergeUrl(baseUrl, uri))
}
if proxy {
tsLink := global.MergeUrl(prefixURL, "/live.ts?token="+proxyToken+"&k="+util.CompressString(uri))
if fnTransform != nil {
tsLink = fnTransform(uri, tsLink)
}
uri = tsLink
}
sb.WriteString("\n")
return uri
}
return sb.String()

var i uint
for i = pl.Count() - pl.WinSize(); i < pl.Count(); i++ {
pl.Segments[i].URI = handleUri(pl.Segments[i].URI)
}
// remove unused segments
for pl.Count() > pl.WinSize() {
pl.Remove()
}
return pl.Encode().String()
}

func processMasterPlaylist(playlistUrl string, pl *m3u8.MasterPlaylist, prefixURL string, proxy bool, fnTransform func(raw string, ts string) string) string {
func processMasterPlaylist(playlistUrl string, pl *m3u8.MasterPlaylist, prefixURL string, proxyToken string, proxy bool, fnTransform func(raw string, ts string) string) string {
baseUrl := global.GetBaseURL(playlistUrl)
handleUri := func(uri string) string {
if uri == "" {
Expand All @@ -94,7 +93,7 @@ func processMasterPlaylist(playlistUrl string, pl *m3u8.MasterPlaylist, prefixUR
uri = cleanUrl(global.MergeUrl(baseUrl, uri))
}
if proxy {
plLink := prefixURL + util.CompressString(uri)
plLink := global.MergeUrl(prefixURL, "/playlist.m3u8?token="+proxyToken+"&k="+util.CompressString(uri))
if fnTransform != nil {
plLink = fnTransform(uri, plLink)
}
Expand All @@ -119,11 +118,9 @@ func M3U8Process(playlistUrl string, data string, prefixURL string, proxyToken s
if err == nil {
switch listType {
case m3u8.MASTER:
prefixURL = prefixURL + "/playlist.m3u8?token=" + proxyToken + "&k="
return processMasterPlaylist(playlistUrl, p.(*m3u8.MasterPlaylist), prefixURL, proxy, fnTransform)
return processMasterPlaylist(playlistUrl, p.(*m3u8.MasterPlaylist), prefixURL, proxyToken, proxy, fnTransform)
case m3u8.MEDIA:
prefixURL = prefixURL + "/live.ts?token=" + proxyToken + "&k="
return processMediaPlaylist(playlistUrl, data, prefixURL, proxy, fnTransform)
return processMediaPlaylist(playlistUrl, p.(*m3u8.MediaPlaylist), prefixURL, proxyToken, proxy, fnTransform)
}
}
return ""
Expand Down

0 comments on commit 1c02a6c

Please sign in to comment.