2019-04-22 02:59:20 +00:00

436 lines
12 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}