@@ -0,0 +1,244 @@
|
||||
package mediaser
|
||||
|
||||
import (
|
||||
"91porn-server/app/appg"
|
||||
"91porn-server/app/service/mediatagser"
|
||||
"91porn-server/common"
|
||||
"91porn-server/common/constant/redisconst"
|
||||
"91porn-server/common/timeutil/timerange"
|
||||
"91porn-server/models/s/statrecordmod"
|
||||
"91porn-server/models/v/mediamod"
|
||||
"91porn-server/models/v/mediatagmod"
|
||||
"91porn-server/models/v/usermod"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
)
|
||||
|
||||
func buildDedupTagsAndDetails(tagIDs []primitive.ObjectID, tagMap map[primitive.ObjectID]*mediatagmod.MediaTag) ([]primitive.ObjectID, []mediamod.TagDetail) {
|
||||
if len(tagIDs) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
seen := make(map[string]struct{}, len(tagIDs))
|
||||
uniqueTagIDs := make([]primitive.ObjectID, 0, len(tagIDs))
|
||||
tagDetails := make([]mediamod.TagDetail, 0, len(tagIDs))
|
||||
for _, id := range tagIDs {
|
||||
tag, ok := tagMap[id]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
name := strings.TrimSpace(tag.Name)
|
||||
if _, exists := seen[name]; exists {
|
||||
continue
|
||||
}
|
||||
seen[name] = struct{}{}
|
||||
uniqueTagIDs = append(uniqueTagIDs, tag.ID)
|
||||
tagDetails = append(tagDetails, mediamod.TagDetail{
|
||||
Id: tag.ID,
|
||||
Name: tag.Name,
|
||||
})
|
||||
}
|
||||
return uniqueTagIDs, tagDetails
|
||||
}
|
||||
|
||||
func FillMedias(medias []*mediamod.Media, uid uint64, needDefaultContent bool, dramaCard ...bool) []*mediamod.AppMediaBase {
|
||||
if len(medias) == 0 {
|
||||
return nil
|
||||
}
|
||||
tagIDs := make([]primitive.ObjectID, 0)
|
||||
var (
|
||||
mIds []primitive.ObjectID
|
||||
mStatus map[primitive.ObjectID]mediamod.MediaStatus
|
||||
hasDrama bool
|
||||
hasDramaCard bool
|
||||
)
|
||||
|
||||
for i := range medias {
|
||||
if medias[i] == nil {
|
||||
continue
|
||||
}
|
||||
mIds = append(mIds, medias[i].ID)
|
||||
tagIDs = append(tagIDs, medias[i].Tags...)
|
||||
if medias[i].MediaType == mediamod.MediaTypeDrama {
|
||||
hasDrama = true
|
||||
}
|
||||
}
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(1)
|
||||
common.Go(func() {
|
||||
defer wg.Done()
|
||||
mStatus = GetUserStatus(uid, mIds)
|
||||
})
|
||||
if hasDrama {
|
||||
if len(dramaCard) > 0 {
|
||||
hasDramaCard = dramaCard[0]
|
||||
} else {
|
||||
wg.Add(1)
|
||||
common.Go(func() {
|
||||
defer wg.Done()
|
||||
user, err := usermod.FindUserByUID(uid)
|
||||
hasDramaCard = err == nil && user != nil && user.DramaExpire.After(time.Now())
|
||||
})
|
||||
}
|
||||
}
|
||||
wg.Wait()
|
||||
var infos []*mediamod.AppMediaBase
|
||||
tagMap := mediatagser.GetTagsByIDs2Map(tagIDs)
|
||||
for i := range medias {
|
||||
if medias[i] == nil {
|
||||
continue
|
||||
}
|
||||
mid := ""
|
||||
if !medias[i].MID.IsZero() {
|
||||
mid = medias[i].MID.Hex()
|
||||
}
|
||||
temp := mediamod.AppMediaBase{
|
||||
ID: medias[i].ID,
|
||||
SortCode: medias[i].SortCode,
|
||||
Status: medias[i].Status,
|
||||
Title: medias[i].Title,
|
||||
HorizontalCover: medias[i].HorizontalCover,
|
||||
VerticalCover: medias[i].VerticalCover,
|
||||
Tags: make([]primitive.ObjectID, 0),
|
||||
TagDetails: make([]mediamod.TagDetail, 0),
|
||||
Summary: medias[i].Summary,
|
||||
TotalEpisode: medias[i].TotalEpisode,
|
||||
CurrentEpisode: medias[i].CurrentEpisode,
|
||||
FreeEpisode: medias[i].FreeEpisode,
|
||||
MediaType: medias[i].MediaType,
|
||||
MediaSubType: medias[i].MediaSubType,
|
||||
Kind: medias[i].Kind,
|
||||
Price: medias[i].Price,
|
||||
ContentsPrice: medias[i].ContentsPrice,
|
||||
Direction: medias[i].Direction,
|
||||
UpdateStatus: medias[i].UpdateStatus,
|
||||
Permission: medias[i].Permission,
|
||||
PermissionIconHide: medias[i].PermissionIconHide,
|
||||
Style: medias[i].Style,
|
||||
FreeTime: medias[i].FreeTime,
|
||||
CountPurchases: medias[i].CountPurchases,
|
||||
CountBrowse: medias[i].CountBrowse,
|
||||
CountCollect: medias[i].CountCollect,
|
||||
CountLike: medias[i].CountLike,
|
||||
CountDisLike: medias[i].CountDisLike,
|
||||
CountView: medias[i].CountView,
|
||||
CountShare: medias[i].CountShare,
|
||||
HasFollow: medias[i].HasFollow,
|
||||
MediaStatus: mStatus[medias[i].ID],
|
||||
CountComment: medias[i].CountComment,
|
||||
Number: medias[i].Number,
|
||||
CreatedAt: medias[i].CreatedAt,
|
||||
UpdateTime: medias[i].UpdateTime,
|
||||
LatestPublishedAt: medias[i].LatestPublishedAt,
|
||||
MID: mid,
|
||||
ModuleName: medias[i].ModuleName,
|
||||
SectionName: medias[i].SectionName,
|
||||
SID: medias[i].SID,
|
||||
SectionSort: medias[i].SectionSort,
|
||||
LsjId: medias[i].LsjId,
|
||||
}
|
||||
if medias[i].MediaType == mediamod.MediaTypeDrama {
|
||||
temp.HasDramaCard = hasDramaCard
|
||||
}
|
||||
if temp.MediaStatus.HasCollected {
|
||||
temp.CountCollect = temp.CountCollect + 1 // 避免缓存详情的情况,收藏完成之后数字没有任何变化
|
||||
}
|
||||
if needDefaultContent {
|
||||
temp.DefaultContent = medias[i].DefaultContent
|
||||
}
|
||||
if temp.DefaultContent.Cover == "" && len(temp.DefaultContent.UrlSet) > 0 {
|
||||
temp.DefaultContent.Cover = temp.DefaultContent.UrlSet[0]
|
||||
}
|
||||
if strings.TrimSpace(temp.DefaultContent.Name) == "" {
|
||||
temp.DefaultContent.Name = "第一集"
|
||||
}
|
||||
temp.Tags, temp.TagDetails = buildDedupTagsAndDetails(medias[i].Tags, tagMap)
|
||||
|
||||
infos = append(infos, &temp)
|
||||
}
|
||||
return infos
|
||||
}
|
||||
|
||||
func FillNotStatusMedias(medias []*mediamod.Media, needDefaultContent bool) []*mediamod.AppMediaBase {
|
||||
if len(medias) == 0 {
|
||||
return []*mediamod.AppMediaBase{}
|
||||
}
|
||||
tagIDs := make([]primitive.ObjectID, 0)
|
||||
var (
|
||||
mIds []primitive.ObjectID
|
||||
)
|
||||
|
||||
for i := range medias {
|
||||
mIds = append(mIds, medias[i].ID)
|
||||
if medias[i] != nil {
|
||||
tagIDs = append(tagIDs, medias[i].Tags...)
|
||||
}
|
||||
}
|
||||
|
||||
infos := []*mediamod.AppMediaBase{}
|
||||
tagMap := mediatagser.GetTagsByIDs2Map(tagIDs)
|
||||
for i := range medias {
|
||||
if medias[i] == nil {
|
||||
continue
|
||||
}
|
||||
temp := mediamod.AppMediaBase{
|
||||
ID: medias[i].ID,
|
||||
Title: medias[i].Title,
|
||||
HorizontalCover: medias[i].HorizontalCover,
|
||||
VerticalCover: medias[i].VerticalCover,
|
||||
Tags: make([]primitive.ObjectID, 0),
|
||||
TagDetails: make([]mediamod.TagDetail, 0),
|
||||
Summary: medias[i].Summary,
|
||||
TotalEpisode: medias[i].TotalEpisode,
|
||||
CurrentEpisode: medias[i].CurrentEpisode,
|
||||
FreeEpisode: medias[i].FreeEpisode,
|
||||
MediaType: medias[i].MediaType,
|
||||
MediaSubType: medias[i].MediaSubType,
|
||||
Kind: medias[i].Kind,
|
||||
Price: medias[i].Price,
|
||||
ContentsPrice: medias[i].ContentsPrice,
|
||||
Direction: medias[i].Direction,
|
||||
UpdateStatus: medias[i].UpdateStatus,
|
||||
Permission: medias[i].Permission,
|
||||
CountPurchases: medias[i].CountPurchases,
|
||||
CountBrowse: medias[i].CountBrowse,
|
||||
CountCollect: medias[i].CountCollect,
|
||||
CountLike: medias[i].CountLike,
|
||||
HasFollow: medias[i].HasFollow,
|
||||
CountComment: medias[i].CountComment,
|
||||
Number: medias[i].Number,
|
||||
CreatedAt: medias[i].CreatedAt,
|
||||
UpdateTime: medias[i].UpdateTime,
|
||||
LatestPublishedAt: medias[i].LatestPublishedAt,
|
||||
}
|
||||
if temp.MediaStatus.HasCollected {
|
||||
temp.CountCollect = temp.CountCollect + 1 // 避免缓存详情的情况,收藏完成之后数字没有任何变化
|
||||
}
|
||||
if needDefaultContent {
|
||||
temp.DefaultContent = medias[i].DefaultContent
|
||||
}
|
||||
if temp.DefaultContent.Cover == "" && len(temp.DefaultContent.UrlSet) > 0 {
|
||||
temp.DefaultContent.Cover = temp.DefaultContent.UrlSet[0]
|
||||
}
|
||||
if strings.TrimSpace(temp.DefaultContent.Name) == "" {
|
||||
temp.DefaultContent.Name = "第一集"
|
||||
}
|
||||
temp.Tags, temp.TagDetails = buildDedupTagsAndDetails(medias[i].Tags, tagMap)
|
||||
|
||||
infos = append(infos, &temp)
|
||||
}
|
||||
return infos
|
||||
}
|
||||
|
||||
// IncrCountBrowse 增加播放量
|
||||
func IncrCountBrowse(mediaId primitive.ObjectID) {
|
||||
now := time.Now()
|
||||
recentMinute := timerange.RecentMinute(now, statrecordmod.FiveMinuteScale)
|
||||
key := redisconst.AcgBrowseCountListKey(recentMinute.Unix())
|
||||
if err := appg.Redis.RPush(key, mediaId.Hex()); err != nil {
|
||||
return
|
||||
}
|
||||
_, _ = appg.Redis.ExpireKey(key, time.Minute*20)
|
||||
}
|
||||
Reference in New Issue
Block a user