You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
6.5 KiB
215 lines
6.5 KiB
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 |
|
}
|
|
|