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.
192 lines
5.2 KiB
192 lines
5.2 KiB
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 |
|
}
|
|
|