123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- package v2
- import (
- "math"
- "strconv"
- v2pb "go-common/app/interface/live/app-interface/api/http/v2"
- "go-common/app/interface/live/app-interface/dao"
- xrf "go-common/app/service/live/xroom-feed/api"
- "go-common/library/sync/errgroup"
- "go-common/library/xstr"
- "context"
- "go-common/library/log"
- )
- const _appModuleType = 1
- // getRecPoolList
- func (s *IndexService) getRecPoolList(ctx context.Context, module int64, num int64, moduleExists []int64, otherExists []int64) (list map[int64]*xrf.RoomItem) {
- list = make(map[int64]*xrf.RoomItem)
- req := &xrf.RecPoolReq{
- ModuleType: module,
- PositionNum: num,
- ModuleExistRooms: xstr.JoinInts(moduleExists),
- OtherExistRooms: xstr.JoinInts(otherExists),
- From: "app-interface",
- }
- resp, ferr := s.xrfClient.RecPoolClient.GetList(ctx, req)
- if ferr != nil {
- log.Error("[rec_pool]GetList from xroom-feed err:%+v", ferr.Error())
- return
- }
- list = resp.List
- return
- }
- func (s *IndexService) getRecPoolAllPosition(ctx context.Context, moduleRoomIDs, otherRoomIDs []int64) (recPool map[int64]*v2pb.CommonRoomItem) {
- recPool = make(map[int64]*v2pb.CommonRoomItem)
- uids := make([]int64, 0)
- roomIds := make([]int64, 0)
- mapRoomIdToUid := make(map[int64]int64)
- roomItem := s.getRecPoolList(ctx, _appModuleType, 6, moduleRoomIDs, otherRoomIDs)
- if len(roomItem) <= 0 {
- log.Info("[getRecPoolAllPosition]getRecPoolList roomItem empty")
- return
- }
- for i, item := range roomItem {
- uids = append(uids, item.Uid)
- roomIds = append(roomIds, item.RoomId)
- mapRoomIdToUid[item.RoomId] = item.Uid
- recPool[i] = &v2pb.CommonRoomItem{
- Roomid: item.RoomId,
- Title: item.Title,
- Link: "/" + strconv.Itoa(int(item.RoomId)),
- AreaV2Id: item.AreaId,
- AreaV2Name: item.AreaName,
- AreaV2ParentId: item.ParentAreaId,
- AreaV2ParentName: item.ParentAreaName,
- Online: item.PopularityCount,
- Cover: s.getCover(item.Cover, item.Keyframe),
- RecType: item.RecType,
- AcceptQuality: []int64{2, 4},
- }
- }
- if len(recPool) <= 0 {
- return
- }
- extraInfo := s.getExtraDataForRoom(ctx, roomIds, uids, mapRoomIdToUid)
- for _, pool := range recPool {
- if _, ok := extraInfo[pool.Roomid]; ok {
- pool.Uname = extraInfo[pool.Roomid].UName
- pool.Face = extraInfo[pool.Roomid].Face
- pool.PendentRu = extraInfo[pool.Roomid].PendentRu
- pool.PendentRuPic = extraInfo[pool.Roomid].PendentRuPic
- pool.PendentRuColor = extraInfo[pool.Roomid].PendentRuColor
- }
- }
- return
- }
- func (s *IndexService) handleCommonRoomList(ctx context.Context, respMyIdol *v2pb.MMyIdol, respCommonRoomList []*v2pb.MRoomBlock, quality, build int64, platform string, device string) []*v2pb.MRoomBlock {
- moduleExistIds := make([]int64, 0)
- otherExistIds := make([]int64, 0)
- duplicateMap := make(map[int64]bool)
- for _, idol := range respMyIdol.List {
- otherExistIds = append(otherExistIds, idol.Roomid)
- duplicateMap[idol.Roomid] = true
- }
- for _, roomBlock := range respCommonRoomList {
- if roomBlock.ModuleInfo.Type == _recFormType || roomBlock.ModuleInfo.Type == _recSquareType {
- newRecRoomList := make([]*v2pb.CommonRoomItem, 0)
- for _, item := range roomBlock.List {
- if len(newRecRoomList) >= 24 {
- break
- }
- if _, ok := duplicateMap[item.Roomid]; !ok {
- newRecRoomList = append(newRecRoomList, item)
- moduleExistIds = append(moduleExistIds, item.Roomid)
- }
- }
- // 投放位
- if device != "pad" {
- recPool, recPoolRooms := s.fourTimeRecPoolForYumo(ctx, moduleExistIds, otherExistIds)
- log.Info("[handleCommonRoomList]投放位 recPool: %+v, moduleExistIds: %+v, otherExistIds:%+v", recPoolRooms, xstr.JoinInts(moduleExistIds), xstr.JoinInts(otherExistIds))
- duplicateRecMap := make(map[int64]bool)
- for _, id := range recPoolRooms {
- duplicateRecMap[id] = true
- }
- newRecFilterCommonList := make([]*v2pb.CommonRoomItem, 0)
- for _, room := range newRecRoomList {
- if room == nil {
- continue
- }
- if _, ok := duplicateRecMap[room.Roomid]; !ok {
- newRecFilterCommonList = append(newRecFilterCommonList, room)
- }
- }
- filterList := make([]*v2pb.CommonRoomItem, 0)
- for i := 0; i < 24; i++ {
- position := int64(i) + 1
- if item, ok := recPool[position]; ok {
- filterList = append(filterList, item)
- continue
- }
- if len(newRecFilterCommonList) <= 0 {
- continue
- }
- filterList = append(filterList, newRecFilterCommonList[0:1][0])
- newRecFilterCommonList = newRecFilterCommonList[1:]
- }
- roomBlock.List = filterList
- } else {
- roomBlock.List = newRecRoomList
- }
- }
- }
- // 拼playurl
- roomIds := make([]int64, 0)
- for _, commRoomBlock := range respCommonRoomList {
- for _, roomList := range commRoomBlock.List {
- roomIds = append(roomIds, roomList.Roomid)
- }
- }
- changeRoomListPlayURLMap := dao.BvcApi.GetPlayUrlMulti(ctx, roomIds, 0, quality, build, platform)
- for _, v := range respCommonRoomList {
- for _, vv := range v.List {
- if changeRoomListPlayURLMap[vv.Roomid] != nil {
- vv.AcceptQuality = changeRoomListPlayURLMap[vv.Roomid].AcceptQuality
- vv.CurrentQuality = changeRoomListPlayURLMap[vv.Roomid].CurrentQuality
- vv.PlayUrl = changeRoomListPlayURLMap[vv.Roomid].Url["h264"]
- vv.PlayUrlH265 = changeRoomListPlayURLMap[vv.Roomid].Url["h265"]
- }
- }
- }
- return respCommonRoomList
- }
- // 一次请求 变为四次请求xroom feed
- func (s *IndexService) fourTimeRecPoolForYumo(ctx context.Context, moduleExistIds []int64, otherExistIds []int64) (recPool map[int64]*v2pb.CommonRoomItem, recPoolRooms map[int64]int64) {
- recPool = make(map[int64]*v2pb.CommonRoomItem)
- recPoolRooms = make(map[int64]int64)
- pageSize := 6
- if len(moduleExistIds) < pageSize {
- return
- }
- page := int64(math.Floor(float64(len(moduleExistIds)) / float64(pageSize)))
- result := make([]map[int64]*v2pb.CommonRoomItem, page)
- wg := errgroup.Group{}
- var i int64
- for i = 1; i <= page; i++ {
- p := i - 1
- start := p * int64(pageSize)
- end := start + int64(pageSize)
- duplicateIds := moduleExistIds[start:end]
- wg.Go(func() (err error) {
- result[p] = s.getRecPoolAllPosition(ctx, duplicateIds, otherExistIds)
- return nil
- })
- }
- err := wg.Wait()
- if err != nil {
- log.Error("[fourTimeRecPoolForYumo]moduleExistIds: %+v, otherExistIds:%+v", xstr.JoinInts(moduleExistIds), xstr.JoinInts(otherExistIds))
- return
- }
- for page, recPoolMap := range result {
- for position, item := range recPoolMap {
- if item == nil {
- continue
- }
- p := position + int64(page*pageSize)
- recPool[p] = item
- recPoolRooms[p] = item.Roomid
- }
- }
- return
- }
|