go-common/app/interface/main/tv/dao/search/wild.go
2019-04-22 18:49:16 +08:00

214 lines
7.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package search
import (
"context"
"go-common/library/sync/errgroup"
"go-common/library/xstr"
"net/http"
"net/url"
"strconv"
mdlSearch "go-common/app/interface/main/tv/model/search"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
)
// UserSearch search user .
func (d *Dao) UserSearch(ctx context.Context, arg *mdlSearch.UserSearch) (user []*mdlSearch.User, err error) {
var (
params = url.Values{}
req *http.Request
ip = metadata.String(ctx, metadata.RemoteIP)
)
params.Set("platform", arg.Platform)
params.Set("mobi_app", arg.MobiAPP)
params.Set("build", arg.Build)
params.Set("keyword", arg.Keyword)
params.Set("page", strconv.Itoa(arg.Page))
params.Set("pagesize", strconv.Itoa(arg.Pagesize))
params.Set("userid", strconv.FormatInt(arg.MID, 10))
params.Set("order", arg.Order)
params.Set("main_ver", "v3") // 支持赛事搜索
params.Set("search_type", "bili_user")
params.Set("user_type", strconv.Itoa(arg.UserType)) // 用户类型
params.Set("highlight", strconv.Itoa(arg.Highlight))
params.Set("order_sort", strconv.Itoa(arg.OrderSort))
params.Set("from_source", arg.FromSource)
params.Set("bili_user_vl", strconv.Itoa(d.cfgWild.BiliUserVl))
// new request
if req, err = d.client.NewRequest("GET", d.userSearch, ip, params); err != nil {
log.Error("[wild.UserSearch] d.client.NewRequest url(%s) error(%v)", d.userSearch, err)
return
}
req.Header.Set("Buvid", arg.Buvid)
var res struct {
Code int `json:"code"`
SeID string `json:"seid"`
Pages int `json:"numPages"`
List []*mdlSearch.User `json:"result"`
}
if err = d.client.Do(ctx, req, &res); err != nil {
log.Error("[wild.UserSearch] d.client.Do url(%s) error(%v)", d.userSearch, err)
return
}
if res.Code != ecode.OK.Code() {
err = ecode.Int(res.Code)
log.Error("[wild.UserSearch] url(%s) error(%v)", d.userSearch, err)
return
}
user = res.List
return
}
// SearchAllWild wild search all .
func (d *Dao) SearchAllWild(ctx context.Context, arg *mdlSearch.UserSearch) (user *mdlSearch.Search, err error) {
var (
req *http.Request
ip = metadata.String(ctx, metadata.RemoteIP)
)
params := url.Values{}
user = &mdlSearch.Search{}
params.Set("build", arg.Build)
params.Set("keyword", arg.Keyword)
params.Set("main_ver", "v3")
params.Set("mobi_app", arg.MobiAPP)
params.Set("device", arg.Device)
params.Set("userid", strconv.FormatInt(arg.MID, 10))
params.Set("tids", strconv.Itoa(arg.RID))
params.Set("highlight", strconv.Itoa(arg.Highlight))
params.Set("page", strconv.Itoa(arg.Page))
params.Set("pagesize", strconv.Itoa(arg.Pagesize))
params.Set("bili_user_num", strconv.Itoa(d.cfgWild.BiliUserNum))
params.Set("bili_user_vl", strconv.Itoa(d.cfgWild.BiliUserVl))
params.Set("user_num", strconv.Itoa(d.cfgWild.UserNum))
params.Set("user_video_limit", strconv.Itoa(d.cfgWild.UserVideoLimit))
params.Set("platform", arg.Platform)
// params.Set("duration", strconv.Itoa(arg.Duration)) // 视频时长筛选默认是0
params.Set("order", arg.Order)
params.Set("search_type", "all")
params.Set("from_source", arg.FromSource)
params.Set("media_bangumi_num", strconv.Itoa(arg.SeasonNum))
params.Set("movie_num", strconv.Itoa(arg.MovieNum))
params.Set("is_new_pgc", "1") // 新番剧
params.Set("media_ft_num", strconv.Itoa(arg.MovieNum))
// params.Set("flow_need", "1") // 混排
// params.Set("query_rec_need", "1") // 搜索结果推荐
// new request
if req, err = d.client.NewRequest("GET", d.userSearch, ip, params); err != nil {
log.Error("d.client.NewRequest URI(%s) error(%v)", d.userSearch, err)
return
}
req.Header.Set("Buvid", arg.Buvid)
if err = d.client.Do(ctx, req, user); err != nil {
log.Error("[wild.SearchAllWild] d.client.Do() url(%s) error(%v)", d.userSearch, err)
}
return
}
// card bangumi card .
func (d *Dao) cardInfo(c context.Context, mid int64, sids []int64) (s map[string]*mdlSearch.Card, err error) {
ip := metadata.String(c, metadata.RemoteIP)
params := url.Values{}
params.Set("mid", strconv.FormatInt(mid, 10))
params.Set("season_ids", xstr.JoinInts(sids))
var res struct {
Code int `json:"code"`
Result map[string]*mdlSearch.Card `json:"result"`
}
if err = d.client.Get(c, d.card, ip, params, &res); err != nil {
log.Error("d.client.NewRequest url(%s) error(%v)", d.resultURL, err)
return
}
if res.Code != ecode.OK.Code() {
err = ecode.Int(res.Code)
log.Error("[wild] cardInfo error(%v)", err)
return
}
s = res.Result
return
}
// PgcSearch .
func (d *Dao) PgcSearch(c context.Context, arg *mdlSearch.UserSearch) (st *mdlSearch.TypeSearch, err error) {
var (
req *http.Request
ip = metadata.String(c, metadata.RemoteIP)
seasonIDs []int64
bangumis map[string]*mdlSearch.Card
items1, items2 []*mdlSearch.Item
)
params := url.Values{}
params.Set("build", arg.Build)
params.Set("keyword", arg.Keyword)
params.Set("main_ver", "v3")
params.Set("mobi_app", arg.MobiAPP)
params.Set("device", arg.Device)
params.Set("userid", strconv.FormatInt(arg.MID, 10))
params.Set("highlight", strconv.Itoa(arg.Highlight))
params.Set("page", strconv.Itoa(arg.Page))
params.Set("pagesize", strconv.Itoa(arg.Pagesize))
params.Set("platform", arg.Platform)
params.Set("order", arg.Order)
params.Set("search_type", "all")
params.Set("from_source", arg.FromSource)
params.Set("media_bangumi_num", strconv.Itoa(arg.SeasonNum))
params.Set("media_ft_num", strconv.Itoa(arg.MovieNum))
params.Set("is_new_pgc", "1")
if req, err = d.client.NewRequest("GET", d.userSearch, ip, params); err != nil {
log.Error("d.client.NewRequest url(%s) error(%v)", d.userSearch, err)
return
}
req.Header.Set("Buvid", arg.Buvid)
res := &mdlSearch.Search{}
if err = d.client.Do(c, req, res); err != nil {
log.Error("[wild.PgcSearch] d.client.Do url(%s) error(%v)", d.userSearch, err)
return
}
if res.Code != ecode.OK.Code() {
err = ecode.Int(res.Code)
log.Error("[wild.PgcSearch] code(%d) error(%v)", res.Code, err)
return
}
for _, v := range res.Result.MediaBangumi {
seasonIDs = append(seasonIDs, v.SeasonID)
}
for _, v := range res.Result.MediaFt {
seasonIDs = append(seasonIDs, v.SeasonID)
}
if len(seasonIDs) > 0 {
if bangumis, err = d.cardInfo(c, arg.MID, seasonIDs); err != nil {
log.Error("[wild.PgcSearch] MovieByType2 %+v", err)
return
}
}
if len(bangumis) > 0 {
group := new(errgroup.Group)
group.Go(func() error {
items1 = make([]*mdlSearch.Item, 0, len(res.Result.MediaBangumi))
for _, v := range res.Result.MediaBangumi {
si := &mdlSearch.Item{}
si.FromMedia(v, "", mdlSearch.GotoMovie, bangumis)
items1 = append(items1, si)
}
return nil
})
group.Go(func() error {
items2 = make([]*mdlSearch.Item, 0, len(res.Result.MediaFt))
for _, v := range res.Result.MediaFt {
si := &mdlSearch.Item{}
si.FromMedia(v, "", mdlSearch.GotoMovie, bangumis)
items2 = append(items2, si)
}
return nil
})
if err = group.Wait(); err != nil {
log.Error("[wild.PgcSearch] group.Wait() is error(%v)", err)
return
}
}
items1 = append(items1, items2...)
st = &mdlSearch.TypeSearch{TrackID: res.Trackid, Pages: res.Page, Total: res.Total, Items: items1}
return
}