369 lines
8.8 KiB
Go
369 lines
8.8 KiB
Go
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
|
|
}
|