You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
synctv/internal/rtmp/rtmp.go

52 lines
1.1 KiB
Go

package rtmp
import (
"errors"
"strings"
"time"
"github.com/golang-jwt/jwt/v5"
"github.com/synctv-org/synctv/internal/conf"
rtmps "github.com/zijiren233/livelib/server"
"github.com/zijiren233/stream"
)
var s *rtmps.Server
type RtmpClaims struct {
MovieID string `json:"m"`
jwt.RegisteredClaims
}
func AuthRtmpPublish(Authorization string) (movieID string, err error) {
t, err := jwt.ParseWithClaims(strings.TrimPrefix(Authorization, `Bearer `), &RtmpClaims{}, func(token *jwt.Token) (any, error) {
return stream.StringToBytes(conf.Conf.Jwt.Secret), nil
})
if err != nil {
return "", errors.New("auth failed")
}
claims, ok := t.Claims.(*RtmpClaims)
if !ok {
return "", errors.New("auth failed")
}
return claims.MovieID, nil
}
func NewRtmpAuthorization(movieID string) (string, error) {
claims := &RtmpClaims{
MovieID: movieID,
RegisteredClaims: jwt.RegisteredClaims{
NotBefore: jwt.NewNumericDate(time.Now()),
},
}
return jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString(stream.StringToBytes(conf.Conf.Jwt.Secret))
}
func Init(rs *rtmps.Server) {
s = rs
}
func RtmpServer() *rtmps.Server {
return s
}