You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
435 lines
12 KiB
435 lines
12 KiB
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 |
|
}
|
|
|