Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,55 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = [
"cover_test.go",
"data_test.go",
],
embed = [":go_default_library"],
tags = ["automanaged"],
deps = [
"//app/job/live/dao-anchor-job/internal/conf:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"cover.go",
"data.go",
"service.go",
],
importpath = "go-common/app/job/live/dao-anchor-job/internal/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/live/dao-anchor-job/internal/conf:go_default_library",
"//app/job/live/dao-anchor-job/internal/dao:go_default_library",
"//library/log:go_default_library",
"//library/net/trace:go_default_library",
"//library/sync/errgroup:go_default_library",
"//vendor/github.com/robfig/cron:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,112 @@
package service
import (
"context"
"strings"
"time"
"go-common/app/job/live/dao-anchor-job/internal/dao"
"go-common/library/sync/errgroup"
"go-common/library/log"
)
//封面图/关键帧相关脚本
const ROOM_LEN_KEY_FRAME = 500
//updateKeyFrame 更新关键帧
func (s *Service) updateKeyFrame() {
ctx := context.TODO()
ctx, cancel := context.WithTimeout(ctx, time.Minute*5)
defer cancel()
log.Info("updateKeyFrame_start")
//获取全量开播房间
allLiveingRoom, err := s.dao.GetAllLiveRoomIds(ctx)
if allLiveingRoom == nil || err != nil {
log.Error("updateKeyFrame_allLiveingRoom_error:reply=%v;err=%v", allLiveingRoom, err)
return
}
slice := make([]int64, 0)
eg := errgroup.Group{}
for i := 0; i < len(allLiveingRoom); {
end := ROOM_LEN_KEY_FRAME + i
if (ROOM_LEN_KEY_FRAME + i) >= len(allLiveingRoom) {
end = len(allLiveingRoom)
}
slice = allLiveingRoom[i:end]
if len(slice) <= 0 {
break
} else {
eg.Go(func(sliceParam []int64) func() error {
return func() (err error) {
for _, roomId := range sliceParam {
coverUrl, err := s.dealKeyFrame(ctx, roomId)
if err != nil {
time.Sleep(time.Second)
log.Error("updateKeyFrame_deal_error:roomId=%d;ketFrame=%s", roomId, coverUrl)
continue
}
if coverUrl == "" {
continue
}
//更新关键帧
coverUrlArr := strings.Split(coverUrl, "?")
coverUrl = coverUrlArr[0] + "?" + time.Now().Format("01021504")
s.dao.UpdateRoomEx(ctx, roomId, []string{"keyframe"}, coverUrl)
time.Sleep(time.Millisecond * 10)
}
return
}
}(slice))
}
i = end
}
eg.Wait()
log.Info("updateKeyFrame_end")
return
}
func (s *Service) dealKeyFrame(ctx context.Context, roomId int64) (coverUrl string, err error) {
//二次确认是否关播,关播不再做
roomInfos, err := s.dao.GetInfosByRoomIds(ctx, []int64{roomId}, []string{"live_status"})
if err != nil {
log.Error("updateKeyFrame_GetInfosByRoomIds_error:room_id=%d;err=%v", roomId, err)
return
}
roomInfo := roomInfos[roomId]
//未开播,不更新关键帧
if roomInfo == nil || roomInfo.LiveStatus != dao.LIVE_OPEN {
return
}
//判断是否为pk房间,pk房间不更新关键帧
pkReply, err := s.dao.GetPkStatus(ctx, roomId)
if err != nil {
log.Error("updateKeyFrame_GetPkStatus_error:room_id=%d", roomId)
return
}
if pkReply.PkStatus > 0 {
return
}
//获取关键帧
startTime := time.Now().Add(-time.Minute)
endTime := time.Now()
pics, err := s.dao.GetPicsByRoomId(ctx, roomId, startTime, endTime)
if err != nil || pics == nil || pics[0] == "" {
log.Warn("updateKeyFrame_GetPicsByRoomId_error:room_id=%d;pics=%v;err=%v", roomId, pics, err)
return
}
//上传至bfs
reply, err := s.dao.ImgDownload(ctx, pics[0])
if err != nil || reply == nil {
log.Warn("updateKeyFrame_ImgDownload_error:room_id=%d;pic=%s;err=%v;reply=%v", roomId, pics[0], err, reply)
return
}
coverUrl, err = s.dao.ImgUpload(ctx, roomId, pics[0], reply)
if err != nil || coverUrl == "" {
log.Error("updateKeyFrame_ImgUploadBfs_error:room_id=%d;pic=%s", roomId, pics[0])
return
}
return
}

View File

@@ -0,0 +1,26 @@
package service
import (
"flag"
"testing"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/job/live/dao-anchor-job/internal/conf"
)
var s *Service
func init() {
flag.Set("conf", "../../cmd/test.toml")
if err := conf.Init(); err != nil {
panic(err)
}
s = New(conf.Conf)
}
func TestCover(t *testing.T) {
Convey("testCover", t, func() {
s.updateKeyFrame()
})
}

View File

