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.
190 lines
5.6 KiB
190 lines
5.6 KiB
package ugc |
|
|
|
import ( |
|
"fmt" |
|
|
|
"go-common/app/job/main/tv/dao/lic" |
|
model "go-common/app/job/main/tv/model/pgc" |
|
ugcmdl "go-common/app/job/main/tv/model/ugc" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_crEnd = "1970-01-01" // copyright end date |
|
_definition = "SD" |
|
) |
|
|
|
// syncVideoErr: it logs the error and postpone the videos for the next submit |
|
func (s *Service) syncVideoErr(funcName string, cids []int64, aid int64, err error) { |
|
s.dao.PpVideos(ctx, cids) |
|
errArcVideos("syncLic:"+funcName, aid, cids, err) |
|
} |
|
|
|
// syncLic: sync our arc data to License owner |
|
func (s *Service) syncLic(cAid int64, arc *ugcmdl.SimpleArc) (err error) { |
|
var ( |
|
skeleton = &ugcmdl.LicSke{} |
|
videoPces [][]*ugcmdl.SimpleVideo |
|
ps = s.c.UgcSync.Batch.SyncPS // sync page size |
|
licData *model.License |
|
xmlBody string |
|
errCall error |
|
) |
|
skeleton.Arc = arc |
|
if videoPces, err = s.dao.ParseVideos(ctx, cAid, ps); err != nil { |
|
log.Error("ParseVideos %d Error %v", cAid, err) |
|
return |
|
} |
|
if len(videoPces) == 0 { // no to audit cids |
|
return |
|
} |
|
for _, videos := range videoPces { |
|
skeleton.Videos = videos |
|
var cids = []int64{} |
|
for _, v := range videos { |
|
cids = append(cids, v.CID) |
|
} |
|
if licData, errCall = s.auditMsg(skeleton); errCall != nil { // build the license data and transform to xml |
|
s.syncVideoErr("AuditMsg ", cids, cAid, errCall) |
|
continue |
|
} |
|
xmlBody = lic.PrepareXML(licData) |
|
if _, errCall = s.licDao.CallRetry(ctx, s.c.Sync.API.AddURL, xmlBody); errCall != nil { // call api |
|
s.syncVideoErr("XmlCall ", cids, cAid, errCall) |
|
continue |
|
} |
|
if errCall = s.dao.FinishVideos(ctx, skeleton.Videos, cAid); errCall != nil { // update the arc & videos' submit status to finish |
|
s.syncVideoErr("FinishVideos ", cids, cAid, errCall) |
|
continue |
|
} |
|
infoArcVideos("syncLic", cAid, cids, "Succ Apply For Audit") |
|
} |
|
return |
|
} |
|
|
|
// auditMsg transforms a skeleton to license audit message struct for UGC |
|
func (s *Service) auditMsg(skeleton *ugcmdl.LicSke) (licData *model.License, err error) { |
|
var ( |
|
programSets []*model.PS |
|
programs []*model.Program |
|
sign = s.c.Sync.Sign |
|
) |
|
if len(skeleton.Videos) > 0 { |
|
if programs, err = s.videoProgram(skeleton.Arc.AID, skeleton.Videos); err != nil { |
|
log.Error("auditMsg videoProgram Aid %d, Err %v", skeleton.Arc.AID, err) |
|
return |
|
} |
|
} |
|
if programSets, err = s.arcPSet(skeleton.Arc, programs); err != nil { |
|
log.Error("arcPSet Error %v", err) |
|
return |
|
} |
|
licData = lic.BuildLic(sign, programSets, len(programs)) |
|
return |
|
} |
|
|
|
// videoProgram transforms the videos to license defined program models |
|
func (s *Service) videoProgram(aid int64, videos []*ugcmdl.SimpleVideo) (programs []*model.Program, err error) { |
|
var ( |
|
ugcPrefix = s.c.Sync.UGCPrefix |
|
deadCIDs = []int64{} |
|
arcValid bool |
|
) |
|
for _, v := range videos { |
|
playurl, hitDead, errCall := s.playurlDao.Playurl(ctx, int(v.CID)) |
|
if errCall != nil { |
|
log.Error("Playurl CID %d, Error %v", v.CID, errCall) |
|
continue |
|
} |
|
if hitDead { // hit playurl dead codes |
|
deadCIDs = append(deadCIDs, v.CID) |
|
continue |
|
} |
|
media := model.MakePMedia(ugcPrefix, playurl, v.CID) |
|
program := &model.Program{ |
|
ProgramID: fmt.Sprintf("%s%d", ugcPrefix, v.CID), |
|
ProgramName: v.Eptitle, |
|
ProgramLength: int(v.Duration), |
|
ProgramDesc: v.Description, |
|
PublishDate: _crEnd, |
|
Number: fmt.Sprintf("%d", v.IndexOrder), |
|
DefinitionType: "SD", |
|
ProgramMediaList: &model.PMList{ |
|
ProgramMedia: []*model.PMedia{ |
|
media, |
|
}, |
|
}, |
|
} |
|
programs = append(programs, program) |
|
} |
|
if len(deadCIDs) > 0 { // treat deadCIDs, delete them |
|
if arcValid, err = s.dao.DelVideoArc(ctx, &ugcmdl.DelVideos{ |
|
AID: aid, |
|
CIDs: deadCIDs, |
|
}); err != nil { |
|
log.Error("VideoProgram DelVideos Aid %d, Cids %v, Err %v", aid, deadCIDs, err) |
|
return |
|
} |
|
if !arcValid { |
|
log.Info("VideoProgram DelVideos Aid %d is empty, delete it also", aid) |
|
err = ecode.NothingFound |
|
return |
|
} |
|
if len(deadCIDs) == len(videos) { |
|
log.Info("VideoProgram Passed Videos Aid %d are dead, Cids %v", aid, deadCIDs) |
|
err = ecode.NothingFound |
|
return |
|
} |
|
log.Info("VideoProgram DelVideos Aid %d, Playurl DeadCids %v", aid, deadCIDs) |
|
} |
|
return |
|
} |
|
|
|
// arcPSet transforms an archive model to a license programSet model |
|
func (s *Service) arcPSet(arc *ugcmdl.SimpleArc, programs []*model.Program) (ps []*model.PS, err error) { |
|
var ( |
|
secondType string |
|
firstType string |
|
copyright = s.c.UgcSync.Cfg.Copyright |
|
upper *ugcmdl.Upper |
|
) |
|
// get second type name |
|
if tp, ok := s.arcTypes[arc.TypeID]; !ok { |
|
log.Error("For Aid %d, Can't find Second TypeID %d Name", arc.AID, arc.TypeID) |
|
} else { |
|
secondType = tp.Name |
|
} |
|
// get first type name |
|
firstType = s.getPTypeName(arc.TypeID) |
|
// build the programSet structure |
|
var program = &model.PS{ |
|
ProgramSetID: fmt.Sprintf("%s%d", s.c.Sync.UGCPrefix, arc.AID), |
|
ProgramSetName: arc.Title, |
|
ProgramSetClass: secondType, |
|
ProgramSetType: firstType, |
|
PublishDate: arc.Pubtime, |
|
Copyright: copyright, |
|
ProgramCount: int(arc.Videos), |
|
CREndData: _crEnd, |
|
DefinitionType: _definition, |
|
CpCode: s.c.Sync.LConf.CPCode, |
|
PayStatus: 0, |
|
ProgramSetDesc: arc.Content, |
|
ProgramSetPoster: arc.Cover, |
|
ProgramList: &model.ProgramList{ |
|
Program: programs, |
|
}, |
|
} |
|
// upper info |
|
if upper, err = s.upDao.LoadUpMeta(ctx, arc.MID); err != nil { // get upper meta info |
|
log.Error("modLic LoadUpMeta Aid %d, Mid %d, Err %v", arc.AID, arc.MID, err) |
|
err = nil |
|
} |
|
if upper != nil { |
|
program.Producer = upper.OriName |
|
program.Portrait = upper.OriFace |
|
} |
|
ps = append(ps, program) |
|
return |
|
}
|
|
|