package playletser import ( "fmt" "net/url" "strconv" "videoweb/app/service/upstream" "videoweb/pub/common/log" "github.com/gin-gonic/gin" ) const ( rankPath = "/api/app/playlet/rank" defaultRankPageSize = 30 // 排行榜 sortOrder:1-热播榜,2-新剧榜,3-追剧榜 rankSortHot = 1 rankSortNew = 2 rankSortBinge = 3 ) // RankQuery 排行榜查询参数。 type RankQuery struct { PageNum int PageSize int SortOrder int } // Normalize 校正分页与榜单类型。 func (q *RankQuery) Normalize() { if q.PageNum <= 0 { q.PageNum = 1 } if q.PageSize <= 0 { q.PageSize = defaultRankPageSize } if q.PageSize > 50 { q.PageSize = 50 } switch q.SortOrder { case rankSortNew, rankSortBinge: default: q.SortOrder = rankSortHot } } // FetchRank 分页查询短剧排行榜。 func FetchRank(c *gin.Context, q RankQuery) (*PlayletVideoResp, error) { q.Normalize() params := url.Values{} params.Set("pageNum", strconv.Itoa(q.PageNum)) params.Set("pageSize", strconv.Itoa(q.PageSize)) params.Set("sortOrder", strconv.Itoa(q.SortOrder)) var env APIEnvelope[PlayletVideoResp] if err := upstream.GetPublicJSON(c, rankPath+"?"+params.Encode(), &env); err != nil { return nil, err } if env.Code != 200 { return nil, fmt.Errorf("playlet rank code=%d msg=%s", env.Code, env.Msg) } return &env.Data, nil } // FetchRankOrEmpty 失败时返回空榜单。 func FetchRankOrEmpty(c *gin.Context, q RankQuery) *PlayletVideoResp { data, err := FetchRank(c, q) if err != nil { log.Error("fetch playlet rank failed", log.E(err)) return &PlayletVideoResp{PageNum: q.PageNum, PageSize: q.PageSize} } if data == nil { return &PlayletVideoResp{PageNum: q.PageNum, PageSize: q.PageSize} } data.SeoInfo.Normalize() return data }