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.
82 lines
2.0 KiB
82 lines
2.0 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"math" |
|
"sync" |
|
|
|
"go-common/app/interface/main/dm2/model" |
|
"go-common/app/service/main/archive/api" |
|
arcMdl "go-common/app/service/main/archive/model/archive" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
"go-common/library/net/metadata" |
|
"go-common/library/sync/errgroup" |
|
) |
|
|
|
func (s *Service) archiveInfos(c context.Context, aids []int64) (archiveInfos map[int64]*api.Arc, err error) { |
|
var ( |
|
pagesize = 100 |
|
wg errgroup.Group |
|
mu sync.Mutex |
|
) |
|
archiveInfos = make(map[int64]*api.Arc) |
|
if len(aids) <= 0 { |
|
return |
|
} |
|
page := int(math.Ceil(float64(len(aids)) / float64(pagesize))) |
|
for i := 0; i < page; i++ { |
|
start := i * pagesize |
|
end := (i + 1) * pagesize |
|
if end > len(aids) { |
|
end = len(aids) |
|
} |
|
wg.Go(func() (err error) { |
|
arg := &arcMdl.ArgAids2{Aids: aids[start:end]} |
|
infos, err := s.arcRPC.Archives3(c, arg) |
|
if err != nil { |
|
log.Error("s.arcRPC.Archives3(%v) error(%v)", arg, err) |
|
return |
|
} |
|
for _, info := range infos { |
|
mu.Lock() |
|
archiveInfos[info.Aid] = info |
|
mu.Unlock() |
|
} |
|
return |
|
}) |
|
} |
|
err = wg.Wait() |
|
return |
|
} |
|
|
|
// videoDuration return video duration cid. |
|
func (s *Service) videoDuration(c context.Context, aid, cid int64) (duration int64, err error) { |
|
var cache = true |
|
if duration, err = s.dao.DurationCache(c, cid); err != nil { |
|
log.Error("dao.Duration(cid:%d) error(%v)", cid, err) |
|
err = nil |
|
cache = false |
|
} else if duration != model.NotFound { |
|
return |
|
} |
|
arg := &arcMdl.ArgVideo2{Aid: aid, Cid: cid, RealIP: metadata.String(c, metadata.RemoteIP)} |
|
page, err := s.arcRPC.Video3(c, arg) |
|
if err != nil { |
|
if ecode.Cause(err).Code() == ecode.NothingFound.Code() { |
|
duration = 0 |
|
err = nil |
|
log.Warn("acvSvc.Video3(%v) error(duration not exist)", arg) |
|
} else { |
|
log.Error("acvSvc.Video3(%v) error(%v)", arg, err) |
|
} |
|
} else { |
|
duration = page.Duration * 1000 |
|
} |
|
if cache { |
|
s.cache.Do(c, func(ctx context.Context) { |
|
s.dao.SetDurationCache(ctx, cid, duration) |
|
}) |
|
} |
|
return |
|
}
|
|
|