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.
368 lines
8.8 KiB
368 lines
8.8 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"database/sql" |
|
"fmt" |
|
"strings" |
|
"time" |
|
|
|
"go-common/app/admin/main/tv/model" |
|
"go-common/library/log" |
|
bm "go-common/library/net/http/blademaster" |
|
xtime "go-common/library/time" |
|
|
|
"go-common/library/ecode" |
|
"go-common/library/xstr" |
|
|
|
"github.com/jinzhu/gorm" |
|
) |
|
|
|
const _pagesize = 20 |
|
|
|
//WaterMarkist water mark list |
|
func (s *Service) WaterMarkist(c *bm.Context, param *model.WaterMarkListParam) (pager *model.WaterMarkListPager, err error) { |
|
var ( |
|
order string |
|
total int |
|
markList []*model.WaterMarkList |
|
) |
|
selectStr := []string{ |
|
"tv_content.id", |
|
"tv_content.epid", |
|
"tv_content.season_id", |
|
"tv_content.title AS content_title", |
|
"tv_content.mark_time", |
|
"tv_ep_season.category", |
|
"tv_ep_season.title AS season_title", |
|
} |
|
db := s.DB.Model(&model.WaterMarkList{}) |
|
db = db.Select(selectStr). |
|
Where("tv_content.is_deleted = ?", 0). |
|
Where("tv_content.mark = ?", model.WatermarkWhite). |
|
Joins("LEFT JOIN tv_ep_season ON tv_ep_season.id = tv_content.season_id") |
|
if param.Category != "" { |
|
db = db.Where("tv_ep_season.category = ?", param.Category) |
|
} |
|
if param.EpID != "" { |
|
db = db.Where("tv_content.epid = ?", param.EpID) |
|
} |
|
if param.SeasonID != "" { |
|
db = db.Where("tv_content.season_id = ?", param.SeasonID) |
|
} |
|
if param.Order == model.OrderDesc { |
|
order = "tv_content.mtime DESC" |
|
} else { |
|
order = "tv_content.mtime ASC" |
|
} |
|
if err = db.Order(order).Offset((param.Pn - 1) * param.Ps).Limit(param.Ps).Find(&markList).Error; err != nil { |
|
return |
|
} |
|
for i := range markList { |
|
attr := markList[i] |
|
attr.Category = s.pgcCatToName(atoi(attr.Category)) |
|
} |
|
if err = db.Count(&total).Error; err != nil { |
|
return |
|
} |
|
pager = &model.WaterMarkListPager{ |
|
Items: markList, |
|
Page: &model.Page{ |
|
Num: param.Pn, |
|
Size: param.Ps, |
|
Total: int(total), |
|
}, |
|
} |
|
return |
|
} |
|
|
|
//AddEpID add water mark by ep id |
|
func (s *Service) AddEpID(c *bm.Context, ids []int64) (res *model.AddEpIDResp, err error) { |
|
var ( |
|
notExist bool |
|
) |
|
res = &model.AddEpIDResp{ |
|
Succ: []int64{}, |
|
NotExist: []int64{}, |
|
Invalids: []int64{}, |
|
} |
|
for _, v := range ids { |
|
var mark model.WaterMarkOne |
|
if notExist, err = s.valueWithEpID(v, &mark); err != nil { |
|
return |
|
} |
|
if notExist { |
|
res.NotExist = append(res.NotExist, v) |
|
continue |
|
} |
|
if mark.Mark == model.WatermarkWhite { |
|
res.Invalids = append(res.Invalids, v) |
|
continue |
|
} |
|
if err = s.updateWithEpID(v); err != nil { |
|
return |
|
} |
|
res.Succ = append(res.Succ, v) |
|
} |
|
return |
|
} |
|
|
|
//valueWithEpID get value with epid |
|
func (s *Service) valueWithEpID(id int64, m *model.WaterMarkOne) (exist bool, err error) { |
|
if err = s.DB.Where("is_deleted = 0").Where("epid = ?", id).First(m).Error; err != nil { |
|
if err == gorm.ErrRecordNotFound { |
|
return true, nil |
|
} |
|
return |
|
} |
|
return false, nil |
|
} |
|
|
|
//updateWithEpID update with epid |
|
func (s *Service) updateWithEpID(id int64) (err error) { |
|
up := map[string]interface{}{ |
|
"mark": model.WatermarkWhite, |
|
"mark_time": time.Now().Format("2006-01-02 15:04:05"), |
|
} |
|
if err = s.DB.Model(&model.WaterMarkOne{}).Where("epid=?", id).Update(up).Error; err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
//AddSeasonID add water mark with season id |
|
func (s *Service) AddSeasonID(c *bm.Context, ids []int64) (res *model.AddEpIDResp, err error) { |
|
var ( |
|
notExist bool |
|
) |
|
res = &model.AddEpIDResp{ |
|
Succ: []int64{}, |
|
NotExist: []int64{}, |
|
Invalids: []int64{}, |
|
} |
|
for _, v := range ids { |
|
var mark model.WaterMarkOne |
|
if notExist, err = s.valueWithSeasonID(v, &mark); err != nil { |
|
return |
|
} |
|
if notExist { |
|
res.NotExist = append(res.NotExist, v) |
|
continue |
|
} |
|
if err = s.updateWithSeasonID(v); err != nil { |
|
return |
|
} |
|
res.Succ = append(res.Succ, v) |
|
} |
|
return |
|
} |
|
|
|
//valueWithSeasonID get value with season id |
|
func (s *Service) valueWithSeasonID(id int64, m *model.WaterMarkOne) (exist bool, err error) { |
|
w := map[string]interface{}{ |
|
"is_deleted": 0, |
|
"season_id": id, |
|
//"mark": model.WatermarkDefault, |
|
} |
|
if err = s.DB.Where(w).First(m).Error; err != nil { |
|
if err == gorm.ErrRecordNotFound { |
|
return true, nil |
|
} |
|
return |
|
} |
|
return false, nil |
|
} |
|
|
|
//updateWithSeasonID update with seasonID |
|
func (s *Service) updateWithSeasonID(id int64) (err error) { |
|
up := map[string]interface{}{ |
|
"mark": model.WatermarkWhite, |
|
"mark_time": time.Now().Format("2006-01-02 15:04:05"), |
|
} |
|
if err = s.DB.Model(&model.WaterMarkOne{}).Where("season_id=?", id). |
|
Update(up).Error; err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
//DeleteWatermark delete watermark |
|
func (s *Service) DeleteWatermark(ids []int64) (err error) { |
|
if len(ids) > 50 { |
|
err = fmt.Errorf("更新数量最多为50条") |
|
return |
|
} |
|
up := map[string]interface{}{ |
|
"mark": model.WatermarkDefault, |
|
} |
|
if err = s.DB.Model(&model.WaterMarkOne{}).Where("id in (?)", ids). |
|
Update(up).Error; err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
// titleMatch picks the title match seasons |
|
func (s *Service) titleMatch(title string) (match []int64) { |
|
if len(s.snsInfo) == 0 { |
|
return |
|
} |
|
for _, v := range s.snsInfo { |
|
if strings.Contains(v.Title, title) { |
|
match = append(match, v.ID) |
|
} |
|
} |
|
return |
|
} |
|
|
|
// TransList picks the transcode list |
|
func (s *Service) TransList(ctx context.Context, req *model.TransReq) (data *model.TransPager, err error) { |
|
var ( |
|
db *gorm.DB |
|
cntEp int |
|
cntSn = new(model.SnCount) |
|
) |
|
data = &model.TransPager{ |
|
Page: &model.Page{ |
|
Num: req.Pn, Size: _pagesize, Total: 0, |
|
}, |
|
Items: make([]*model.TransReply, 0), |
|
} |
|
if db, err = s.transReqT(req); err != nil { |
|
return |
|
} |
|
if err = db.Count(&cntEp).Error; err != nil { // |
|
log.Error("countEp Err %v", err) |
|
return |
|
} |
|
if cntEp == 0 { // if no result ,just return |
|
data.CountSn = 0 |
|
return |
|
} |
|
if (req.Pn-1)*_pagesize >= cntEp { // if page is much bigger than existing pages, just return error |
|
err = ecode.TvDangbeiPageNotExist |
|
return |
|
} |
|
if err = db.Table("tv_content").Select("COUNT(DISTINCT(season_id)) AS count").First(cntSn).Error; err != nil { // count season |
|
log.Error("countSn Err %v", err) |
|
return |
|
} |
|
db = postReqT(req, db) // order by & limit |
|
if data.Items, err = s.transDB(db); err != nil { |
|
log.Error("transDB Err %v", err) |
|
return |
|
} |
|
data.Page = &model.Page{ |
|
Num: req.Pn, |
|
Size: _pagesize, |
|
Total: cntEp, |
|
} |
|
data.CountSn = cntSn.Count |
|
return |
|
} |
|
|
|
func (s *Service) transDB(db *gorm.DB) (items []*model.TransReply, err error) { |
|
var rows *sql.Rows |
|
rows, err = db.Select("epid, title, transcoded, apply_time, mark_time, season_id").Rows() |
|
if err != nil { |
|
log.Error("rows Err %v", err) |
|
return |
|
} |
|
for rows.Next() { |
|
var ( |
|
cont = &model.TransReply{} |
|
aTime, mTime xtime.Time |
|
) |
|
if err = rows.Scan(&cont.EpID, &cont.Etitle, &cont.Transcoded, &aTime, &mTime, &cont.SeasonID); err != nil { |
|
log.Error("rows.Scan error(%v)", err) |
|
return |
|
} |
|
if mTime > xtime.Time(0) { // resolve negative value issue |
|
cont.MarkTime = mTime.Time().Format("2006-01-02 15:04:05") |
|
} |
|
cont.ApplyTime = aTime.Time().Format("2006-01-02 15:04:05") |
|
if sn, ok := s.snsInfo[cont.SeasonID]; ok { |
|
cont.Stitle = sn.Title |
|
cont.Category = s.pgcCatToName(sn.Category) |
|
} |
|
items = append(items, cont) |
|
} |
|
if err = rows.Err(); err != nil { |
|
log.Error("rows Err %v", err) |
|
return |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) transReqT(req *model.TransReq) (db *gorm.DB, err error) { |
|
var ( |
|
inSids, catSids []int64 |
|
ok bool |
|
) |
|
db = s.DB.Model(model.Content{}).Where("apply_time != '0000-00-00 00:00:00'").Where("is_deleted = 0") |
|
if req.Status != "" { // status |
|
switch req.Status { |
|
case "0": |
|
db = db.Where("transcoded = 0") |
|
case "1": |
|
db = db.Where("transcoded = 1") |
|
case "2": |
|
db = db.Where("transcoded = 2") |
|
} |
|
} |
|
if req.EpID != 0 { |
|
db = db.Where("epid = ?", req.EpID) |
|
} |
|
if req.SeasonID != 0 { |
|
db = db.Where("season_id = ?", req.SeasonID) |
|
} |
|
if req.Title != "" { |
|
if inSids = s.titleMatch(req.Title); len(inSids) == 0 { |
|
log.Warn("titleMatch %s, Empty", req.Title) |
|
err = ecode.NothingFound |
|
return |
|
} |
|
} |
|
if req.Category != 0 { |
|
if catSids, ok = s.snsCats[req.Category]; !ok || len(catSids) == 0 { |
|
log.Warn("snsCats %d, Empty", req.Category) |
|
err = ecode.NothingFound |
|
return |
|
} |
|
if len(inSids) > 0 { // title match have sids |
|
if inSids = intersect(catSids, inSids); len(inSids) == 0 { |
|
err = ecode.NothingFound |
|
return |
|
} |
|
} else { |
|
inSids = catSids |
|
} |
|
} |
|
if len(inSids) > 0 { |
|
db = db.Where(fmt.Sprintf("season_id IN (%s)", xstr.JoinInts(inSids))) |
|
} |
|
return |
|
} |
|
|
|
func postReqT(req *model.TransReq, db *gorm.DB) (newDb *gorm.DB) { |
|
if req.Order == 2 { // order |
|
newDb = db.Order("apply_time ASC") |
|
} else { |
|
newDb = db.Order("apply_time DESC") |
|
} |
|
newDb = newDb.Offset((req.Pn - 1) * _pagesize).Limit(_pagesize) |
|
return |
|
} |
|
|
|
func intersect(big, small []int64) (out []int64) { |
|
var amap = make(map[int64]int, len(big)) |
|
for _, v := range big { |
|
amap[v] = 1 |
|
} |
|
for _, v := range small { |
|
if _, ok := amap[v]; ok { |
|
out = append(out, v) |
|
} |
|
} |
|
return |
|
}
|
|
|