123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- package service
- import (
- "bytes"
- "database/sql"
- "encoding/csv"
- "fmt"
- "time"
- "go-common/app/admin/main/tv/model"
- "go-common/library/log"
- bm "go-common/library/net/http/blademaster"
- "github.com/siddontang/go-mysql/mysql"
- )
- //VideoList is used for getting PGC video from DB
- func (s *Service) VideoList(c *bm.Context, param *model.VideoListParam) (pager *model.VideoListPager, err error) {
- var (
- order string
- total int
- videos []*model.VideoListQuery
- )
- selectStr := []string{
- "ugc_video.id",
- "ugc_video.aid",
- "ugc_video.cid",
- "ugc_video.eptitle",
- "ugc_video.valid",
- "ugc_video.mtime",
- "ugc_video.index_order",
- "ugc_archive.title",
- "ugc_archive.typeid",
- }
- //只筛选出未删除 且审核过的视频
- w := map[string]interface{}{"deleted": 0, "result": 1}
- db := s.DB.Model(&model.VideoListQuery{}).Where(w)
- db = db.Select(selectStr).
- Where("ugc_archive.deleted = ?", 0).
- Where("ugc_archive.result = ?", 1).
- Joins("LEFT JOIN ugc_archive ON ugc_archive.aid = ugc_video.aid")
- if param.CID != "" {
- db = db.Where("ugc_video.aid = ?", param.CID)
- }
- if param.VID != "" {
- db = db.Where("`cid` = ?", param.VID)
- }
- if param.Typeid > 0 {
- db = db.Where("typeid = ?", param.Typeid)
- }
- if param.Pid > 0 {
- db = db.Where("typeid in (?)", s.arcPTids[param.Pid])
- }
- if param.Valid != "" {
- db = db.Where("ugc_video.valid = ?", param.Valid)
- }
- if param.Order == 2 {
- order = "ugc_video.mtime DESC"
- } else {
- order = "ugc_video.mtime ASC"
- }
- if err = db.Order(order).Offset((param.Pn - 1) * param.Ps).Limit(param.Ps).Find(&videos).Error; err != nil {
- return
- }
- if err = db.Count(&total).Error; err != nil {
- return
- }
- //get parent id
- for k, v := range videos {
- videos[k].PTypeID = s.GetArchivePid(v.TypeID)
- }
- pager = &model.VideoListPager{
- Items: videos,
- Page: &model.Page{
- Num: param.Pn,
- Size: param.Ps,
- Total: int(total),
- },
- }
- return
- }
- //VideoOnline is used for online PGC video
- func (s *Service) VideoOnline(ids []int64) (err error) {
- w := map[string]interface{}{"deleted": 0, "result": 1}
- tx := s.DB.Begin()
- for _, v := range ids {
- video := model.Video{}
- if errDB := tx.Model(&model.Video{}).Where(w).Where("id=?", v).First(&video).Error; errDB != nil {
- err = fmt.Errorf("找不到id为%v的数据", v)
- tx.Rollback()
- return
- }
- if errDB := tx.Model(&model.Video{}).Where("id=?", v).
- Update("valid", 1).Error; errDB != nil {
- err = errDB
- tx.Rollback()
- return
- }
- }
- tx.Commit()
- return
- }
- //VideoHidden is used for hidden UGC video
- func (s *Service) VideoHidden(ids []int64) (err error) {
- w := map[string]interface{}{"deleted": 0, "result": 1}
- tx := s.DB.Begin()
- for _, v := range ids {
- video := model.Video{}
- if errDB := tx.Model(&model.Video{}).Where(w).Where("id=?", v).First(&video).Error; errDB != nil {
- err = fmt.Errorf("找不到id为%v的数据", v)
- tx.Rollback()
- return
- }
- if errDB := tx.Model(&model.Video{}).Where("id=?", v).
- Update("valid", 0).Error; errDB != nil {
- err = errDB
- tx.Rollback()
- return
- }
- }
- tx.Commit()
- return
- }
- //VideoUpdate is used for hidden UGC video
- func (s *Service) VideoUpdate(id int, title string) (err error) {
- w := map[string]interface{}{"id": id}
- if err = s.DB.Model(&model.Video{}).Where(w).Update("eptitle", title).Error; err != nil {
- return
- }
- return
- }
- func (s *Service) getArc(aid int64) (res *model.Archive, err error) {
- var data = model.Archive{}
- if err = s.DB.Where("aid = ?", aid).Where("deleted =0").First(&data).Error; err != nil {
- log.Error("getArc Aid %d, Err %v", aid, err)
- return
- }
- res = &data
- return
- }
- func (s *Service) loadAbnCids() {
- var (
- rows *sql.Rows
- err error
- abnCids []*model.AbnorCids
- cfg = s.c.Cfg.Abnormal
- )
- // select cid from ugc_video where cid > 12780000 and deleted =0 and mark = 1 and submit = 1 and ctime < '2018-10-17 18:00:00' and transcoded = 0
- if rows, err = s.DB.Model(&model.Video{}).Where("cid > ?", cfg.CriticalCid).
- Where("deleted = 0").Where("mark = 1").Where("submit = 1").
- Where(fmt.Sprintf("ctime < DATE_SUB(NOW(), INTERVAL %d HOUR)", cfg.AbnormHours)).
- Where("transcoded = 0").Select("cid,aid,ctime,eptitle").Rows(); err != nil {
- log.Error("loadAbnCids Err %v", err)
- return
- }
- defer rows.Close()
- for rows.Next() {
- var (
- video = &model.AbnorVideo{}
- arc *model.Archive
- )
- if err = rows.Scan(&video.CID, &video.AID, &video.CTime, &video.VideoTitle); err != nil {
- log.Error("rows.Scan error(%v)", err)
- return
- }
- if arc, err = s.getArc(video.AID); err != nil {
- log.Error("getArc Aid %d, Err %v", video.AID, err)
- continue
- }
- abnCids = append(abnCids, video.ToCids(arc))
- }
- if err = rows.Err(); err != nil {
- log.Error("loadAbnCids rows Err %v", err)
- return
- }
- s.abnCids = abnCids
- log.Info("loadAbnCids Update Memory, Length %d", len(abnCids))
- }
- func (s *Service) loadAbnCidsproc() {
- for {
- time.Sleep(time.Duration(s.c.Cfg.Abnormal.ReloadFre))
- s.loadAbnCids()
- }
- }
- // AbnDebug returns the memory abnormal cids
- func (s *Service) AbnDebug() (data []*model.AbnorCids) {
- return s.abnCids
- }
- // AbnormExport exports the abnormal cids in CSV format
- func (s *Service) AbnormExport() (data *bytes.Buffer, fileName string) {
- var cfg = s.c.Cfg.Abnormal
- data = &bytes.Buffer{}
- csvWriter := csv.NewWriter(data)
- fileName = fmt.Sprintf("attachment;filename=\"Abnormal_%dh_%s.csv\"", cfg.AbnormHours, time.Now().Format(mysql.TimeFormat))
- csvWriter.Write(cfg.ExportTitles)
- for _, v := range s.abnCids {
- csvWriter.Write(v.Export())
- }
- csvWriter.Flush()
- return
- }
|