diff --git a/go.mod b/go.mod index d10c848..5371f02 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/soheilhy/cmux v0.1.5 github.com/spf13/cobra v1.8.0 - github.com/synctv-org/vendors v0.1.1-0.20231204154145-d6bf737a7c0b + github.com/synctv-org/vendors v0.1.1-0.20231209122754-ebad9251fa7a github.com/ulule/limiter/v3 v3.11.2 github.com/zencoder/go-dash/v3 v3.0.3 github.com/zijiren233/gencontainer v0.0.0-20231209055719-473cab2b7931 diff --git a/go.sum b/go.sum index 1903e38..ce08cc0 100644 --- a/go.sum +++ b/go.sum @@ -350,6 +350,8 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/synctv-org/vendors v0.1.1-0.20231204154145-d6bf737a7c0b h1:QsHSl+bzDrY8oiPv/KcoBPjHa7R1VeyDNlChJrEHzus= github.com/synctv-org/vendors v0.1.1-0.20231204154145-d6bf737a7c0b/go.mod h1:DQHEXvrsnX9Ke6B0KVJ+w8uMgM/DZKNkvi6cJmRn+zk= +github.com/synctv-org/vendors v0.1.1-0.20231209122754-ebad9251fa7a h1:6X8PXLGHd41f1Fbr1HMxcceD+HQ4x/d9/FZL3XXc+Jk= +github.com/synctv-org/vendors v0.1.1-0.20231209122754-ebad9251fa7a/go.mod h1:Jo6+rczhFeZ2iLk8f89sVh8pdQygEUaUMZp3zmtHdy4= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= diff --git a/internal/model/movie.go b/internal/model/movie.go index 03de58e..7b7cf7c 100644 --- a/internal/model/movie.go +++ b/internal/model/movie.go @@ -52,16 +52,18 @@ type BilibiliVendorInfo struct { } func (b *BilibiliVendorInfo) Validate() error { - if b.Bvid == "" && b.Epid == 0 { - return fmt.Errorf("bvid and epid are empty") - } - - if b.Bvid != "" && b.Epid != 0 { - return fmt.Errorf("bvid and epid can't be set at the same time") - } - - if b.Bvid != "" && b.Cid == 0 { - return fmt.Errorf("cid is empty") + switch { + // 先判断epid是否为0来确定是否是pgc + case b.Epid != 0: + if b.Bvid == "" || b.Cid == 0 { + return fmt.Errorf("bvid or cid is empty") + } + case b.Bvid != "": + if b.Cid == 0 { + return fmt.Errorf("cid is empty") + } + default: + return fmt.Errorf("bvid or epid is empty") } return nil diff --git a/internal/op/movie.go b/internal/op/movie.go index ee355e8..fa87dc5 100644 --- a/internal/op/movie.go +++ b/internal/op/movie.go @@ -226,19 +226,7 @@ func (movie *Movie) Validate() error { func (movie *Movie) validateVendorMovie() error { switch movie.Movie.Base.VendorInfo.Vendor { case model.StreamingVendorBilibili: - err := movie.Movie.Base.VendorInfo.Bilibili.Validate() - if err != nil { - return err - } - if movie.Movie.Base.Headers == nil { - movie.Movie.Base.Headers = map[string]string{ - "Referer": "https://www.bilibili.com", - "User-Agent": utils.UA, - } - } else { - movie.Movie.Base.Headers["Referer"] = "https://www.bilibili.com" - movie.Movie.Base.Headers["User-Agent"] = utils.UA - } + return movie.Movie.Base.VendorInfo.Bilibili.Validate() case model.StreamingVendorAlist: diff --git a/server/handlers/movie.go b/server/handlers/movie.go index 71d4c3a..24286aa 100644 --- a/server/handlers/movie.go +++ b/server/handlers/movie.go @@ -33,6 +33,7 @@ import ( "github.com/zencoder/go-dash/v3/mpd" "github.com/zijiren233/livelib/protocol/hls" "github.com/zijiren233/livelib/protocol/httpflv" + "golang.org/x/exp/maps" ) func GetPageAndPageSize(ctx *gin.Context) (int, int, error) { @@ -680,11 +681,11 @@ func initBilibiliMPDCache(ctx context.Context, movie dbModel.Movie) func() (any, cli := vendor.BilibiliClient(movie.Base.VendorInfo.Backend) var m, hevcM *mpd.MPD biliInfo := movie.Base.VendorInfo.Bilibili - if biliInfo.Bvid != "" && biliInfo.Cid != 0 { - resp, err := cli.GetDashVideoURL(ctx, &bilibili.GetDashVideoURLReq{ + switch { + case biliInfo.Epid != 0: + resp, err := cli.GetDashPGCURL(ctx, &bilibili.GetDashPGCURLReq{ Cookies: utils.HttpCookieToMap(cookies), - Bvid: biliInfo.Bvid, - Cid: biliInfo.Cid, + Epid: biliInfo.Epid, }) if err != nil { return nil, err @@ -698,10 +699,11 @@ func initBilibiliMPDCache(ctx context.Context, movie dbModel.Movie) func() (any, return nil, err } - } else if biliInfo.Epid != 0 { - resp, err := cli.GetDashPGCURL(ctx, &bilibili.GetDashPGCURLReq{ + case biliInfo.Bvid != "": + resp, err := cli.GetDashVideoURL(ctx, &bilibili.GetDashVideoURLReq{ Cookies: utils.HttpCookieToMap(cookies), - Epid: biliInfo.Epid, + Bvid: biliInfo.Bvid, + Cid: biliInfo.Cid, }) if err != nil { return nil, err @@ -714,8 +716,7 @@ func initBilibiliMPDCache(ctx context.Context, movie dbModel.Movie) func() (any, if err != nil { return nil, err } - - } else { + default: return nil, errors.New("bvid and epid are empty") } m.BaseURL = append(m.BaseURL, fmt.Sprintf("/api/movie/proxy/%s/", movie.RoomID)) @@ -773,28 +774,33 @@ func initBilibiliShareCache(ctx context.Context, movie dbModel.Movie) func() (an cli := vendor.BilibiliClient(movie.Base.VendorInfo.Backend) var u string biliInfo := movie.Base.VendorInfo.Bilibili - if biliInfo.Bvid != "" { - resp, err := cli.GetVideoURL(ctx, &bilibili.GetVideoURLReq{ + switch { + case biliInfo.Epid != 0: + resp, err := cli.GetPGCURL(ctx, &bilibili.GetPGCURLReq{ Cookies: utils.HttpCookieToMap(cookies), - Bvid: biliInfo.Bvid, - Cid: biliInfo.Cid, + Epid: biliInfo.Epid, }) if err != nil { return nil, err } u = resp.Url - } else if biliInfo.Epid != 0 { - resp, err := cli.GetPGCURL(ctx, &bilibili.GetPGCURLReq{ + + case biliInfo.Bvid != "": + resp, err := cli.GetVideoURL(ctx, &bilibili.GetVideoURLReq{ Cookies: utils.HttpCookieToMap(cookies), - Epid: biliInfo.Epid, + Bvid: biliInfo.Bvid, + Cid: biliInfo.Cid, }) if err != nil { return nil, err } u = resp.Url - } else { + + default: return nil, errors.New("bvid and epid are empty") + } + return u, nil } } @@ -881,7 +887,17 @@ func proxyVendorMovie(ctx *gin.Context, movie *op.Movie) { ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorStringResp("stream id out of range")) return } - proxyURL(ctx, mpd.urls[streamId], movie.Movie.Base.Headers) + headers := maps.Clone(movie.Movie.Base.Headers) + if headers == nil { + headers = map[string]string{ + "Referer": "https://www.bilibili.com", + "User-Agent": utils.UA, + } + } else { + headers["Referer"] = "https://www.bilibili.com" + headers["User-Agent"] = utils.UA + } + proxyURL(ctx, mpd.urls[streamId], headers) return }