123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- package pgc
- import (
- "context"
- "time"
- "go-common/app/interface/main/tv/model"
- "go-common/library/ecode"
- "go-common/library/log"
- )
- // snAuth picks the season's auth status and validate it
- func (s *Service) snAuth(sid int64) (msg string, err error) {
- var season *model.SnAuth
- if season, err = s.cmsDao.SnAuth(ctx, sid); err != nil {
- log.Error("snVerify Sid %d, Err %v", sid, err)
- err = ecode.NothingFound
- return
- }
- if !season.CanPlay() {
- err = ecode.CopyrightLimit
- _, msg = s.cmsDao.SnErrMsg(season) // season auth failure msg
- }
- return
- }
- func (s *Service) snDecor(core *model.SnDetailCore) {
- if snCMS, err := s.cmsDao.LoadSnCMS(ctx, core.SeasonID); err == nil {
- core.CmsInterv(snCMS)
- } else {
- log.Warn("snDecor LoadSnCMS %d, err %v", core.SeasonID, err)
- }
- core.StyleLabel = s.styleLabel[core.SeasonID]
- }
- // epAuthDecor checks epids status, hide auditing episodes
- func (s *Service) epAuthDecor(epids []int64) (res map[int64]*model.EpDecor, msg string, err error) {
- var (
- epsMetaMap map[int64]*model.EpCMS
- epsAuthMap map[int64]*model.EpAuth
- )
- res = make(map[int64]*model.EpDecor, len(epids))
- if epsAuthMap, err = s.cmsDao.LoadEpsAuthMap(ctx, epids); err != nil {
- log.Warn("FullIntervs LoadEpsAuthMap epids %v, err %v", epids, err)
- return
- }
- if epsMetaMap, err = s.cmsDao.LoadEpsCMS(ctx, epids); err != nil {
- log.Warn("FullIntervs LoadEpsCMS epids %v, err %v", epids, err)
- return
- }
- for _, v := range epids {
- if epAuth, ok := epsAuthMap[v]; ok {
- if epAuth.CanPlay() { // we hide not passed episodes
- decor := &model.EpDecor{
- Watermark: epAuth.Whitelist(),
- }
- if epMeta, okMeta := epsMetaMap[v]; okMeta { // ep intervention
- decor.EpCMS = epMeta
- }
- res[v] = decor
- }
- }
- }
- if len(res) == 0 { // return err
- err = ecode.CopyrightLimit
- msg = s.conf.Cfg.AuthMsg.PGCOffline
- log.Warn("Epids %v, After filter empty", epids)
- }
- return
- }
- // SnDetail validates the season is authorized to play and involve the intervention
- func (s *Service) SnDetail(c context.Context, param *model.MediaParam) (detail *model.SeasonDetail, msg string, err error) {
- var (
- sid = param.SeasonID
- epids []int64
- decors map[int64]*model.EpDecor
- cfg = s.conf.Cfg.VipMark
- )
- if msg, err = s.snAuth(sid); err != nil {
- return
- }
- if detail, err = s.dao.Media(ctx, param); err != nil { // pgc media api
- log.Error("DAO MediaDetail Sid %d, Error (%v)", sid, err)
- return
- }
- // filter auditing eps, and do ep intervention and watermark logic
- for _, v := range detail.Episodes {
- if cfg.V1HideChargeable { // before vip version goes online, we still hide the chargeable episodes
- if v.EpisodeStatus != cfg.EpFree {
- continue
- }
- }
- epids = append(epids, v.EPID)
- }
- if decors, msg, err = s.epAuthDecor(epids); err != nil {
- return
- }
- offAuditing := make([]*model.Episode, 0, len(decors))
- for _, v := range detail.Episodes {
- if decor, ok := decors[v.EPID]; ok {
- if decor.EpCMS != nil {
- v.CmsInterv(decor.EpCMS)
- }
- v.WaterMark = decor.Watermark
- offAuditing = append(offAuditing, v)
- }
- }
- detail.Episodes = offAuditing
- s.snDecor(&detail.SnDetailCore)
- return
- }
- // SnDetailV2 validates the season is authorized to play and involve the intervention
- func (s *Service) SnDetailV2(c context.Context, param *model.MediaParam) (detail *model.SnDetailV2, msg string, err error) {
- var (
- sid = param.SeasonID
- epids []int64
- decors map[int64]*model.EpDecor
- cmarkCfg = s.conf.Cfg.VipMark
- )
- if msg, err = s.snAuth(sid); err != nil {
- return
- }
- if detail, err = s.dao.MediaV2(ctx, param); err != nil || detail == nil { // pgc media api v2
- log.Error("DAO MediaDetail Sid %d, Error (%v)", sid, err)
- return
- }
- detail.TypeTrans()
- if len(detail.Section) > 0 { // pgc media api v2 logic, prevues are in the sections, we need to pick them up and re-insert into the episodes list
- for _, v := range detail.Section {
- detail.Episodes = append(detail.Episodes, v.Episodes...)
- }
- }
- for _, v := range detail.Episodes {
- epids = append(epids, v.ID)
- }
- if decors, msg, err = s.epAuthDecor(epids); err != nil {
- return
- }
- offAuditing := make([]*model.EpisodeV2, 0, len(decors))
- for _, v := range detail.Episodes {
- if decor, ok := decors[v.ID]; ok {
- if decor.EpCMS != nil {
- v.CmsInterv(decor.EpCMS)
- }
- v.WaterMark = decor.Watermark
- if v.Status != cmarkCfg.EpFree { // if ep is not free, put the corner mark
- v.CornerMark = &(*cmarkCfg.EP)
- }
- offAuditing = append(offAuditing, v)
- }
- }
- detail.Episodes = offAuditing
- s.snDecor(&detail.SnDetailCore)
- return
- }
- // EpControl validates the ep is authorized to play and involve the intervention
- func (s *Service) EpControl(c context.Context, epid int64) (sid int64, msg string, err error) {
- var ep *model.EpAuth
- if ep, err = s.cmsDao.EpAuth(c, epid); err != nil {
- log.Error("LoadEP Epid %d Error(%v)", epid, err)
- err = ecode.NothingFound
- return
- }
- if !ep.CanPlay() {
- err = ecode.CopyrightLimit
- _, msg = s.cmsDao.EpErrMsg(ep) // ep auth failure msg
- return
- }
- sid = ep.SeasonID
- return
- }
- func (s *Service) upStyleCache() {
- for {
- res, err := s.dao.GetLabelCache(context.Background())
- if err != nil {
- log.Error("s.dao.GetLabelCache upStyleCache error(%s)", err)
- time.Sleep(5 * time.Second)
- continue
- }
- if len(res) > 0 {
- s.styleLabel = res
- }
- time.Sleep(time.Duration(s.conf.Style.LabelSpan))
- }
- }
- func (s *Service) styleCache() {
- res, err := s.dao.GetLabelCache(context.Background())
- if err != nil {
- log.Error("s.dao.GetLabelCache error(%v)", err)
- panic(err)
- }
- s.styleLabel = res
- }
|