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.
177 lines
4.9 KiB
177 lines
4.9 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"database/sql" |
|
"fmt" |
|
"net/url" |
|
"strconv" |
|
|
|
"go-common/app/admin/main/tv/model" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"go-common/library/xstr" |
|
|
|
"github.com/jinzhu/gorm" |
|
) |
|
|
|
// Playurl new playurl function, get url from API |
|
func (s *Service) Playurl(cid int) (playurl string, err error) { |
|
if playurl, err = s.dao.Playurl(ctx, cid); err != nil { |
|
log.Error("Playurl API Error(%d) (%v)", cid, err) |
|
return |
|
} |
|
if playurl, err = s.hostChange(playurl); err != nil { |
|
log.Error("hostChange Error(%s)-(%v)", playurl, err) |
|
return |
|
} |
|
log.Info("NewPlayURL cid = %d, playurl = %s", cid, playurl) |
|
return |
|
} |
|
|
|
// hostChange can change the url from playurl api to tvshenhe's host |
|
func (s *Service) hostChange(playurl string) (replacedURL string, err error) { |
|
u, err := url.Parse(playurl) |
|
if err != nil { |
|
log.Error("hostChange ParseURL error (%v)", err) |
|
return |
|
} |
|
log.Info("[hostChange] for URL: %s, Original Host: %s, Now we change it to: %s", playurl, u.Host, s.c.Cfg.Playpath) |
|
u.Host = s.c.Cfg.Playpath // replace the host |
|
u.RawQuery = "" // remove useless query |
|
replacedURL = u.String() |
|
return |
|
} |
|
|
|
// Upload can upload a file object: store the info in Redis, and transfer the file to Bfs |
|
func (s *Service) Upload(c context.Context, fileName string, fileType string, timing int64, body []byte) (location string, err error) { |
|
if location, err = s.dao.Upload(c, fileName, fileType, timing, body); err != nil { |
|
log.Error("s.upload.Upload() error(%v)", err) |
|
} |
|
return |
|
} |
|
|
|
// unshelveReqT treats the unshelve request to db ( for update ) and dbSel (for select ) |
|
func (s *Service) unshelveReqT(req *model.ReqUnshelve) (db, dbSel *gorm.DB, err error) { |
|
if length := len(req.IDs); length == 0 || length > s.c.Cfg.AuditConsult.UnshelveNb { |
|
err = ecode.RequestErr |
|
return |
|
} |
|
switch req.Type { |
|
case 1: // sid |
|
db = s.DB.Model(&model.TVEpSeason{}).Where("is_deleted = 0"). |
|
Where(fmt.Sprintf("id IN (%s)", xstr.JoinInts(req.IDs))) |
|
dbSel = db.Select("id") |
|
case 2: // epid |
|
db = s.DB.Model(&model.Content{}).Where("is_deleted = 0"). |
|
Where(fmt.Sprintf("epid IN (%s)", xstr.JoinInts(req.IDs))) |
|
dbSel = db.Select("epid") |
|
case 3: // aid |
|
db = s.DB.Model(&model.Archive{}).Where("deleted = 0"). |
|
Where(fmt.Sprintf("aid IN (%s)", xstr.JoinInts(req.IDs))) |
|
dbSel = db.Select("aid") |
|
case 4: // cid |
|
db = s.DB.Model(&model.Video{}).Where("deleted = 0"). |
|
Where(fmt.Sprintf("cid IN (%s)", xstr.JoinInts(req.IDs))) |
|
dbSel = db.Select("cid") |
|
default: |
|
err = ecode.RequestErr |
|
} |
|
return |
|
} |
|
|
|
// Unshelve is to soft delete the media data |
|
func (s *Service) Unshelve(c context.Context, req *model.ReqUnshelve, username string) (resp *model.RespUnshelve, err error) { |
|
var ( |
|
rows *sql.Rows |
|
existMap = make(map[int64]int, len(req.IDs)) |
|
db, dbSelect *gorm.DB |
|
updField = make(map[string]int, 1) |
|
) |
|
log.Warn("Unshelve Req Type %d, IDs %v, Username %s", req.Type, req.IDs, username) // record user's action |
|
resp = &model.RespUnshelve{ |
|
SuccIDs: make([]int64, 0), |
|
FailIDs: make([]int64, 0), |
|
} |
|
if db, dbSelect, err = s.unshelveReqT(req); err != nil { |
|
log.Error("unshelve ReqT Err %v", err) |
|
return |
|
} |
|
if rows, err = dbSelect.Rows(); err != nil { |
|
log.Error("db rows Ids %v, Err %v", req.IDs, err) |
|
return |
|
} |
|
defer rows.Close() |
|
for rows.Next() { // pick existing ids |
|
var sid int64 |
|
if err = rows.Scan(&sid); err != nil { |
|
log.Error("rows.Scan error(%v)", err) |
|
return |
|
} |
|
resp.SuccIDs = append(resp.SuccIDs, sid) |
|
existMap[sid] = 1 |
|
} |
|
if err = rows.Err(); err != nil { |
|
log.Error("rows.Err %v", err) |
|
return |
|
} |
|
for _, v := range req.IDs { // treat to have the non-existing ids |
|
if _, ok := existMap[v]; !ok { |
|
resp.FailIDs = append(resp.FailIDs, v) |
|
} |
|
} |
|
if len(resp.SuccIDs) == 0 { // there isn't any to update ids |
|
return |
|
} |
|
switch req.Type { |
|
case 1, 2: // sid, epid |
|
updField["is_deleted"] = 1 |
|
case 3, 4: // aid, cid |
|
updField["deleted"] = 1 |
|
} |
|
if err = db.Update(updField).Error; err != nil { |
|
log.Error("update Ids %v, err %v", req.IDs, err) |
|
} |
|
return |
|
} |
|
|
|
// ChlSplash gets channel's splash data |
|
func (s *Service) ChlSplash(c context.Context, req *model.ReqChannel) (res *model.ChannelPager, err error) { |
|
var ( |
|
db = s.DB.Model(&model.Channel{}).Where("deleted!=?", _isDeleted) |
|
items []*model.ChannelFmt |
|
count int64 |
|
) |
|
if req.Desc != "" { |
|
db = db.Where("`desc` LIKE ?", "%"+req.Desc+"%") |
|
} |
|
if req.Title != "" { |
|
db = db.Where("title = ?", req.Title) |
|
} |
|
db.Count(&count) |
|
if req.Order == model.OrderDesc { |
|
db = db.Order("mtime DESC") |
|
} else { |
|
db = db.Order("mtime ASC") |
|
} |
|
if err = db.Offset((req.Page - 1) * _pagesize).Limit(_pagesize).Find(&items).Error; err != nil { |
|
log.Error("chlList Error (%v)", err) |
|
return |
|
} |
|
for _, v := range items { |
|
v.MtimeFormat = s.TimeFormat(v.Mtime) |
|
v.Mtime = 0 |
|
} |
|
res = &model.ChannelPager{ |
|
TotalCount: count, |
|
Pn: req.Page, |
|
Ps: _pagesize, |
|
Items: items, |
|
} |
|
return |
|
} |
|
|
|
func atoi(str string) (res int) { |
|
res, _ = strconv.Atoi(str) |
|
return |
|
}
|
|
|