216 lines
6.5 KiB
Go
216 lines
6.5 KiB
Go
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
|
|
}
|