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.
209 lines
5.4 KiB
209 lines
5.4 KiB
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 |
|
}
|
|
|