diff --git a/server/web/api/msx.go b/server/web/api/msx.go index 8079eba..2728bbf 100644 --- a/server/web/api/msx.go +++ b/server/web/api/msx.go @@ -1,214 +1,214 @@ package api import ( - "fmt" - "strings" - "net/url" - "path/filepath" + "fmt" + "net/url" + "path/filepath" + "strings" - sets "server/settings" - "server/torr" - "server/torr/state" - "server/utils" - "server/version" + sets "server/settings" + "server/torr" + "server/torr/state" + "server/utils" + "server/version" - "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin" ) type msxMenu struct { - Logo string `json:"logo,omitempty"` - Menu []msxMenuItem `json:"menu"` + Logo string `json:"logo,omitempty"` + Menu []msxMenuItem `json:"menu"` } type msxMenuItem struct { - Icon string `json:"icon,omitempty"` - Label string `json:"label,omitempty"` - Data msxData `json:"data,omitempty"` + Icon string `json:"icon,omitempty"` + Label string `json:"label,omitempty"` + Data msxData `json:"data,omitempty"` } type msxData struct { - Type string `json:"type,omitempty"` - Headline string `json:"headline,omitempty"` - Action string `json:"action,omitempty"` - Template gin.H `json:"template,omitempty"` - Items []msxItem `json:"items,omitempty"` - Pages []msxPage `json:"pages,omitempty"` + Type string `json:"type,omitempty"` + Headline string `json:"headline,omitempty"` + Action string `json:"action,omitempty"` + Template gin.H `json:"template,omitempty"` + Items []msxItem `json:"items,omitempty"` + Pages []msxPage `json:"pages,omitempty"` } type msxItem struct { - Title string `json:"title,omitempty"` - Label string `json:"label,omitempty"` - PlayerLabel string `json:"playerLabel,omitempty"` - Action string `json:"action,omitempty"` - Image string `json:"image,omitempty"` - Icon string `json:"icon,omitempty"` - Badge string `json:"badge,omitempty"` - Tag string `json:"tag,omitempty"` + Title string `json:"title,omitempty"` + Label string `json:"label,omitempty"` + PlayerLabel string `json:"playerLabel,omitempty"` + Action string `json:"action,omitempty"` + Image string `json:"image,omitempty"` + Icon string `json:"icon,omitempty"` + Badge string `json:"badge,omitempty"` + Tag string `json:"tag,omitempty"` } type msxPage struct { - Items []gin.H `json:"items,omitempty"` + Items []gin.H `json:"items,omitempty"` } func msxStart(c *gin.Context) { - c.JSON(200, gin.H{ - "name": "TorrServer", - "version": version.Version, - "parameter": "menu:{PREFIX}{SERVER}/msx/torrents", - }) + c.JSON(200, gin.H{ + "name": "TorrServer", + "version": version.Version, + "parameter": "menu:{PREFIX}{SERVER}/msx/torrents", + }) } // /msx/torrents func msxTorrents(c *gin.Context) { - torrs := torr.ListTorrent() + torrs := torr.ListTorrent() - host := utils.GetScheme(c) + "://" + c.Request.Host - logo := host + "/apple-touch-icon.png" - list := make([]msxItem, len(torrs)) + host := utils.GetScheme(c) + "://" + c.Request.Host + logo := host + "/apple-touch-icon.png" + list := make([]msxItem, len(torrs)) - for i, tor := range torrs { - item := msxItem{ - Title: tor.Title, - Image: tor.Poster, - Action: "content:" + host + "/msx/playlist/" + url.PathEscape(tor.Title) + "?hash=" + tor.TorrentSpec.InfoHash.HexString(), - } - list[i] = item - } + for i, tor := range torrs { + item := msxItem{ + Title: tor.Title, + Image: tor.Poster, + Action: "content:" + host + "/msx/playlist/" + url.PathEscape(tor.Title) + "?hash=" + tor.TorrentSpec.InfoHash.HexString(), + } + list[i] = item + } - c.JSON(200, msxMenu{ - Logo: logo, - Menu: []msxMenuItem{ - // Main page - { - Icon: "list", - Label: "Torrents", - Data: msxData{ - Type: "pages", - Template: gin.H{ - "type": "separate", - "layout": "0,0,2,4", - "icon": "msx-white-soft:movie", - "color": "msx-glass", - }, - Items: list, - }, - // About - },{ - Icon: "info", - Label: "About", - Data: msxData{ - Pages: []msxPage{ - { - Items: []gin.H{ - { - "type": "default", - "headline": "TorrServer " + version.Version, - "text": "https://github.com/YouROK/TorrServer", - "image": logo, - "imageFiller": "height-left", - "imageWidth": 2, - "layout": "0,0,8,2", - "color": "msx-gray-soft", - }, - }, - }, - }, - }, - }, - }, - }) + c.JSON(200, msxMenu{ + Logo: logo, + Menu: []msxMenuItem{ + // Main page + { + Icon: "list", + Label: "Torrents", + Data: msxData{ + Type: "pages", + Template: gin.H{ + "type": "separate", + "layout": "0,0,2,4", + "icon": "msx-white-soft:movie", + "color": "msx-glass", + }, + Items: list, + }, + // About + }, { + Icon: "info", + Label: "About", + Data: msxData{ + Pages: []msxPage{ + { + Items: []gin.H{ + { + "type": "default", + "headline": "TorrServer " + version.Version, + "text": "https://github.com/YouROK/TorrServer", + "image": logo, + "imageFiller": "height-left", + "imageWidth": 2, + "layout": "0,0,8,2", + "color": "msx-gray-soft", + }, + }, + }, + }, + }, + }, + }, + }) } // /msx/playlist?hash=... func msxPlaylist(c *gin.Context) { - hash, _ := c.GetQuery("hash") - if hash == "" { - c.JSON(200, msxData{ - Action: "error:Item not found", - }) - return - } + hash, _ := c.GetQuery("hash") + if hash == "" { + c.JSON(200, msxData{ + Action: "error:Item not found", + }) + return + } - tor := torr.GetTorrent(hash) - if tor == nil { - c.JSON(200, msxData{ - Action: "error:Item not found", - }) - return - } + tor := torr.GetTorrent(hash) + if tor == nil { + c.JSON(200, msxData{ + Action: "error:Item not found", + }) + return + } - if tor.Stat == state.TorrentInDB { - tor = torr.LoadTorrent(tor) - if tor == nil { - c.JSON(200, msxData{ - Action: "error:Error while getting torrent info", - }) - return - } - } + if tor.Stat == state.TorrentInDB { + tor = torr.LoadTorrent(tor) + if tor == nil { + c.JSON(200, msxData{ + Action: "error:Error while getting torrent info", + }) + return + } + } - host := utils.GetScheme(c) + "://" + c.Request.Host - status := tor.Status() - viewed := sets.ListViewed(hash) - list := []msxItem{} + host := utils.GetScheme(c) + "://" + c.Request.Host + status := tor.Status() + viewed := sets.ListViewed(hash) + var list []msxItem - for _, f := range status.FileStats { - mime := utils.GetMimeType(f.Path) - action := mime[0 : len(mime)-2] + for _, f := range status.FileStats { + mime := utils.GetMimeType(f.Path) + action := mime[0 : len(mime)-2] - if (action == "*") { - continue - } - name := filepath.Base(f.Path) - item := msxItem{ - Label: name, - PlayerLabel: strings.TrimSuffix(name, filepath.Ext(name)), - Action: action + ":" + host + "/stream/" + url.PathEscape(name) + "?link=" + hash + "&index=" + fmt.Sprint(f.Id) + "&play", - } - if (isViewed(viewed, f.Id)) { - item.Tag = " " - } - if (action == "audio") { - item.Icon = "msx-white-soft:music-note" - } - list = append(list, item) - } + if action == "*" { + continue + } + name := filepath.Base(f.Path) + item := msxItem{ + Label: name, + PlayerLabel: strings.TrimSuffix(name, filepath.Ext(name)), + Action: action + ":" + host + "/stream/" + url.PathEscape(name) + "?link=" + hash + "&index=" + fmt.Sprint(f.Id) + "&play", + } + if isViewed(viewed, f.Id) { + item.Tag = " " + } + if action == "audio" { + item.Icon = "msx-white-soft:music-note" + } + list = append(list, item) + } - if (len(list) == 0) { - c.JSON(200, msxData{ - Action: "error:No supported content found", - }) - return - } + if len(list) == 0 { + c.JSON(200, msxData{ + Action: "error:No supported content found", + }) + return + } - res := msxData{ - Headline: tor.Title, - Type: "list", - Template: gin.H{ - "type": "control", - "layout": "0,2,12,1", - "color": "msx-glass", - "icon": "msx-white-soft:movie", - "iconSize": "medium", - "badgeColor": "msx-yellow", - "tagColor": "msx-yellow", - }, - Items: list, - } + res := msxData{ + Headline: tor.Title, + Type: "list", + Template: gin.H{ + "type": "control", + "layout": "0,2,12,1", + "color": "msx-glass", + "icon": "msx-white-soft:movie", + "iconSize": "medium", + "badgeColor": "msx-yellow", + "tagColor": "msx-yellow", + }, + Items: list, + } - // If only one item start to play immediately but it not works - // if (len(list) == 1) { - // res.Action = "execute:" + list[0].Action - // } + // If only one item start to play immediately but it not works + // if (len(list) == 1) { + // res.Action = "execute:" + list[0].Action + // } - c.JSON(200, res) + c.JSON(200, res) } func isViewed(viewed []*sets.Viewed, id int) bool { - for _, v := range viewed { - if (v.FileIndex == id) { - return true - } - } - return false + for _, v := range viewed { + if v.FileIndex == id { + return true + } + } + return false }