412 lines
12 KiB
Go
412 lines
12 KiB
Go
|
package service
|
|||
|
|
|||
|
import (
|
|||
|
"bufio"
|
|||
|
"context"
|
|||
|
"fmt"
|
|||
|
"go-common/app/job/bbq/video/dao"
|
|||
|
searchv1 "go-common/app/service/bbq/search/api/grpc/v1"
|
|||
|
"go-common/library/log"
|
|||
|
"io"
|
|||
|
"net/url"
|
|||
|
"os"
|
|||
|
|
|||
|
"strconv"
|
|||
|
"time"
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
_retryTimes = 3
|
|||
|
|
|||
|
_selection = 5 //运营精选状态
|
|||
|
)
|
|||
|
|
|||
|
//taskCheckVideoDBVSES 视频全量脚本
|
|||
|
func (s *Service) taskSyncVideo2ES() {
|
|||
|
var step time.Duration
|
|||
|
var id int64
|
|||
|
for {
|
|||
|
ids, videos, err := s.dao.VideoList(context.Background(), id)
|
|||
|
if err != nil {
|
|||
|
log.Error("sync video err(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
if videos == nil {
|
|||
|
return
|
|||
|
}
|
|||
|
videoStatisticsHive, _ := s.dao.VideoStatisticsHiveList(context.Background(), ids)
|
|||
|
videoStatistics, _ := s.dao.VideoStatisticsList(context.Background(), ids)
|
|||
|
videoTags, _ := s.dao.VideoTagsList(context.Background(), ids)
|
|||
|
req := new(searchv1.SaveVideoRequest)
|
|||
|
for _, v := range videos {
|
|||
|
fmt.Println(v.SVID)
|
|||
|
id = v.SVID
|
|||
|
tmp := &searchv1.VideoESInfo{
|
|||
|
SVID: v.SVID,
|
|||
|
Title: v.Title,
|
|||
|
Content: v.Content,
|
|||
|
MID: v.MID,
|
|||
|
CID: v.CID,
|
|||
|
Pubtime: int64(v.Pubtime),
|
|||
|
Ctime: int64(v.Ctime),
|
|||
|
Mtime: int64(v.Mtime),
|
|||
|
Duration: v.Duration,
|
|||
|
Original: v.Original,
|
|||
|
State: v.State,
|
|||
|
VerID: v.VerID,
|
|||
|
Ver: v.Ver,
|
|||
|
From: v.From,
|
|||
|
AVID: v.AVID,
|
|||
|
Tid: v.Tid,
|
|||
|
SubTid: v.SubTid,
|
|||
|
ISFullScreen: v.ISFullScreen,
|
|||
|
Score: v.Score,
|
|||
|
}
|
|||
|
if videoStatisticsHive[id] != nil {
|
|||
|
tmp.PlayHive = videoStatisticsHive[id].PlayHive
|
|||
|
tmp.FavHive = videoStatisticsHive[id].FavHive
|
|||
|
tmp.CoinHive = videoStatisticsHive[id].CoinHive
|
|||
|
tmp.SubtitlesHive = videoStatisticsHive[id].SubtitlesHive
|
|||
|
tmp.LikesHive = videoStatisticsHive[id].LikesHive
|
|||
|
tmp.ShareHive = videoStatisticsHive[id].ShareHive
|
|||
|
tmp.ReportHive = videoStatisticsHive[id].ReportHive
|
|||
|
tmp.DurationDailyHive = videoStatisticsHive[id].DurationDailyHive
|
|||
|
tmp.DurationAllHive = videoStatisticsHive[id].DurationAllHive
|
|||
|
tmp.ReplyHive = videoStatisticsHive[id].ReplyHive
|
|||
|
tmp.ShareDailyHive = videoStatisticsHive[id].ShareDailyHive
|
|||
|
tmp.PlayDailyHive = videoStatisticsHive[id].PlayDailyHive
|
|||
|
tmp.SubtitlesDailyHive = videoStatisticsHive[id].SubtitlesDailyHive
|
|||
|
tmp.LikesDailyHive = videoStatisticsHive[id].LikesDailyHive
|
|||
|
tmp.FavDailyHive = videoStatisticsHive[id].FavDailyHive
|
|||
|
tmp.ReplyDailyHive = videoStatisticsHive[id].ReplyDailyHive
|
|||
|
tmp.AccessHive = videoStatisticsHive[id].AccessHive
|
|||
|
}
|
|||
|
if videoStatistics[id] != nil {
|
|||
|
tmp.Play = videoStatistics[id].Play
|
|||
|
tmp.Subtitles = videoStatistics[id].Subtitles
|
|||
|
tmp.Like = videoStatistics[id].Like
|
|||
|
tmp.Share = videoStatistics[id].Share
|
|||
|
tmp.Report = videoStatistics[id].Report
|
|||
|
}
|
|||
|
if videoTags[id] != nil {
|
|||
|
tmp.Tags = videoTags[id]
|
|||
|
}
|
|||
|
req.List = append(req.List, tmp)
|
|||
|
}
|
|||
|
step = 1
|
|||
|
for {
|
|||
|
if _, err := s.dao.SearchClient.SaveVideo(context.Background(), req); err != nil {
|
|||
|
time.Sleep(step * time.Second)
|
|||
|
step++
|
|||
|
continue
|
|||
|
}
|
|||
|
break
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//SaveVideo2ES 保存视频到es
|
|||
|
func (s *Service) SaveVideo2ES(ids string) (res bool) {
|
|||
|
res = true
|
|||
|
if len(ids) == 0 {
|
|||
|
return
|
|||
|
}
|
|||
|
videos, err := s.dao.VideoListByIDs(context.Background(), ids)
|
|||
|
if err != nil || videos == nil {
|
|||
|
res = false
|
|||
|
return
|
|||
|
}
|
|||
|
videoStatisticsHive, _ := s.dao.VideoStatisticsHiveList(context.Background(), ids)
|
|||
|
videoStatistics, _ := s.dao.VideoStatisticsList(context.Background(), ids)
|
|||
|
// videoTags, _ := s.dao.VideoTagsList(context.Background(), ids)
|
|||
|
var step time.Duration
|
|||
|
var id int64
|
|||
|
req := new(searchv1.SaveVideoRequest)
|
|||
|
for _, v := range videos {
|
|||
|
id = v.SVID
|
|||
|
fmt.Println(id)
|
|||
|
tmp := &searchv1.VideoESInfo{
|
|||
|
SVID: v.SVID,
|
|||
|
Title: v.Title,
|
|||
|
Content: v.Content,
|
|||
|
MID: v.MID,
|
|||
|
CID: v.CID,
|
|||
|
Pubtime: int64(v.Pubtime),
|
|||
|
Ctime: int64(v.Ctime),
|
|||
|
Mtime: int64(v.Mtime),
|
|||
|
Duration: v.Duration,
|
|||
|
Original: v.Original,
|
|||
|
State: v.State,
|
|||
|
VerID: v.VerID,
|
|||
|
Ver: v.Ver,
|
|||
|
From: v.From,
|
|||
|
AVID: v.AVID,
|
|||
|
Tid: v.Tid,
|
|||
|
SubTid: v.SubTid,
|
|||
|
ISFullScreen: v.ISFullScreen,
|
|||
|
Score: v.Score,
|
|||
|
}
|
|||
|
if videoStatisticsHive[id] != nil {
|
|||
|
tmp.PlayHive = videoStatisticsHive[id].PlayHive
|
|||
|
tmp.FavHive = videoStatisticsHive[id].FavHive
|
|||
|
tmp.CoinHive = videoStatisticsHive[id].CoinHive
|
|||
|
tmp.SubtitlesHive = videoStatisticsHive[id].SubtitlesHive
|
|||
|
tmp.LikesHive = videoStatisticsHive[id].LikesHive
|
|||
|
tmp.ShareHive = videoStatisticsHive[id].ShareHive
|
|||
|
tmp.ReportHive = videoStatisticsHive[id].ReportHive
|
|||
|
tmp.DurationDailyHive = videoStatisticsHive[id].DurationDailyHive
|
|||
|
tmp.DurationAllHive = videoStatisticsHive[id].DurationAllHive
|
|||
|
tmp.ReplyHive = videoStatisticsHive[id].ReplyHive
|
|||
|
tmp.ShareDailyHive = videoStatisticsHive[id].ShareDailyHive
|
|||
|
tmp.PlayDailyHive = videoStatisticsHive[id].PlayDailyHive
|
|||
|
tmp.SubtitlesDailyHive = videoStatisticsHive[id].SubtitlesDailyHive
|
|||
|
tmp.LikesDailyHive = videoStatisticsHive[id].LikesDailyHive
|
|||
|
tmp.FavDailyHive = videoStatisticsHive[id].FavDailyHive
|
|||
|
tmp.ReplyDailyHive = videoStatisticsHive[id].ReplyDailyHive
|
|||
|
tmp.AccessHive = videoStatisticsHive[id].AccessHive
|
|||
|
}
|
|||
|
if videoStatistics[id] != nil {
|
|||
|
tmp.Play = videoStatistics[id].Play
|
|||
|
tmp.Subtitles = videoStatistics[id].Subtitles
|
|||
|
tmp.Like = videoStatistics[id].Like
|
|||
|
tmp.Share = videoStatistics[id].Share
|
|||
|
tmp.Report = videoStatistics[id].Report
|
|||
|
}
|
|||
|
// if videoTags[id] != nil {
|
|||
|
// tmp.Tags = videoTags[id]
|
|||
|
// }
|
|||
|
req.List = append(req.List, tmp)
|
|||
|
}
|
|||
|
step = 1
|
|||
|
for {
|
|||
|
if _, err := s.dao.SearchClient.SaveVideo(context.Background(), req); err != nil {
|
|||
|
if step == 11 {
|
|||
|
log.Error("save es err(%v) ids(%s)", err, ids)
|
|||
|
res = false
|
|||
|
break
|
|||
|
}
|
|||
|
time.Sleep(step * time.Second)
|
|||
|
step++
|
|||
|
continue
|
|||
|
}
|
|||
|
break
|
|||
|
}
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func formArrayString(arr []int64) string {
|
|||
|
var res string
|
|||
|
for i, v := range arr {
|
|||
|
if i != 0 {
|
|||
|
res += ","
|
|||
|
}
|
|||
|
res += strconv.FormatInt(v, 10)
|
|||
|
}
|
|||
|
return res
|
|||
|
}
|
|||
|
|
|||
|
//deltaSync2ES 为不同表进行增量同步的脚本,baseTableQuery指明不同表的查询语句
|
|||
|
func (s *Service) deltaSync2ES(taskName string, baseTableQuery string) {
|
|||
|
task, err := s.dao.RawCheckTask(context.Background(), taskName)
|
|||
|
if err != nil {
|
|||
|
log.Error("get last_chek_time fail: task=%s", taskName)
|
|||
|
return
|
|||
|
}
|
|||
|
log.Info("get last_chek_time succ: task=%s, last_check_time=%d", taskName, task.LastCheck)
|
|||
|
|
|||
|
// 获得所有变更的svid
|
|||
|
ids, mtime, err := s.dao.RawGetIDByMtime(baseTableQuery, task.LastCheck)
|
|||
|
if err != nil {
|
|||
|
log.Error("get raw id by mtime fail: task=%s, last_mtime=%d, base_table_query=%s",
|
|||
|
taskName, mtime, baseTableQuery)
|
|||
|
return
|
|||
|
}
|
|||
|
idsNum := len(ids)
|
|||
|
log.Info("get changed svids: task=%s, id_num=%d", taskName, idsNum)
|
|||
|
if idsNum == 0 {
|
|||
|
return
|
|||
|
}
|
|||
|
task.LastCheck = mtime
|
|||
|
|
|||
|
// 对所有变更的svid分批次进行同步到es
|
|||
|
for i := 0; i < idsNum; i += dao.MaxSyncESNum {
|
|||
|
last := i + dao.MaxSyncESNum
|
|||
|
if last > idsNum {
|
|||
|
last = idsNum
|
|||
|
}
|
|||
|
selectedIDs := ids[i:last]
|
|||
|
idsStr := formArrayString(selectedIDs)
|
|||
|
if res := s.SaveVideo2ES(idsStr); !res {
|
|||
|
log.Error("sync video 2 es fail: task=%s, offset=%d, id_num=%d, base_table_query=%s",
|
|||
|
taskName, i, idsNum, baseTableQuery)
|
|||
|
return
|
|||
|
}
|
|||
|
log.Info("one sync video 2 es: task=%s, offset=%d, id_num=%d", taskName, i, idsNum)
|
|||
|
}
|
|||
|
|
|||
|
// 更新task最近check的时间点
|
|||
|
if _, err := s.dao.UpdateTaskLastCheck(context.Background(), taskName, task.LastCheck); err != nil {
|
|||
|
log.Error("update task last check time fail: task=%s, last_mtime=%d, base_table_query=%s",
|
|||
|
taskName, task.LastCheck, baseTableQuery)
|
|||
|
return
|
|||
|
}
|
|||
|
log.Info("sync video 2 es: task=%s, id_num=%d, last_mtime=%d", taskName, idsNum, task.LastCheck)
|
|||
|
}
|
|||
|
|
|||
|
//taskCheckVideo video表增量脚本
|
|||
|
func (s *Service) taskCheckVideo() {
|
|||
|
taskName := "checkVideo"
|
|||
|
s.deltaSync2ES(taskName, dao.QueryVideoByMtime)
|
|||
|
}
|
|||
|
|
|||
|
//taskCheckVideoStatistics video_statistics表增量脚本
|
|||
|
func (s *Service) taskCheckVideoStatistics() {
|
|||
|
taskName := "checkVideoSt"
|
|||
|
s.deltaSync2ES(taskName, dao.QueryVideoStatisticsByMtime)
|
|||
|
}
|
|||
|
|
|||
|
//taskCheckVideoStatisticsHive video_statistics_hive表增量脚本
|
|||
|
func (s *Service) taskCheckVideoStatisticsHive() {
|
|||
|
taskName := "checkVideoStHv"
|
|||
|
s.deltaSync2ES(taskName, dao.QueryVideoStatisticsHiveByMtime)
|
|||
|
}
|
|||
|
|
|||
|
//taskCheckVideoTag video_tag表增量脚本
|
|||
|
func (s *Service) taskCheckVideoTag() {
|
|||
|
taskName := "checkVideoTag"
|
|||
|
s.deltaSync2ES(taskName, dao.QueryVideoTagByMtime)
|
|||
|
}
|
|||
|
|
|||
|
//taskCheckTag tag表增量脚本
|
|||
|
func (s *Service) taskCheckTag() {
|
|||
|
taskName := "checkTag"
|
|||
|
task, err := s.dao.RawCheckTask(context.Background(), taskName)
|
|||
|
if err != nil {
|
|||
|
log.Error("get last_chek_time fail: task=%s", taskName)
|
|||
|
return
|
|||
|
}
|
|||
|
log.Info("get last_chek_time succ: task=%s, last_check_time=%d", taskName, task.LastCheck)
|
|||
|
for {
|
|||
|
ids, mtime, err := s.dao.RawTagByMtime(context.Background(), task.LastCheck)
|
|||
|
if err != nil || len(ids) == 0 {
|
|||
|
return
|
|||
|
}
|
|||
|
id := int64(0)
|
|||
|
for {
|
|||
|
svids, temp, err := s.dao.RawVideoTagByIDs(context.Background(), ids, id)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
if len(svids) == 0 {
|
|||
|
break
|
|||
|
}
|
|||
|
if flag := s.SaveVideo2ES(svids); !flag {
|
|||
|
return
|
|||
|
}
|
|||
|
id = temp
|
|||
|
}
|
|||
|
if num, err := s.dao.UpdateTaskLastCheck(context.Background(), taskName, mtime); err != nil || num == 0 {
|
|||
|
return
|
|||
|
}
|
|||
|
task.LastCheck = mtime
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// taskRmInvalidES 删除es中多余的视频
|
|||
|
func (s *Service) taskRmInvalidES() {
|
|||
|
fmt.Println("aaa")
|
|||
|
esReq := new(searchv1.ESVideoDataRequest)
|
|||
|
delReq := new(searchv1.DelVideoBySVIDRequest)
|
|||
|
svid := int64(0)
|
|||
|
query := `{"query":{"range":{"svid":{"gt":%d}}},"sort":[{"svid":"asc"}],"from":0,"size":10}`
|
|||
|
for {
|
|||
|
esReq.Query = fmt.Sprintf(query, svid)
|
|||
|
res, err := s.dao.SearchClient.ESVideoData(context.Background(), esReq)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
svids := make([]string, 0)
|
|||
|
for _, v := range res.List {
|
|||
|
svids = append(svids, strconv.Itoa(int(v.SVID)))
|
|||
|
svid = v.SVID
|
|||
|
}
|
|||
|
vs, err := s.dao.RawVideoBySVIDS(context.Background(), svids)
|
|||
|
if err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
notList := make([]int64, 0)
|
|||
|
for _, v := range res.List {
|
|||
|
if _, ok := vs[v.SVID]; !ok {
|
|||
|
fmt.Println(v.SVID)
|
|||
|
notList = append(notList, v.SVID)
|
|||
|
}
|
|||
|
}
|
|||
|
if len(notList) != 0 {
|
|||
|
delReq.SVIDs = notList
|
|||
|
s.dao.SearchClient.DelVideoBySVID(context.Background(), delReq)
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
func (s *Service) commitCID() {
|
|||
|
ctx := context.Background()
|
|||
|
path := s.c.URLs["bvc_push"]
|
|||
|
if path == "" {
|
|||
|
return
|
|||
|
}
|
|||
|
srcPath := s.c.Path["cids"]
|
|||
|
if srcPath == "" {
|
|||
|
return
|
|||
|
}
|
|||
|
if srcPath == "" {
|
|||
|
log.Error("sugsrc path is empty")
|
|||
|
return
|
|||
|
}
|
|||
|
src, err := os.Open(srcPath)
|
|||
|
if err != nil {
|
|||
|
log.Error("writeSug os.Open source sug error(%v)", err)
|
|||
|
return
|
|||
|
}
|
|||
|
defer src.Close()
|
|||
|
br := bufio.NewReader(src)
|
|||
|
i := 1
|
|||
|
for {
|
|||
|
a, _, c := br.ReadLine()
|
|||
|
if c == io.EOF {
|
|||
|
break
|
|||
|
}
|
|||
|
cid, err := strconv.ParseInt(string(a), 10, 64)
|
|||
|
if err != nil {
|
|||
|
log.Error("parse err [%v]", err)
|
|||
|
continue
|
|||
|
}
|
|||
|
svid, err := s.dao.GetSvidByCid(ctx, cid)
|
|||
|
if err != nil {
|
|||
|
continue
|
|||
|
}
|
|||
|
params := url.Values{}
|
|||
|
params.Set("svid", strconv.FormatInt(svid, 10))
|
|||
|
params.Set("cid", string(a))
|
|||
|
req, err := s.dao.HTTPClient.NewRequest("GET", path, "", params)
|
|||
|
if err != nil {
|
|||
|
log.Error("error(%v)", err)
|
|||
|
continue
|
|||
|
}
|
|||
|
var res struct {
|
|||
|
Code int `json:"code"`
|
|||
|
Msg string `json:"message"`
|
|||
|
}
|
|||
|
if err = s.dao.HTTPClient.Do(ctx, req, &res); err != nil {
|
|||
|
log.Errorv(ctx, log.KV("log", fmt.Sprintf("err[%v]", err)))
|
|||
|
continue
|
|||
|
}
|
|||
|
if res.Code != 0 {
|
|||
|
log.Errorv(ctx, log.KV("log", fmt.Sprintf("error(%v)", err)))
|
|||
|
} else {
|
|||
|
log.Info("commit svid:%d cid:%d success No.%d", svid, cid, i)
|
|||
|
}
|
|||
|
i++
|
|||
|
}
|
|||
|
}
|