87 lines
1.9 KiB
Go
87 lines
1.9 KiB
Go
|
package service
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
"strconv"
|
||
|
"time"
|
||
|
|
||
|
v1 "go-common/app/interface/bbq/app-bbq/api/http/v1"
|
||
|
"go-common/library/log"
|
||
|
bm "go-common/library/net/http/blademaster"
|
||
|
|
||
|
"github.com/Dai0522/go-hash/murmur3"
|
||
|
)
|
||
|
|
||
|
// GetShareURL .
|
||
|
func (s *Service) GetShareURL(ctx context.Context, mid int64, device *bm.Device, req *v1.ShareRequest) (*v1.ShareResponse, error) {
|
||
|
_, err := s.dao.VideoBase(ctx, mid, req.Svid)
|
||
|
if err != nil {
|
||
|
log.Warnw(ctx, "log", "get video base fail", "svid", req.Svid)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
token := s.dao.GetUserShareToken(ctx, mid)
|
||
|
if token == "" {
|
||
|
hash := murmur3.NewWithSeed(uint32(time.Now().Unix()))
|
||
|
str := fmt.Sprintf("%d:%s", mid, buvid(device))
|
||
|
token = toHex(hash.Murmur3_128([]byte(str)))
|
||
|
s.dao.SetUserShareToken(ctx, mid, token)
|
||
|
}
|
||
|
|
||
|
var url, params []*v1.Tuple
|
||
|
params = append(params, &v1.Tuple{
|
||
|
Key: "mid",
|
||
|
Val: strconv.Itoa(int(mid)),
|
||
|
}, &v1.Tuple{
|
||
|
Key: "svid",
|
||
|
Val: strconv.Itoa(int(req.Svid)),
|
||
|
}, &v1.Tuple{
|
||
|
Key: "token",
|
||
|
Val: token,
|
||
|
})
|
||
|
|
||
|
url = append(url, &v1.Tuple{
|
||
|
Key: "1",
|
||
|
Val: "https://bbq.bilibili.com/video/?id={svid}&token={token}",
|
||
|
})
|
||
|
url = append(url, &v1.Tuple{
|
||
|
Key: "2",
|
||
|
Val: "https://bbq.bilibili.com/user/?id={mid}&token={token}",
|
||
|
})
|
||
|
|
||
|
return &v1.ShareResponse{
|
||
|
URL: url,
|
||
|
Params: params,
|
||
|
}, nil
|
||
|
}
|
||
|
|
||
|
func toHex(b []byte) string {
|
||
|
var res string
|
||
|
pattern := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "e", "f", "g"}
|
||
|
for _, v := range b {
|
||
|
res += pattern[v&15]
|
||
|
res += pattern[(v>>4)&15]
|
||
|
}
|
||
|
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
// ShareCallback .
|
||
|
func (s *Service) ShareCallback(ctx context.Context, mid int64, device *bm.Device, args *v1.ShareCallbackRequest) (resp *v1.ShareCallbackResponse, err error) {
|
||
|
// 增加分享数
|
||
|
share := int32(0)
|
||
|
if args.Svid != int64(0) {
|
||
|
share, err = s.dao.IncrVideoStatisticsShare(ctx, args.Svid)
|
||
|
if err != nil {
|
||
|
log.Errorv(ctx, log.KV("log", err))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
resp = &v1.ShareCallbackResponse{
|
||
|
ShareCount: share,
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|