diff --git a/internal/app/api/idl/bilibili_picture.go b/internal/app/api/idl/bilibili_picture.go index a43d404..8a1805d 100644 --- a/internal/app/api/idl/bilibili_picture.go +++ b/internal/app/api/idl/bilibili_picture.go @@ -89,7 +89,7 @@ type BilibiliPicturesRecommendResp struct { } type BilibiliPictureRandomResp struct { - BilibiliDynamicPicture + BilibiliRandomPicture DynamicURL string `json:"dynamic_url"` } type BilibiliDynamicDTO struct { @@ -97,14 +97,25 @@ type BilibiliDynamicDTO struct { Pictures BilibiliDynamicPictures `json:"pictures"` SentAt uint64 `json:"sent_at"` } - +type BilibiliRandomPictures []BilibiliRandomPicture +type BilibiliRandomPicture struct { + Height float64 `json:"img_height"` + Size float64 `json:"img_size"` + Width float64 `json:"img_width"` + ImgSrc string `json:"img_src"` + DynamicID uint64 `json:"dynamic_id"` + Tags []BilibiliRandomPictureTag `json:"tags"` +} +type BilibiliRandomPictureTag struct { + TagID uint64 `json:"tag_id"` + TagName string `json:"tag_name"` +} type BilibiliDynamicPictures []BilibiliDynamicPicture type BilibiliDynamicPicture struct { - Height float64 `json:"img_height"` - Size float64 `json:"img_size"` - Width float64 `json:"img_width"` - ImgSrc string `json:"img_src"` - DynamicID uint64 `json:"dynamic_id"` + Height float64 `json:"img_height"` + Size float64 `json:"img_size"` + Width float64 `json:"img_width"` + ImgSrc string `json:"img_src"` } type BilibiliDynamicTopicDetails []BilibiliDynamicTopicDetail diff --git a/internal/app/api/service/bilbil_picture.go b/internal/app/api/service/bilbil_picture.go index cb0b193..ff441ae 100644 --- a/internal/app/api/service/bilbil_picture.go +++ b/internal/app/api/service/bilbil_picture.go @@ -77,16 +77,26 @@ func (c *RandomPicsCache) flush() { c.log.Error("randomPicsCache flush error ", zap.Error(err), zap.Time("time", now), zap.Int("list", len(list))) return } - pictures := make(idl.BilibiliDynamicPictures, 0) + pictures := make(idl.BilibiliRandomPictures, 0) for i := range list { + tags := make([]idl.BilibiliRandomPictureTag, 0) + if list[i].TopicDetails != nil { + for _, v := range *list[i].TopicDetails { + tags = append(tags, idl.BilibiliRandomPictureTag{ + TagID: v.TopicID, + TagName: v.TopicName, + }) + } + } for j := range list[i].Pictures { pictures = append(pictures, - idl.BilibiliDynamicPicture{ + idl.BilibiliRandomPicture{ Height: list[i].Pictures[j].Height, Size: list[i].Pictures[j].Size, Width: list[i].Pictures[j].Width, ImgSrc: list[i].Pictures[j].ImgSrc, DynamicID: list[i].DynamicID, + Tags: tags, }) } } @@ -146,21 +156,21 @@ func (service *BilbilPicture) Recommend(ctx context.Context, req idl.BilibiliPic } func (service *BilbilPicture) Random(ctx context.Context) (*idl.BilibiliPictureRandomResp, error) { + now := time.Now() + rand.Seed(now.UnixNano()) if randomPicsCache.success { value, ok := randomPicsCache.syncMap.Load(overall) if ok { - pictures, ok := value.(idl.BilibiliDynamicPictures) + pictures, ok := value.(idl.BilibiliRandomPictures) if ok && len(pictures) != 0 { idx := rand.Intn(len(pictures)) resp := &idl.BilibiliPictureRandomResp{} - resp.BilibiliDynamicPicture = pictures[idx] + resp.BilibiliRandomPicture = pictures[idx] resp.DynamicURL = fmt.Sprintf(DynamicURL, pictures[idx].DynamicID) return resp, nil } } } - now := time.Now() - rand.Seed(now.UnixNano()) tx := service.db.WithContext(ctx) picRepository := repository.NewBilibiliPicture(tx) list, err := picRepository.Random(rand.Float64()) @@ -170,15 +180,32 @@ func (service *BilbilPicture) Random(ctx context.Context) (*idl.BilibiliPictureR if len(list) == 0 { return nil, errRandomPictureNotFound } - pictures := make(idl.BilibiliDynamicPictures, 0) + pictures := make(idl.BilibiliRandomPictures, 0) for i := range list { + tags := make([]idl.BilibiliRandomPictureTag, 0) + if list[i].TopicDetails != nil { + for _, v := range *list[i].TopicDetails { + tags = append(tags, idl.BilibiliRandomPictureTag{ + TagID: v.TopicID, + TagName: v.TopicName, + }) + } + } for j := range list[i].Pictures { - pictures = append(pictures, list[i].Pictures[j]) + pictures = append(pictures, + idl.BilibiliRandomPicture{ + Height: list[i].Pictures[j].Height, + Size: list[i].Pictures[j].Size, + Width: list[i].Pictures[j].Width, + ImgSrc: list[i].Pictures[j].ImgSrc, + DynamicID: list[i].DynamicID, + Tags: tags, + }) } } idx := rand.Intn(len(pictures)) resp := &idl.BilibiliPictureRandomResp{} - resp.BilibiliDynamicPicture = pictures[idx] + resp.BilibiliRandomPicture = pictures[idx] resp.DynamicURL = fmt.Sprintf(DynamicURL, pictures[idx].DynamicID) return resp, nil } diff --git a/internal/repository/bilibili_picture.go b/internal/repository/bilibili_picture.go index 0575bfc..5c77ac8 100644 --- a/internal/repository/bilibili_picture.go +++ b/internal/repository/bilibili_picture.go @@ -104,7 +104,7 @@ func (impl *BilibiliPictureMysqlImpl) Random(rand float64) (list []*idl.Bilibili return nil, err } offset := math.Floor((pair.MaxId - pair.MinId) * rand) - err = conn.Where("id >= ?", uint64(pair.MinId+offset)).Select("dynamic_id,pictures").Limit(5).Find(&list).Error + err = conn.Where("id >= ?", uint64(pair.MinId+offset)).Select("dynamic_id,pictures,topic_details").Limit(5).Find(&list).Error if err != nil { return nil, err }