bilibili-backup/app/interface/main/app-intl/service/view/view.go
2019-04-22 02:59:20 +00:00

193 lines
5.2 KiB
Go

package view
import (
"context"
"time"
"go-common/app/interface/main/app-intl/model"
"go-common/app/interface/main/app-intl/model/view"
"go-common/app/service/main/archive/api"
"go-common/app/service/main/archive/model/archive"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/net/metadata"
"go-common/library/sync/errgroup"
"go-common/library/text/translate/chinese"
)
const (
// _descLen is.
_descLen = 250
// _avTypeAv is.
_avTypeAv = 1
// _businessLike is.
_businessLike = "archive"
)
// View all view data.
func (s *Service) View(c context.Context, mid, aid, movieID int64, plat int8, build int, ak, mobiApp, device, buvid, cdnIP, network, adExtra, from string, now time.Time, locale string) (v *view.View, err error) {
if v, err = s.ViewPage(c, mid, aid, movieID, plat, build, ak, mobiApp, device, cdnIP, true, now, locale); err != nil {
ip := metadata.String(c, metadata.RemoteIP)
if err == ecode.AccessDenied || err == ecode.NothingFound {
log.Warn("s.ViewPage() mid(%d) aid(%d) movieID(%d) plat(%d) ak(%s) ip(%s) cdn_ip(%s) error(%v)", mid, aid, movieID, plat, ak, ip, cdnIP, err)
} else {
log.Error("s.ViewPage() mid(%d) aid(%d) movieID(%d) plat(%d) ak(%s) ip(%s) cdn_ip(%s) error(%v)", mid, aid, movieID, plat, ak, ip, cdnIP, err)
}
return
}
isTW := model.TWLocale(locale)
g, ctx := errgroup.WithContext(c)
g.Go(func() (err error) {
v.VIPActive = s.vipActiveCache[view.VIPActiveView]
return
})
g.Go(func() (err error) {
s.initReqUser(ctx, v, mid, plat, build)
if v.AttrVal(archive.AttrBitIsPGC) != archive.AttrYes {
s.initContributions(ctx, v, isTW)
}
return
})
g.Go(func() (err error) {
s.initRelateCMTag(ctx, v, plat, build, mid, buvid, mobiApp, device, network, adExtra, from, now, isTW)
return
})
if v.AttrVal(archive.AttrBitIsPGC) != archive.AttrYes {
g.Go(func() (err error) {
s.initDM(ctx, v)
return
})
g.Go(func() (err error) {
s.initAudios(ctx, v)
return
})
if len([]rune(v.Desc)) > _descLen {
g.Go(func() (err error) {
if desc, _ := s.arcDao.Description(ctx, v.Aid); desc != "" {
v.Desc = desc
}
return
})
}
}
if err = g.Wait(); err != nil {
log.Error("%+v", err)
}
return
}
// ViewPage view page data.
func (s *Service) ViewPage(c context.Context, mid, aid, movieID int64, plat int8, build int, ak, mobiApp, device, cdnIP string, nMovie bool, now time.Time, locale string) (v *view.View, err error) {
if aid == 0 && movieID == 0 {
err = ecode.NothingFound
return
}
var (
vs *view.ViewStatic
vp *archive.View3
seasoninfo map[int64]int64
ok bool
)
if movieID != 0 {
if seasoninfo, err = s.banDao.SeasonidAid(c, movieID, now); err != nil {
log.Error("%+v", err)
err = ecode.NothingFound
return
}
if aid, ok = seasoninfo[movieID]; !ok || aid == 0 {
err = ecode.NothingFound
return
}
var a *api.Arc
if a, err = s.arcDao.Archive3(c, aid); err != nil {
log.Error("%+v", err)
err = ecode.NothingFound
return
}
if a == nil {
err = ecode.NothingFound
return
}
vs = &view.ViewStatic{Archive3: archive.BuildArchive3(a)}
s.prom.Incr("from_movieID")
} else {
if vp, err = s.arcDao.ViewCache(c, aid); err != nil {
log.Error("%+v", err)
}
if vp == nil || vp.Archive3 == nil || len(vp.Pages) == 0 || vp.AttrVal(archive.AttrBitIsMovie) == archive.AttrYes {
if vp, err = s.arcDao.View3(c, aid); err != nil {
log.Error("%+v", err)
err = ecode.NothingFound
return
}
}
if vp == nil || vp.Archive3 == nil || len(vp.Pages) == 0 {
err = ecode.NothingFound
return
}
vs = &view.ViewStatic{Archive3: vp.Archive3}
s.initPages(c, vs, vp.Pages)
s.prom.Incr("from_aid")
}
isTW := model.TWLocale(locale)
if isTW {
out := chinese.Converts(c, vs.Title, vs.Desc)
vs.Title = out[vs.Title]
vs.Desc = out[vs.Desc]
}
// TODO fuck chanpin
vs.Stat.DisLike = 0
if s.overseaCheck(vs.Archive3, plat) {
err = ecode.AreaLimit
return
}
// check region area limit
if err = s.areaLimit(c, plat, int16(vs.TypeID)); err != nil {
return
}
v = &view.View{ViewStatic: vs, DMSeg: 1, PlayerIcon: s.playerIcon}
if v.AttrVal(archive.AttrBitIsPGC) != archive.AttrYes {
// check access
if err = s.checkAceess(c, mid, v.Aid, int(v.State), int(v.Access), ak); err != nil {
// archive is ForbitFixed and Transcoding and StateForbitDistributing need analysis history body .
if v.State != archive.StateForbidFixed {
return
}
err = nil
}
if v.Access > 0 {
v.Stat.View = 0
}
}
g, ctx := errgroup.WithContext(c)
if mid != 0 {
g.Go(func() (err error) {
v.History, _ = s.arcDao.Progress(ctx, v.Aid, mid)
return
})
}
if v.AttrVal(archive.AttrBitIsPGC) == archive.AttrYes {
if v.AttrVal(archive.AttrBitIsMovie) != archive.AttrYes {
g.Go(func() error {
return s.initPGC(ctx, v, mid, build, mobiApp, device)
})
} else {
g.Go(func() error {
return s.initMovie(ctx, v, mid, build, mobiApp, device, nMovie)
})
}
} else {
g.Go(func() (err error) {
if err = s.initDownload(ctx, v, mid, cdnIP); err != nil {
ip := metadata.String(ctx, metadata.RemoteIP)
log.Error("aid(%d) mid(%d) ip(%s) cdn_ip(%s) error(%+v)", v.Aid, mid, ip, cdnIP, err)
}
return
})
}
if err = g.Wait(); err != nil {
log.Error("%+v", err)
}
return
}