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,18 @@
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [
":package-srcs",
"//app/service/live/third_api/bvc:all-srcs",
"//app/service/live/third_api/liveBroadcast:all-srcs",
"//app/service/live/third_api/skyhorse:all-srcs",
],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,39 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"client.go",
"playurl.go",
],
importpath = "go-common/app/service/live/third_api/bvc",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/net/metadata:go_default_library",
"//library/sync/errgroup:go_default_library",
"//library/xstr: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,29 @@
package bvc
import (
"go-common/library/net/http/blademaster"
)
type Client struct {
conf *blademaster.ClientConfig
bvcHost string
mock string
}
func (c *Client) getConf() *blademaster.ClientConfig {
return c.conf
}
func (c *Client) getBvcHost(def string) string {
if c.bvcHost == "" {
return def
}
return c.bvcHost
}
func New(c *blademaster.ClientConfig, bvcHost string, mock string) *Client {
return &Client{
conf: c,
bvcHost: bvcHost,
mock: mock,
}
}

View File

@@ -0,0 +1,143 @@
package bvc
import (
"context"
"fmt"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/net/metadata"
"go-common/library/sync/errgroup"
"go-common/library/xstr"
"math"
"net/url"
"strconv"
)
const livePlayURLHost = "live-playurl.bilibili.co"
const livePlayURLAddr = "http://live-playurl.bilibili.co/room/v1/Room/playUrl"
const livePlayURLMultiAddr = "http://%s/stream/v1/multiplayurl"
type PlayUrlItem struct {
RoomId int64 `json:"room_id"`
CurrentQuality int64 `json:"current_quality"`
AcceptQuality []int64 `json:"accept_quality"`
Url map[string]string `json:"url"`
}
type respPlayUrl struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data []*PlayUrlItem `json:"data"`
}
// 历史原因,单个的接口和视频云@yuanfeng确认数据结构不统一后面统一暂时先不用
// @see http://live-hub.bilibili.co/doc/playurl/
func (c *Client) GetPlayUrl(ctx *bm.Context, cid, quality, ptype, needHttps, unicomFree int64, platform string) (resp *respPlayUrl) {
cli := bm.NewClient(c.getConf())
param := url.Values{}
param.Set("cid", strconv.FormatInt(cid, 10))
param.Set("quality", strconv.FormatInt(quality, 10))
param.Set("platform", platform)
param.Set("ptype", strconv.FormatInt(ptype, 10))
param.Set("https_url_req", strconv.FormatInt(needHttps, 10))
param.Set("unicom_free", strconv.FormatInt(unicomFree, 10))
err := cli.Get(ctx, livePlayURLAddr, "", param, &resp)
if err != nil {
log.Error("call %s error(%v)", livePlayURLAddr, err)
return
}
if resp.Code != ecode.OK.Code() {
log.Error("call %s response error, code(%d) message(%s)", livePlayURLAddr, resp.Code, resp.Msg)
return
}
return
}
// 批量接口一次最好20个
func (c *Client) GetPlayUrlMulti(ctx context.Context, roomIds []int64,
needHttps, quality, build int64, platform string) (result map[int64]*PlayUrlItem) {
cli := bm.NewClient(c.getConf())
result = make(map[int64]*PlayUrlItem)
userIp := metadata.String(ctx, metadata.RemoteIP)
if userIp == "127.0.0.1" || c.mock == "1" {
userIp = "222.73.196.18"
}
bvcHost := c.getBvcHost(livePlayURLHost)
if quality == 0 {
quality = 4
}
chunkSize := 20
lens := len(roomIds)
if lens <= 0 {
return
}
// 批次
chunkNum := int(math.Ceil(float64(lens) / float64(chunkSize)))
wg, _ := errgroup.WithContext(ctx)
// 空间换时间
chunkResult := make([][]*PlayUrlItem, chunkNum)
for i := 1; i <= chunkNum; i++ {
x := i
wg.Go(func() error {
param := url.Values{}
chunkRoomIds := make([]int64, 20)
if x == chunkNum {
chunkRoomIds = roomIds[(x-1)*chunkSize:]
} else {
chunkRoomIds = roomIds[(x-1)*chunkSize : x*chunkSize]
}
param.Set("room_ids", xstr.JoinInts(chunkRoomIds))
param.Set("platform", platform)
param.Set("https_url_req", strconv.FormatInt(needHttps, 10))
param.Set("quality", strconv.FormatInt(quality, 10))
param.Set("build", strconv.FormatInt(build, 10))
param.Set("req_biz", "live-app-interface")
var resp respPlayUrl
bvcUrl := fmt.Sprintf(livePlayURLMultiAddr, bvcHost)
req, err := cli.NewRequest("GET", bvcUrl, userIp, param)
if err != nil {
log.Error("GetPlayUrlMulti client.NewRequest: get error(%v)", err)
return nil
}
//req.Header.Add("x-backend-bili-real-ip", userIp)
if err := cli.Do(ctx, req, &resp); err != nil {
log.Error("GetPlayUrlMulti client.Do: get error(%v)", err)
return nil
}
if resp.Code != 0 {
log.Error("GetPlayUrlMulti call %s response error, code(%d) message(%s) param(%+v) room_ids(%+v)", bvcUrl, resp.Code, resp.Msg, param, chunkRoomIds)
return nil
}
if resp.Data == nil || len(resp.Data) <= 0 {
log.Warn("GetPlayUrlMulti call %s response empty, code(%d) message(%s) param(%+v) room_ids(%+v)", bvcUrl, resp.Code, resp.Msg, param, chunkRoomIds)
return nil
}
//chunkResult = append(chunkResult, resp.Data)
chunkResult[x-1] = resp.Data
return nil
})
}
if err := wg.Wait(); err != nil {
log.Error("GetPlayUrlMulti get playurl wait error(%+v)", err)
return nil
}
// 整理数据
for _, chunkItemList := range chunkResult {
for _, item := range chunkItemList {
if item != nil {
result[item.RoomId] = item
}
}
}
return
}

