diff --git a/server/web/api/play.go b/server/web/api/play.go new file mode 100644 index 0000000..8540c65 --- /dev/null +++ b/server/web/api/play.go @@ -0,0 +1,73 @@ +package api + +import ( + "errors" + "net/http" + "strconv" + + "github.com/gin-gonic/gin" + + "server/torr" + "server/torr/state" + "server/web/api/utils" +) + +func play(c *gin.Context) { + hash := c.Param("hash") + indexStr := c.Param("id") + notAuth := c.GetBool("not_auth") + + if hash == "" || indexStr == "" { + c.AbortWithError(http.StatusNotFound, errors.New("link should not be empty")) + return + } + + spec, err := utils.ParseLink(hash) + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + + tor := torr.GetTorrent(spec.InfoHash.HexString()) + if tor == nil && notAuth { + c.Header("WWW-Authenticate", "Basic realm=Authorization Required") + c.AbortWithStatus(http.StatusUnauthorized) + return + } + + if tor == nil { + c.AbortWithError(http.StatusInternalServerError, errors.New("error get torrent")) + return + } + + if tor.Stat == state.TorrentInDB { + tor, err = torr.AddTorrent(spec, tor.Title, tor.Poster, tor.Data) + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + } + + if !tor.GotInfo() { + c.AbortWithError(http.StatusInternalServerError, errors.New("timeout connection torrent")) + return + } + + // find file + index := -1 + if len(tor.Files()) == 1 { + index = 1 + } else { + ind, err := strconv.Atoi(indexStr) + if err == nil { + index = ind + } + } + if index == -1 { // if file index not set and play file exec + c.AbortWithError(http.StatusBadRequest, errors.New("\"index\" is wrong")) + return + } + + tor.Stream(index, c.Request, c.Writer) + return +}