123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368 |
- 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
- }
|