View File

@@ -0,0 +1,35 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"client.go",
"push.go",
],
importpath = "go-common/app/service/live/third_api/liveBroadcast",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/log:go_default_library",
"//library/net/http/blademaster: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,17 @@
package liveBroadcast
import "go-common/library/net/http/blademaster"
//Client 客户端
type Client struct {
conf *blademaster.ClientConfig
}
func (c *Client) getConf() *blademaster.ClientConfig {
return c.conf
}
//New 创建
func New(c *blademaster.ClientConfig) *Client {
return &Client{conf: c}
}

View File

@@ -0,0 +1,54 @@
package liveBroadcast
import (
"context"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
xhttp "net/http"
"net/url"
"strconv"
"strings"
)
const (
_liveBroadCastURLAddr = "http://live-dm.bilibili.co:80/dm/1/push"
)
// type liveBroadcastReq struct {
// Ensure int64 `json:"ensure"`
// Cid int64 `json:"cid"`
// }
type liveBroadcastResp struct {
Code int64 `json:"ret"`
}
//PushBroadcast 广播
func (c *Client) PushBroadcast(ctx context.Context, cid int64, ensure int64, msg string) (err error) {
if len([]rune(msg)) > 2000 {
return
}
resp := &liveBroadcastResp{}
cli := bm.NewClient(c.getConf())
param := url.Values{}
param.Set("cid", strconv.FormatInt(cid, 10))
param.Set("ensure", strconv.FormatInt(0, 10))
url := _liveBroadCastURLAddr + "?" + param.Encode()
req, err := xhttp.NewRequest(xhttp.MethodPost, url, strings.NewReader(msg))
if err != nil {
log.Error("[BroadCastError]error:%+v=", err)
return err
}
if err := cli.Do(ctx, req, resp); err != nil {
log.Error("[BroadCastError]error:%+v=", err)
return err
}
if resp.Code != 1 {
log.Error("BroadCastError] errorcode:%d", resp.Code)
}
return
}

View File

@@ -0,0 +1,37 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_library",
)
go_library(
name = "go_default_library",
srcs = [
"client.go",
"rec.go",
],
importpath = "go-common/app/service/live/third_api/skyhorse",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//library/ecode:go_default_library",
"//library/log:go_default_library",
"//library/net/http/blademaster:go_default_library",
"//library/xstr: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,15 @@
package skyhorse
import "go-common/library/net/http/blademaster"
type Client struct {
conf *blademaster.ClientConfig
}
func (c *Client) getConf() *blademaster.ClientConfig {
return c.conf
}
func New(c *blademaster.ClientConfig) *Client {
return &Client{conf: c}
}

View File

@@ -0,0 +1,70 @@
package skyhorse
import (
"context"
"net/url"
"strconv"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
"go-common/library/xstr"
)
const (
_skyHorseURLAddr = "http://data.bilibili.co/recommand"
_skyHorseCnt = 6
_skyHorseFrom = "29004"
)
type SkyHorseItem struct {
Tid int `json:"tid"`
Id int `json:"id"`
GotoType string `json:"goto_type"`
Source string `json:"source"`
TrackId string `json:"track_id"`
AvFeature string `json:"av_feature"`
RcmdReason string `json:"rcmd_reason"`
}
type skyHorseRecResp struct {
Code int `json:"code"`
Error string `json:"error"`
Data []*SkyHorseItem `json:"data"`
}
func (c *Client) GetSkyHorseRec(ctx context.Context, mid int64, buvid string, build int64, plat string,
duplicateItem []int64, strongLen int, timeout int) (skyHorseRec *skyHorseRecResp, err error) {
cli := bm.NewClient(c.getConf())
param := url.Values{}
requestCnt := _skyHorseCnt - strongLen
if requestCnt <= 0 {
requestCnt = 6
}
param.Set("cmd", "live")
param.Set("from", _skyHorseFrom)
param.Set("request_cnt", strconv.Itoa(requestCnt))
param.Set("mid", strconv.FormatInt(mid, 10))
param.Set("buvid", buvid)
param.Set("build", strconv.FormatInt(build, 10))
param.Set("plat", plat)
param.Set("timeout", strconv.Itoa(timeout))
param.Set("duplicates", xstr.JoinInts(duplicateItem))
skyHorseRec = &skyHorseRecResp{}
err = cli.Get(ctx, _skyHorseURLAddr, "", param, skyHorseRec)
if err != nil {
log.Error("[GetSkyHorseRec]error:%+v=", err)
return
}
if skyHorseRec.Code != ecode.OK.Code() {
err = ecode.Int(skyHorseRec.Code)
log.Error("[getSkyHorseRoomList]getSkyHorseList error:%+v,code:%d,msg:%s", err, skyHorseRec.Code, skyHorseRec.Error)
}
return
}