go-common/app/interface/main/tv/service/search/wild.go

243 lines
5.8 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package search
import (
"context"
mdlSearch "go-common/app/interface/main/tv/model/search"
v1 "go-common/app/service/main/archive/api"
"go-common/library/log"
"go-common/library/sync/errgroup"
)
const (
_showHide = 0
season = "番剧"
upper = "用户"
movie = "影视"
_searchType = "all"
_mobiAPP = "app"
_bangumiType = 1
_biliUserType = 2
_filmType = 3
_mediaBangumiType = 7
_mediaFtType = 8
)
// UserSearch search user .
func (s *Service) UserSearch(ctx context.Context, arg *mdlSearch.UserSearch) (res []*mdlSearch.User, err error) {
if res, err = s.dao.UserSearch(ctx, arg); err != nil {
log.Error("s.dao.UserSearch error(%v)", err)
}
if len(res) == 0 {
res = make([]*mdlSearch.User, 0)
}
return
}
// SearchAll search all .
func (s *Service) SearchAll(ctx context.Context, arg *mdlSearch.UserSearch) (res *mdlSearch.ResultAll, err error) {
var (
user = &mdlSearch.Search{}
avm map[int64]*v1.Arc
avids []int64
items []*mdlSearch.Item
wildCfg = s.conf.Wild.WildSearch
)
arg.SeasonNum = wildCfg.SeasonNum
arg.MovieNum = wildCfg.MovieNum
arg.SearchType = _searchType
arg.MobiAPP = _mobiAPP
if user, err = s.dao.SearchAllWild(ctx, arg); err != nil {
log.Error(" s.dao.SearchAllWild error(%v)", err)
}
res = &mdlSearch.ResultAll{}
if user == nil {
return
}
res.Trackid = user.Trackid
res.Page = user.Page
res.Attribute = user.Attribute
nis := make([]*mdlSearch.NavInfo, 0, 4)
// season
if user.PageInfo.Bangumi != nil {
var nav = &mdlSearch.NavInfo{
Name: season,
Total: user.PageInfo.Bangumi.NumResult,
Pages: user.PageInfo.Bangumi.Pages,
Type: _bangumiType,
}
if user.PageInfo.Bangumi.NumResult > wildCfg.SeasonNum {
nav.Show = wildCfg.SeasonMore
} else {
nav.Show = _showHide
}
nis = append(nis, nav)
}
// media season
if user.PageInfo.MediaBangumi != nil {
var nav = &mdlSearch.NavInfo{
Name: season,
Total: user.PageInfo.MediaBangumi.NumResult,
Pages: user.PageInfo.MediaBangumi.Pages,
Type: _mediaBangumiType,
}
if user.PageInfo.MediaBangumi.NumResult > wildCfg.SeasonNum {
nav.Show = wildCfg.SeasonMore
} else {
nav.Show = _showHide
}
nis = append(nis, nav)
}
// upper
if user.PageInfo.BiliUser != nil {
var nav = &mdlSearch.NavInfo{
Name: upper,
Total: user.PageInfo.BiliUser.NumResult,
Pages: user.PageInfo.BiliUser.Pages,
Type: _biliUserType,
}
nis = append(nis, nav)
}
// movie
if user.PageInfo.Film != nil {
var nav = &mdlSearch.NavInfo{
Name: movie,
Total: user.PageInfo.Film.NumResult,
Pages: user.PageInfo.Film.Pages,
Type: _filmType,
}
if user.PageInfo.Movie != nil && user.PageInfo.Movie.NumResult > wildCfg.MovieNum {
nav.Show = wildCfg.MovieMore
} else {
nav.Show = _showHide
}
nis = append(nis, nav)
}
// media movie
if user.PageInfo.MediaFt != nil {
var nav = &mdlSearch.NavInfo{
Name: movie,
Total: user.PageInfo.MediaFt.NumResult,
Pages: user.PageInfo.MediaFt.Pages,
Type: _mediaFtType,
}
if user.PageInfo.MediaFt.NumResult > wildCfg.MovieNum {
nav.Show = wildCfg.MovieMore
} else {
nav.Show = _showHide
}
nis = append(nis, nav)
}
res.NavInfo = nis
// archive
for _, v := range user.Result.Video {
avids = append(avids, v.ID)
}
for _, v := range user.Result.Movie {
if v.Type == "movie" {
avids = append(avids, v.Aid)
}
}
if arg.Page == 1 {
for _, v := range user.Result.User {
for _, vr := range v.Res {
avids = append(avids, vr.Aid)
}
}
for _, v := range user.Result.BiliUser {
for _, vr := range v.Res {
avids = append(avids, vr.Aid)
}
}
}
group := new(errgroup.Group)
if len(avids) != 0 {
group.Go(func() (err error) {
if avm, err = s.arcDao.Archives(ctx, avids); err != nil {
log.Error("%+v", err)
err = nil
}
return
})
}
if err = group.Wait(); err != nil {
return
}
// item add data .
var promptBangumi, promptFt string
// season
bangumi := user.Result.Bangumi
items = make([]*mdlSearch.Item, 0, len(bangumi))
for _, v := range bangumi {
si := &mdlSearch.Item{}
si.FromSeason(v, mdlSearch.GotoBangumiWeb)
items = append(items, si)
}
if len(res.Items.Season) > 5 && arg.RID == 0 {
res.Items.Season = res.Items.Season[:5]
res.Items.Season = items
} else {
res.Items.Season = items
}
// movie
movie := user.Result.Movie
items = make([]*mdlSearch.Item, 0, len(movie))
for _, v := range movie {
si := &mdlSearch.Item{}
si.FromMovie(v, avm)
items = append(items, si)
}
res.Items.Movie = items
// season2
mb := user.Result.MediaBangumi
// movie2
mf := user.Result.MediaFt
items = make([]*mdlSearch.Item, 0, len(mb)+len(mf))
for _, v := range mb {
si := &mdlSearch.Item{}
si.FromMedia(v, promptBangumi, mdlSearch.GotoBangumi, nil)
items = append(items, si)
}
for _, v := range mf {
si := &mdlSearch.Item{}
si.FromMedia(v, promptFt, mdlSearch.GotoMovie, nil)
si.Goto = mdlSearch.GotoAv
items = append(items, si)
}
if len(res.Items.Season2) > 5 && arg.RID == 0 {
res.Items.Season2 = res.Items.Season2[:5]
res.Items.Season2 = items
} else {
res.Items.Season2 = items
}
items = make([]*mdlSearch.Item, 0, len(user.Result.Video))
for _, v := range user.Result.Video {
si := &mdlSearch.Item{}
si.FromVideo(v, avm[v.ID])
items = append(items, si)
}
res.Items.Archive = items
return
}
// PgcSearch search .
func (s *Service) PgcSearch(ctx context.Context, arg *mdlSearch.UserSearch) (res *mdlSearch.TypeSearch, err error) {
var (
wildCfg = s.conf.Wild.WildSearch
)
arg.SeasonNum = wildCfg.SeasonNum
arg.MovieNum = wildCfg.MovieNum
arg.SearchType = _searchType
arg.MobiAPP = _mobiAPP
if res, err = s.dao.PgcSearch(ctx, arg); err != nil {
log.Error("[wild.PgcSearch] s.dao.PgcSearch error(%v)", err)
return
}
if len(res.Items) <= 0 {
res.Items = make([]*mdlSearch.Item, 0)
}
return
}