From 84847e1d97983e40257e670acbf941483119d1c6 Mon Sep 17 00:00:00 2001
From: damiva <96115589+damiva@users.noreply.github.com>
Date: Sat, 25 May 2024 15:00:52 +0300
Subject: [PATCH] MSX bugs fixed (#409)
---
server/web/msx/msx.go | 123 ++++++++++++++++++++++--------------------
1 file changed, 66 insertions(+), 57 deletions(-)
diff --git a/server/web/msx/msx.go b/server/web/msx/msx.go
index be01ae4..4fcf47b 100644
--- a/server/web/msx/msx.go
+++ b/server/web/msx/msx.go
@@ -20,9 +20,19 @@ import (
const (
files = `files`
- base = `https://damiva.github.io/msx`
- htmlB = `
TorrServer MSX Plugin`
+ base = `https://damiva.github.io/msx/`
+ htmlB = `
+
+
+ TorrServer MSX Plugin
+
+
+
+
+
+`
)
var start = struct {
@@ -33,60 +43,28 @@ var start = struct {
func SetupRoute(r gin.IRouter) {
authorized := r.Group("/", auth.CheckAuth())
- authorized.GET("/msx/start.json", func(c *gin.Context) {
- c.JSON(200, &start)
- })
- authorized.POST("/msx/start.json", func(c *gin.Context) {
- if e := c.Bind(&start); e != nil {
- c.AbortWithError(http.StatusBadRequest, e)
- }
- })
- authorized.Any("/msx/proxy", func(c *gin.Context) {
- proxy(c, c.Query("url"), c.QueryArray("header")...)
- })
- authorized.GET("/msx/trn", func(c *gin.Context) {
- if h := c.Query("hash"); h != "" {
- var r bool
- for _, t := range settings.ListTorrent() {
- if r = (t != nil && t.InfoHash.HexString() == h); r {
- break
- }
+ //MSX:
+ authorized.Any("/msx/*pth", func(c *gin.Context) {
+ switch p := strings.TrimPrefix(c.Param("pth"), "/"); p {
+ case "start.json":
+ if c.Request.Method != "POST" {
+ c.JSON(200, &start)
+ } else if e := json.NewDecoder(c.Request.Body).Decode(&start); e != nil {
+ c.AbortWithError(http.StatusBadRequest, e)
}
- c.JSON(200, r)
- } else {
- c.AbortWithStatus(http.StatusBadRequest)
- }
- })
- authorized.POST("/msx/trn", func(c *gin.Context) {
- if j := struct{ Data string }{Data: c.Query("hash")}; j.Data != "" {
- st, sc := trn(j.Data)
- if sc != "" {
- sc = "{col:" + sc + "}"
+ case "proxy":
+ proxy(c, c.Query("url"), c.QueryArray("header")...)
+ case "torrent":
+ torrent(c)
+ default:
+ if !strings.HasSuffix(p, "/") && path.Ext(p) == "" {
+ c.Data(200, "text/html;charset=UTF-8", append(append(append([]byte(htmlB), base...), p...), htmlE...))
+ } else {
+ proxy(c, base+p)
}
- msx(c, map[string]string{"action": "player:label:position:{VALUE}{tb}{tb}" + sc + st})
- } else if e := c.Bind(&j); e != nil {
- msx(c, e)
- } else if j.Data == "" {
- msx(c, errors.New("data is not set"))
- } else {
- st, sc := trn(j.Data[strings.LastIndexByte(j.Data, ':')+1:])
- msx(c, map[string]any{"stamp": st, "stampColor": sc, "live": map[string]any{
- "stamp": st, "stampColor": sc, "live": map[string]any{
- "type": "airtime", "duration": 1000, "over": map[string]any{
- "action": "execute:" + utils.GetScheme(c) + c.Request.Host + c.Request.URL.Path, "data": j.Data,
- },
- },
- }})
}
})
- authorized.GET("/msx/*pth", func(c *gin.Context) {
- if p := c.Param("pth"); !strings.HasSuffix(p, "/") && path.Ext(p) == "" {
- c.Data(200, "text/html;charset=UTF-8", append(append(append([]byte(htmlB), base...), p...), htmlE...))
- } else {
- proxy(c, base+p)
- }
- })
-
+ //files:
authorized.GET("/files", func(c *gin.Context) {
if l, e := os.Readlink(files); e == nil || os.IsNotExist(e) {
c.JSON(200, l)
@@ -107,7 +85,7 @@ func SetupRoute(r gin.IRouter) {
}
})
authorized.StaticFS("/files/", gin.Dir(files, true))
-
+ //IMDB:
authorized.GET("/imdb/:id", func(c *gin.Context) {
i, l, j := strings.TrimPrefix(c.Param("id"), "/"), "", false
if j = strings.HasSuffix(i, ".json"); !j {
@@ -154,7 +132,7 @@ func proxy(c *gin.Context, u string, h ...string) {
}
}
-func trn(h string) (st, sc string) {
+func trnGet(h string) (st, sc string) {
if h := torr.GetTorrent(h); h != nil {
if h := h.Status(); h != nil && h.Stat < 5 {
switch h.Stat {
@@ -170,8 +148,7 @@ func trn(h string) (st, sc string) {
}
return
}
-
-func msx(c *gin.Context, a any) {
+func response(c *gin.Context, a any) {
var r struct {
R struct {
S int `json:"status"`
@@ -188,3 +165,35 @@ func msx(c *gin.Context, a any) {
r.R.T = http.StatusText(r.R.S)
c.JSON(200, &r)
}
+func torrent(c *gin.Context) {
+ if c.Request.Method != "POST" {
+ r := false
+ if h := c.Query("hash"); h != "" {
+ for _, t := range settings.ListTorrent() {
+ if r = (t != nil && t.InfoHash.HexString() == h); r {
+ break
+ }
+ }
+ }
+ c.JSON(200, r)
+ } else if j := struct{ Data string }{Data: c.Query("hash")}; j.Data != "" {
+ st, sc := trnGet(j.Data)
+ if sc != "" {
+ sc = "{col:" + sc + "}"
+ }
+ response(c, map[string]string{"action": "player:label:position:{VALUE}{tb}{tb}" + sc + st})
+ } else if e := json.NewDecoder(c.Request.Body).Decode(&j); e != nil {
+ response(c, e)
+ } else if j.Data == "" {
+ response(c, errors.New("data is not set"))
+ } else {
+ st, sc := trnGet(j.Data[strings.LastIndexByte(j.Data, ':')+1:])
+ response(c, map[string]any{"action": j.Data, "data": map[string]any{
+ "stamp": st, "stampColor": sc, "live": map[string]any{
+ "type": "airtime", "duration": 1000, "over": map[string]any{
+ "action": "execute:" + utils.GetScheme(c) + c.Request.Host + c.Request.URL.Path, "data": j.Data,
+ },
+ },
+ }})
+ }
+}