@@ -0,0 +1,95 @@
package service
import (
"context"
"fmt"
"time"
"go-common/library/log"
"go-common/library/sync/errgroup"
)
const ROOM_LEN = 300
//实时数据处理逻辑,生成list
func (s *Service) minuteDataToCacheList() {
ctx := context.TODO()
ctx, cancel := context.WithTimeout(ctx, time.Minute*5)
defer cancel()
ctx = GetTraceLogCtx(ctx, "minuteDataToCacheList")
log.Infow(ctx, "log", "minuteDataToCacheList_start")
//获取需要生成的数据的content列表
contentMap, err := s.dao.GetContentMap(ctx)
if err != nil {
log.Errorw(ctx, "log", fmt.Sprintf("minuteDataToCacheList_GetContentMap_error:reply=%v;err=%v", contentMap, err))
return
}
//获取全量开播房间
allLiveingRoomIds, err := s.dao.GetAllLiveRoomIds(ctx)
if allLiveingRoomIds == nil || err != nil {
log.Errorw(ctx, "log", fmt.Sprintf("minuteDataToCacheList_allLiveingRoomIds_error:reply=%v;err=%v", allLiveingRoomIds, err))
return
}
eg := errgroup.Group{}
for content := range contentMap {
log.Infow(ctx, fmt.Sprintf("minuteDataToCacheList_start:%s", content))
eg.Go(func(contentParam string) func() error {
slice := make([]int64, 0)
for i := 0; i < len(allLiveingRoomIds); {
end := ROOM_LEN + i
if ROOM_LEN+i >= len(allLiveingRoomIds) {
end = len(allLiveingRoomIds)
}
slice = allLiveingRoomIds[i:end]
if len(slice) <= 0 {
break
} else {
s.dao.CreateCacheList(ctx, slice, contentParam)
}
i = end
}
log.Infow(ctx, "log", fmt.Sprintf("minuteDataToCacheList_end_content=%s;err=%v", contentParam, err))
return nil
}(content))
}
eg.Wait()
log.Infow(ctx, "log", "minuteDataToCacheList_end")
return
}
func (s *Service) minuteDataToDB() {
ctx := context.TODO()
ctx, cancel := context.WithTimeout(ctx, time.Minute*3)
defer cancel()
ctx = GetTraceLogCtx(ctx, "minuteDataToDB")
log.Infow(ctx, "log", "minuteDataToDB_start")
//获取需要生成的数据的content列表
contentMap, err := s.dao.GetContentMap(ctx)
if err != nil {
log.Errorw(ctx, "log", fmt.Sprintf("data_allLiveingRoomIds_error:reply=%v;err=%v", contentMap, err))
return
}
//获取全量开播房间
allLiveingRoomIds, err := s.dao.GetAllLiveRoomIds(ctx)
if allLiveingRoomIds == nil || err != nil {
log.Errorw(ctx, "log", fmt.Sprintf("data_allLiveingRoomIds_error:reply=%v;err=%v", allLiveingRoomIds, err))
return
}
eg := errgroup.Group{}
for content := range contentMap {
log.Info("minuteDataToCacheList_start:" + content)
eg.Go(func(contentParam string) func() error {
return func() (err error) {
for _, roomId := range allLiveingRoomIds {
s.dao.CreateDBData(ctx, []int64{int64(roomId)}, contentParam)
}
log.Infow(ctx, "log", fmt.Sprintf("minuteDataToCacheList_end_content=%s;err=%v", contentParam, err))
return
}
}(content))
}
eg.Wait()
log.Infow(ctx, "log", fmt.Sprintf("minuteDataToDB_end"))
return
}

View File

@@ -0,0 +1,30 @@
package service
import (
"flag"
"testing"
. "github.com/smartystreets/goconvey/convey"
"go-common/app/job/live/dao-anchor-job/internal/conf"
)
func init() {
flag.Set("conf", "../../cmd/test.toml")
if err := conf.Init(); err != nil {
panic(err)
}
s = New(conf.Conf)
}
func TestMinuteDataToCacheList(t *testing.T) {
Convey("testMinuteDataToCacheList", t, func() {
s.minuteDataToCacheList()
})
}
func TestMinuteDataToDB(t *testing.T) {
Convey("TestMinuteDataToDB", t, func() {
s.minuteDataToDB()
})
}

View File

@@ -0,0 +1,61 @@
package service
import (
"context"
"go-common/library/net/trace"
"go-common/library/log"
"github.com/robfig/cron"
"go-common/app/job/live/dao-anchor-job/internal/conf"
"go-common/app/job/live/dao-anchor-job/internal/dao"
)
// Service struct
type Service struct {
c *conf.Config
dao *dao.Dao
cron *cron.Cron
}
// New init
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
cron: cron.New(),
}
if err := s.cron.AddFunc(s.c.CoverControl.CoverCron, s.updateKeyFrame); err != nil {
panic(err)
}
if err := s.cron.AddFunc(s.c.Minute3Control.Minute3Cron, s.minuteDataToDB); err != nil {
panic(err)
}
if err := s.cron.AddFunc(s.c.MinuteControl.MinuteCron, s.minuteDataToCacheList); err != nil {
panic(err)
}
s.cron.Start()
return s
}
// Ping Service
func (s *Service) Ping(ctx context.Context) (err error) {
return s.dao.Ping(ctx)
}
// Close Service
func (s *Service) Close() {
log.Info("Crontab Closed!")
s.cron.Stop()
log.Info("Physical Dao Closed!")
s.dao.Close()
log.Info("tv-job has been closed.")
}
func GetTraceLogCtx(ctx context.Context, title string) (ctxNew context.Context) {
t := trace.New(title)
ctxNew = trace.NewContext(ctx, t)
return
}