From 8147689be7a0d5fa2b18723f26c1bcbae111a781 Mon Sep 17 00:00:00 2001
From: damiva <96115589+damiva@users.noreply.github.com>
Date: Fri, 24 Mar 2023 14:00:46 +0300
Subject: [PATCH] Add files via upload
---
server/web/msx/msx.go | 105 ++++++++++++++++++++-------------
server/web/msx/russian.min.gz | Bin 0 -> 6419 bytes
server/web/msx/torrent.min.gz | Bin 0 -> 2861 bytes
server/web/msx/torrents.min.gz | Bin 0 -> 2994 bytes
server/web/msx/ts.min.gz | Bin 0 -> 387 bytes
5 files changed, 64 insertions(+), 41 deletions(-)
create mode 100644 server/web/msx/russian.min.gz
create mode 100644 server/web/msx/torrent.min.gz
create mode 100644 server/web/msx/torrents.min.gz
create mode 100644 server/web/msx/ts.min.gz
diff --git a/server/web/msx/msx.go b/server/web/msx/msx.go
index 52aa8f6..fb6a390 100644
--- a/server/web/msx/msx.go
+++ b/server/web/msx/msx.go
@@ -1,73 +1,96 @@
-package msx
+package main
import (
_ "embed"
-
- "server/version"
+ "encoding/json"
+ "net/http"
+ "sync"
"github.com/gin-gonic/gin"
)
var (
- //go:embed assets/tvx.js.gz
- tvx []byte
- //go:embed assets/tizen.js.gz
- tzn []byte
- //go:embed assets/torrents.js.gz
- trs []byte
- //go:embed assets/torrent.js.gz
- trn []byte
- //go:embed assets/html5x.html.gz
- h5x []byte
- //go:embed assets/russian.json.gz
+ //go:embed russian.min.gz
rus []byte
+ //go:embed torrents.min.gz
+ trs []byte
+ //go:embed torrent.min.gz
+ trn []byte
+ //go:embed ts.min.gz
+ its []byte
+
+ idb = new(sync.Mutex)
+ ids = make(map[string]string)
)
-func ass(b []byte, t string) func(*gin.Context) {
- return func(c *gin.Context) {
- c.Header("Content-Encoding", "gzip")
- c.Data(200, t+"; charset=UTF-8", b)
- }
-}
-func ass(c *gin.Context, b []byte, t string) {
+func asset(c *gin.Context, t string, d []byte) {
+ c.Header("Access-Control-Allow-Origin", "*")
c.Header("Content-Encoding", "gzip")
- c.Data(200, t+"; charset=UTF-8", b)
+ c.Data(200, t+"; charset=UTF-8", d)
}
func SetupRoute(r *gin.RouterGroup) {
r.GET("/msx/:pth", func(c *gin.Context) {
- s := []string{"tvx", "tizen"}
+ js := []string{"http://msx.benzac.de/js/tvx-plugin.min.js"}
switch p := c.Param("pth"); p {
case "start.json":
- c.JSON(200, gin.H{
+ c.JSON(200, map[string]string{
"name": "TorrServer",
"version": version.Version,
- "parameter": "content:request:interaction:init@{PREFIX}{SERVER}/msx/torrents",
+ "parameter": "menu:request:interaction:torr@{PREFIX}{SERVER}/msx/init",
})
case "russian.json":
- ass(c, rus, "application.json")
- case "html5x":
- ass(c, h5x, "text/html")
- case "tvx.js":
- ass(c, tvx, "text/javascript")
- case "tizen.js":
- ass(c, tzn, "text/javascript")
+ asset(c, "application/json", rus)
case "torrents.js":
- ass(c, trs, "text/javascript")
+ asset(c, "text/javascript", trs)
case "torrent.js":
- ass(c, trn, "text/javascript")
+ asset(c, "text/javascript", trn)
+ case "ts.js":
+ asset(c, "text/javascript", its)
case "torrents":
- s = append(s, p)
+ js = append(js, p+".js")
p = "torrent"
fallthrough
case "torrent":
- s = append(s, p)
- b := []byte("\n\n
\nTorrServer Interaction Plugin\n\n")
- for _, j := range s {
- b = append(b, "\n"...)
+ if c.Query("platform") == "tizen" {
+ js = append(js, "http://msx.benzac.de/interaction/js/tizen-player.js")
}
- c.Data(200, "text/html", append(b, "\n\n"...))
+ fallthrough
+ case "ts":
+ b := []byte("\n\n\nTorrServer Plugin\n\n")
+ for _, j := range append(js, p+".js") {
+ b = append(b, "\n"...)
+ }
+ c.Data(200, "text/html; charset=UTF-8", append(b, "\n\n"...))
default:
- c.AbortWithStatus(404)
+ c.AbortWithStatus(400)
}
})
+ r.GET("/msx/imdb", func(c *gin.Context) {
+ idb.Lock()
+ defer idb.Unlock()
+ l := len(ids)
+ ids = make(map[string]string)
+ c.JSON(200, l)
+ })
+ r.GET("/msx/imdb/:id", func(c *gin.Context) {
+ idb.Lock()
+ defer idb.Unlock()
+ p := c.Param("id")
+ i, o := ids[p]
+ if !o {
+ if r, e := http.Get("https://v2.sg.media-imdb.com/suggestion/h/" + p + ".json"); e == nil {
+ defer r.Body.Close()
+ if r.StatusCode == 200 {
+ var j struct {
+ D []struct{ I struct{ ImageUrl string } }
+ }
+ if e = json.NewDecoder(r.Body).Decode(&j); e == nil && len(j.D) > 0 {
+ i = j.D[0].I.ImageUrl
+ }
+ }
+ }
+ ids[p] = i
+ }
+ c.JSON(200, i)
+ })
}
diff --git a/server/web/msx/russian.min.gz b/server/web/msx/russian.min.gz
new file mode 100644
index 0000000000000000000000000000000000000000..fb8da24ca519db83a791d0a8b4411e1f6c891deb
GIT binary patch
literal 6419
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
literal 0
HcmV?d00001
diff --git a/server/web/msx/torrent.min.gz b/server/web/msx/torrent.min.gz
new file mode 100644
index 0000000000000000000000000000000000000000..ed4d168f066ad9a8b9882d1e2c088a27f1015ad8
GIT binary patch
literal 2861
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
L5%XYjnHm59pvI!n
literal 0
HcmV?d00001
diff --git a/server/web/msx/torrents.min.gz b/server/web/msx/torrents.min.gz
new file mode 100644
index 0000000000000000000000000000000000000000..ba32e736b039220a5708fc96a8ad27bfbdfd66c7
GIT binary patch
literal 2994
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
literal 0
HcmV?d00001
diff --git a/server/web/msx/ts.min.gz b/server/web/msx/ts.min.gz
new file mode 100644
index 0000000000000000000000000000000000000000..c96dba5fbef5b806012456c8b499684bc9ab7986
GIT binary patch
literal 387
zcmV-}0et=+iwFo7fgNN319WpPZE0=*eUV#F0x=MU{|fej>}EFwAADJ|!5a#R7XmBt
zW}4jrYPwUM>57E#-z_XEF~szx>6vrpn`t(g4ox-Jm|1IBS{#8YR>7>o+-ZwJxXvci
z0XiVHd#H;ggR9>93JU`iAS@dP2Di{G7dveP?-j61e^iVirsJ9M(MA?0%IHElD8}HN
z#yKCteJE;R>YZbt51j+cip)@vDp}6K-BiYm9R)%a1p%{&g$O&?YzCN$=Ke7ikq@Zn
zXGfWRqMZrDFs5LQs)R&jmT21ps8N%N*x%VxB%&?b@=U~q-cc!9C5J%lEU7tcaV~w2
zKv2c3l@B;M4ZBN?gh&I8o(I=iKN6ou
h#eQ#a+s`80g#K*8vGxD}
literal 0
HcmV?d00001