436 lines
12 KiB
Go
436 lines
12 KiB
Go
|
package favorite
|
|||
|
|
|||
|
import (
|
|||
|
"context"
|
|||
|
|
|||
|
"go-common/app/interface/main/app-interface/model"
|
|||
|
"go-common/app/interface/main/app-interface/model/favorite"
|
|||
|
fav "go-common/app/service/main/favorite/api"
|
|||
|
"go-common/library/log"
|
|||
|
"go-common/library/sync/errgroup"
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
_av = "av" //视频(ipad没有播单还是视频)
|
|||
|
_playlist = "playlist" // 播单
|
|||
|
_bangumi = "bangumi" // 追番
|
|||
|
_cinema = "cinema" // 追剧
|
|||
|
_topic = "topic" // 话题
|
|||
|
_article = "article" // 专栏
|
|||
|
_menu = "menu" // 歌单
|
|||
|
_pgcMenu = "pgc_menu" // 专辑
|
|||
|
_clips = "clips" // 小视频
|
|||
|
_albums = "albums" // 相簿
|
|||
|
_product = "product" // 商品
|
|||
|
_ticket = "ticket" // 展演
|
|||
|
_favorite = "favorite"
|
|||
|
)
|
|||
|
|
|||
|
var tabMap = map[string]*favorite.TabItem{
|
|||
|
_av: {Name: "视频", Uri: "bilibili://main/favorite/video", Tab: _favorite},
|
|||
|
_playlist: {Name: "播单", Uri: "bilibili://main/favorite/playlist", Tab: _favorite},
|
|||
|
_bangumi: {Name: "追番", Uri: "bilibili://pgc/favorite/bangumi", Tab: _bangumi},
|
|||
|
_cinema: {Name: "追剧", Uri: "bilibili://pgc/favorite/cinema", Tab: _cinema},
|
|||
|
_topic: {Name: "话题", Uri: "bilibili://main/favorite/topic", Tab: _topic},
|
|||
|
_article: {Name: "专栏", Uri: "bilibili://column/favorite/article", Tab: _article},
|
|||
|
_menu: {Name: "歌单", Uri: "bilibili://music/favorite/menu", Tab: _menu},
|
|||
|
_pgcMenu: {Name: "专辑", Uri: "bilibili://music/favorite/album", Tab: _pgcMenu},
|
|||
|
_clips: {Name: "小视频", Uri: "bilibili://clip/favorite", Tab: _clips},
|
|||
|
_albums: {Name: "相簿", Uri: "bilibili://pictureshow/favorite", Tab: _albums},
|
|||
|
_product: {Name: "商品", Uri: "bilibili://mall/favorite/goods", Tab: _product},
|
|||
|
_ticket: {Name: "展演", Uri: "bilibili://mall/favorite/ticket", Tab: _ticket},
|
|||
|
}
|
|||
|
var tabArr = []string{_av, _playlist, _bangumi, _cinema, _topic, _article, _menu, _pgcMenu, _clips, _albums, _product, _ticket}
|
|||
|
|
|||
|
// Folder get my favorite.
|
|||
|
func (s *Service) Folder(c context.Context, accessKey, actionKey, device, mobiApp, platform string, build int, aid, vmid, mid int64) (rs *favorite.MyFavorite, err error) {
|
|||
|
var pn, ps int = 1, 5
|
|||
|
rs = &favorite.MyFavorite{
|
|||
|
Tab: &favorite.Tab{
|
|||
|
Fav: true,
|
|||
|
},
|
|||
|
}
|
|||
|
g, ctx := errgroup.WithContext(c)
|
|||
|
g.Go(func() (err error) {
|
|||
|
var (
|
|||
|
mediaList bool
|
|||
|
folders []*favorite.Folder
|
|||
|
)
|
|||
|
plat := model.Plat(mobiApp, device)
|
|||
|
// 双端版本号限制,符合此条件显示为“默认收藏夹”:
|
|||
|
// iPhone <5.36.1(8300) 或iPhone>5.36.1(8300)
|
|||
|
// Android <5360001或Android>5361000
|
|||
|
// 双端版本号限制,符合此条件显示为“默认播单”:
|
|||
|
// iPhone=5.36.1(8300)
|
|||
|
// 5360001 <=Android <=5361000
|
|||
|
if (plat == model.PlatIPhone && build == 8300) || (plat == model.PlatAndroid && build >= 5360001 && build <= 5361000) {
|
|||
|
mediaList = true
|
|||
|
}
|
|||
|
if folders, err = s.favDao.Folders(ctx, mid, vmid, mobiApp, build, mediaList); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
return
|
|||
|
}
|
|||
|
if len(folders) != 0 {
|
|||
|
rs.Favorite = &favorite.FavList{
|
|||
|
Count: len(folders),
|
|||
|
Items: make([]*favorite.FavItem, 0, len(folders)),
|
|||
|
}
|
|||
|
for _, v := range folders {
|
|||
|
fi := &favorite.FavItem{}
|
|||
|
fi.FromFav(v)
|
|||
|
rs.Favorite.Items = append(rs.Favorite.Items, fi)
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
g.Go(func() (err error) {
|
|||
|
var topic *fav.UserFolderReply
|
|||
|
if topic, err = s.topicDao.UserFolder(ctx, mid, 4); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
if topic != nil && topic.Res != nil && topic.Res.Count > 0 {
|
|||
|
rs.Tab.Topic = true
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
g.Go(func() error {
|
|||
|
article := s.Article(ctx, mid, pn, ps)
|
|||
|
if article != nil && article.Count > 0 {
|
|||
|
rs.Tab.Article = true
|
|||
|
}
|
|||
|
return nil
|
|||
|
})
|
|||
|
g.Go(func() error {
|
|||
|
clips := s.Clips(ctx, mid, accessKey, actionKey, device, mobiApp, platform, build, pn, ps)
|
|||
|
if clips != nil && clips.PageInfo != nil && clips.Count > 0 {
|
|||
|
rs.Tab.Clips = true
|
|||
|
}
|
|||
|
return nil
|
|||
|
})
|
|||
|
g.Go(func() error {
|
|||
|
albums := s.Albums(ctx, mid, accessKey, actionKey, device, mobiApp, platform, build, pn, ps)
|
|||
|
if albums != nil && albums.PageInfo != nil && albums.Count > 0 {
|
|||
|
rs.Tab.Albums = true
|
|||
|
}
|
|||
|
return nil
|
|||
|
})
|
|||
|
g.Go(func() error {
|
|||
|
specil := s.Specil(ctx, accessKey, actionKey, device, mobiApp, platform, build, pn, ps)
|
|||
|
if specil != nil && specil.Count > 0 {
|
|||
|
rs.Tab.Specil = true
|
|||
|
}
|
|||
|
return nil
|
|||
|
})
|
|||
|
g.Go(func() (err error) {
|
|||
|
var has bool
|
|||
|
if has, err = s.bangumiDao.HasFollows(ctx, mid); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
rs.Tab.Cinema = has
|
|||
|
return
|
|||
|
})
|
|||
|
g.Go(func() (err error) {
|
|||
|
fav, err := s.audioDao.Fav(ctx, mid)
|
|||
|
if err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
if fav != nil {
|
|||
|
rs.Tab.Menu = fav.Menu
|
|||
|
rs.Tab.PGCMenu = fav.PGCMenu
|
|||
|
rs.Tab.Audios = fav.Song
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
g.Go(func() (err error) {
|
|||
|
var ticket int32
|
|||
|
if ticket, err = s.ticketDao.FavCount(ctx, mid); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
if ticket > 0 {
|
|||
|
rs.Tab.Ticket = true
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
g.Go(func() (err error) {
|
|||
|
var product int32
|
|||
|
if product, err = s.mallDao.FavCount(ctx, mid); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
if product > 0 {
|
|||
|
rs.Tab.Product = true
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
if err = g.Wait(); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (s *Service) FolderVideo(c context.Context, accessKey, actionKey, device, mobiApp, platform, keyword, order string, build, tid, pn, ps int, mid, fid, vmid int64) (folder *favorite.FavideoList) {
|
|||
|
video, err := s.favDao.FolderVideo(c, accessKey, actionKey, device, mobiApp, platform, keyword, order, build, tid, pn, ps, mid, fid, vmid)
|
|||
|
if err != nil {
|
|||
|
folder = &favorite.FavideoList{Items: []*favorite.FavideoItem{}}
|
|||
|
log.Error("%+v", err)
|
|||
|
return
|
|||
|
}
|
|||
|
folder = &favorite.FavideoList{
|
|||
|
Count: video.Total,
|
|||
|
Items: make([]*favorite.FavideoItem, 0, len(video.Archives)),
|
|||
|
}
|
|||
|
if video != nil {
|
|||
|
for _, v := range video.Archives {
|
|||
|
fi := &favorite.FavideoItem{}
|
|||
|
fi.FromFavideo(v)
|
|||
|
folder.Items = append(folder.Items, fi)
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (s *Service) Topic(c context.Context, accessKey, actionKey, device, mobiApp, platform string, build, ps, pn int, mid int64) (topic *favorite.TopicList) {
|
|||
|
topics, err := s.topicDao.Topic(c, accessKey, actionKey, device, mobiApp, platform, build, ps, pn, mid)
|
|||
|
if err != nil {
|
|||
|
topic = &favorite.TopicList{Items: []*favorite.TopicItem{}}
|
|||
|
log.Error("%+v", err)
|
|||
|
return
|
|||
|
}
|
|||
|
topic = &favorite.TopicList{
|
|||
|
Count: topics.Total,
|
|||
|
Items: make([]*favorite.TopicItem, 0, len(topics.Lists)),
|
|||
|
}
|
|||
|
if topics != nil {
|
|||
|
for _, v := range topics.Lists {
|
|||
|
fi := &favorite.TopicItem{}
|
|||
|
fi.FromTopic(v)
|
|||
|
topic.Items = append(topic.Items, fi)
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (s *Service) Article(c context.Context, mid int64, pn, ps int) (article *favorite.ArticleList) {
|
|||
|
articleTmp, err := s.artDao.Favorites(c, mid, pn, ps)
|
|||
|
if err != nil {
|
|||
|
article = &favorite.ArticleList{Items: []*favorite.ArticleItem{}}
|
|||
|
log.Error("%+v", err)
|
|||
|
return
|
|||
|
}
|
|||
|
article = &favorite.ArticleList{
|
|||
|
Count: len(articleTmp),
|
|||
|
Items: make([]*favorite.ArticleItem, 0, len(articleTmp)),
|
|||
|
}
|
|||
|
if len(articleTmp) != 0 {
|
|||
|
for _, v := range articleTmp {
|
|||
|
fi := &favorite.ArticleItem{}
|
|||
|
fi.FromArticle(v)
|
|||
|
article.Items = append(article.Items, fi)
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// Clips
|
|||
|
func (s *Service) Clips(c context.Context, mid int64, accessKey, actionKey, device, mobiApp, platform string, build, pn, ps int) (clips *favorite.ClipsList) {
|
|||
|
clipsTmp, err := s.bplusDao.FavClips(c, mid, accessKey, actionKey, device, mobiApp, platform, build, pn, ps)
|
|||
|
if err != nil {
|
|||
|
clips = &favorite.ClipsList{Items: []*favorite.ClipsItem{}}
|
|||
|
log.Error("%+v", err)
|
|||
|
return
|
|||
|
}
|
|||
|
clips = &favorite.ClipsList{
|
|||
|
PageInfo: clipsTmp.PageInfo,
|
|||
|
Items: make([]*favorite.ClipsItem, 0, len(clipsTmp.List)),
|
|||
|
}
|
|||
|
if clipsTmp != nil {
|
|||
|
for _, v := range clipsTmp.List {
|
|||
|
fi := &favorite.ClipsItem{}
|
|||
|
fi.FromClips(v)
|
|||
|
clips.Items = append(clips.Items, fi)
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (s *Service) Albums(c context.Context, mid int64, accessKey, actionKey, device, mobiApp, platform string, build, pn, ps int) (albums *favorite.AlbumsList) {
|
|||
|
albumsTmp, err := s.bplusDao.FavAlbums(c, mid, accessKey, actionKey, device, mobiApp, platform, build, pn, ps)
|
|||
|
if err != nil {
|
|||
|
albums = &favorite.AlbumsList{Items: []*favorite.AlbumItem{}}
|
|||
|
log.Error("%+v", err)
|
|||
|
return
|
|||
|
}
|
|||
|
albums = &favorite.AlbumsList{
|
|||
|
PageInfo: albumsTmp.PageInfo,
|
|||
|
Items: make([]*favorite.AlbumItem, 0, len(albumsTmp.List)),
|
|||
|
}
|
|||
|
if albumsTmp != nil {
|
|||
|
for _, v := range albumsTmp.List {
|
|||
|
fi := &favorite.AlbumItem{}
|
|||
|
fi.FromAlbum(v)
|
|||
|
albums.Items = append(albums.Items, fi)
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (s *Service) Specil(c context.Context, accessKey, actionKey, device, mobiApp, platform string, build, pn, ps int) (specil *favorite.SpList) {
|
|||
|
specilTmp, err := s.spDao.Specil(c, accessKey, actionKey, device, mobiApp, platform, build, pn, ps)
|
|||
|
if err != nil {
|
|||
|
specil = &favorite.SpList{Items: []*favorite.SpItem{}}
|
|||
|
log.Error("%+v", err)
|
|||
|
return
|
|||
|
}
|
|||
|
specil = &favorite.SpList{
|
|||
|
Count: len(specilTmp.Items),
|
|||
|
Items: make([]*favorite.SpItem, 0, len(specilTmp.Items)),
|
|||
|
}
|
|||
|
if specilTmp != nil {
|
|||
|
for _, v := range specilTmp.Items {
|
|||
|
fi := &favorite.SpItem{}
|
|||
|
fi.FromSp(v)
|
|||
|
specil.Items = append(specil.Items, fi)
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func (s *Service) Audio(c context.Context, accessKey string, mid int64, pn, ps int) (audio *favorite.AudioList) {
|
|||
|
audioTmp, err := s.audioDao.FavAudio(c, accessKey, mid, pn, ps)
|
|||
|
if err != nil {
|
|||
|
audio = &favorite.AudioList{Items: []*favorite.AudioItem{}}
|
|||
|
log.Error("%+v", err)
|
|||
|
return
|
|||
|
}
|
|||
|
audio = &favorite.AudioList{
|
|||
|
Count: len(audioTmp),
|
|||
|
Items: make([]*favorite.AudioItem, 0, len(audioTmp)),
|
|||
|
}
|
|||
|
for _, v := range audioTmp {
|
|||
|
fi := &favorite.AudioItem{}
|
|||
|
fi.FromAudio(v)
|
|||
|
audio.Items = append(audio.Items, fi)
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
// Tab fav tab.
|
|||
|
func (s *Service) Tab(c context.Context, accessKey, actionKey, device, mobiApp, platform, filtered string, build int, mid int64) (tab []*favorite.TabItem, err error) {
|
|||
|
var (
|
|||
|
pn, ps = 1, 5
|
|||
|
tabDisplay = []string{_playlist}
|
|||
|
)
|
|||
|
plat := model.Plat(mobiApp, device)
|
|||
|
if model.IsIPad(plat) {
|
|||
|
tabDisplay = []string{_av}
|
|||
|
}
|
|||
|
g, ctx := errgroup.WithContext(c)
|
|||
|
g.Go(func() (err error) {
|
|||
|
var bangumiFav, cinemaFav int
|
|||
|
if bangumiFav, cinemaFav, err = s.bangumiDao.FavDisplay(ctx, mid); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
if bangumiFav == 1 {
|
|||
|
tabDisplay = append(tabDisplay, _bangumi)
|
|||
|
}
|
|||
|
if cinemaFav == 1 {
|
|||
|
tabDisplay = append(tabDisplay, _cinema)
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
if !model.IsIPad(plat) {
|
|||
|
if filtered != "1" {
|
|||
|
g.Go(func() (err error) {
|
|||
|
var topic *fav.UserFolderReply
|
|||
|
if topic, err = s.topicDao.UserFolder(ctx, mid, 4); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
if topic != nil && topic.Res != nil && topic.Res.Count > 0 {
|
|||
|
tabDisplay = append(tabDisplay, _topic)
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
}
|
|||
|
g.Go(func() error {
|
|||
|
article := s.Article(ctx, mid, pn, ps)
|
|||
|
if article != nil && article.Count > 0 {
|
|||
|
tabDisplay = append(tabDisplay, _article)
|
|||
|
}
|
|||
|
return nil
|
|||
|
})
|
|||
|
g.Go(func() error {
|
|||
|
clips := s.Clips(ctx, mid, accessKey, actionKey, device, mobiApp, platform, build, pn, ps)
|
|||
|
if clips != nil && clips.PageInfo != nil && clips.Count > 0 {
|
|||
|
tabDisplay = append(tabDisplay, _clips)
|
|||
|
}
|
|||
|
return nil
|
|||
|
})
|
|||
|
g.Go(func() error {
|
|||
|
albums := s.Albums(ctx, mid, accessKey, actionKey, device, mobiApp, platform, build, pn, ps)
|
|||
|
if albums != nil && albums.PageInfo != nil && albums.Count > 0 {
|
|||
|
tabDisplay = append(tabDisplay, _albums)
|
|||
|
}
|
|||
|
return nil
|
|||
|
})
|
|||
|
g.Go(func() (err error) {
|
|||
|
fav, err := s.audioDao.Fav(ctx, mid)
|
|||
|
if err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
if fav != nil {
|
|||
|
tabDisplay = append(tabDisplay, _menu)
|
|||
|
tabDisplay = append(tabDisplay, _pgcMenu)
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
g.Go(func() (err error) {
|
|||
|
var ticket int32
|
|||
|
if ticket, err = s.ticketDao.FavCount(ctx, mid); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
if ticket > 0 {
|
|||
|
tabDisplay = append(tabDisplay, _ticket)
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
g.Go(func() (err error) {
|
|||
|
var product int32
|
|||
|
if product, err = s.mallDao.FavCount(ctx, mid); err != nil {
|
|||
|
log.Error("%+v", err)
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
if product > 0 {
|
|||
|
tabDisplay = append(tabDisplay, _product)
|
|||
|
}
|
|||
|
return
|
|||
|
})
|
|||
|
}
|
|||
|
g.Wait()
|
|||
|
for _, t := range tabArr {
|
|||
|
for _, dt := range tabDisplay {
|
|||
|
if t == dt {
|
|||
|
tab = append(tab, tabMap[t])
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
return
|
|||
|
}
|