go-common/app/admin/main/tv/service/watermark.go

369 lines
8.8 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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
}