123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- package bvc
- import (
- "context"
- "crypto/md5"
- "encoding/hex"
- "encoding/json"
- "io/ioutil"
- "net"
- "net/http"
- "net/url"
- "strconv"
- "strings"
- "time"
- "go-common/app/job/main/videoup/conf"
- "go-common/library/log"
- "go-common/library/xstr"
- )
- // Dao is message dao.
- type Dao struct {
- c *conf.Config
- httpCli *http.Client
- capableURL string
- }
- // New new a activity dao.
- func New(c *conf.Config) (d *Dao) {
- // http://bvc-playurl.bilibili.co/video_capable?cid=18669677&capable=0&ts=1497426598&sign=e822b4ce02fdcf91eb29fd47dcbbc3c8
- d = &Dao{
- c: c,
- httpCli: &http.Client{
- Transport: &http.Transport{
- Dial: (&net.Dialer{
- Timeout: 5 * time.Second,
- }).Dial,
- DisableKeepAlives: true,
- },
- Timeout: 10 * time.Second,
- },
- capableURL: c.Host.Bvc.Bvc + "/video_capable",
- }
- return
- }
- // VideoCapable sync cid audit result to bvc.
- func (d *Dao) VideoCapable(c context.Context, aid int64, allCids []int64, capable int) (err error) {
- var times int
- if len(allCids)%50 == 0 {
- times = len(allCids) / 50
- } else {
- times = len(allCids)/50 + 1
- }
- var cids []int64
- for i := 0; i < times; i++ {
- if i == times-1 {
- cids = allCids[i*50:]
- } else {
- cids = allCids[i*50 : (i+1)*50]
- }
- if err = d.call(aid, cids, capable); err != nil {
- return
- }
- }
- return
- }
- func (d *Dao) call(aid int64, cids []int64, capable int) (err error) {
- var (
- // http params
- cidStr = xstr.JoinInts(cids)
- capableStr = strconv.Itoa(capable)
- ts = strconv.FormatInt(time.Now().Unix(), 10)
- signs = []string{cidStr, ts, capableStr, d.c.Host.Bvc.AppendKey}
- )
- log.Info("VideoCapable aid(%d) cid(%s) capable(%d) process start", aid, cidStr, capable)
- params := url.Values{}
- params.Set("ts", ts)
- params.Set("cid", cidStr)
- params.Set("capable", capableStr)
- // sign = md5(cid + gap_key + ts + gap_key + capable + gap_key + append_key)
- // gap_key(d.c.Host.Bvc.GapKey) = "--->"
- signStr := strings.Join(signs, d.c.Host.Bvc.GapKey)
- mh := md5.Sum([]byte(signStr))
- sign := hex.EncodeToString(mh[:])
- params.Set("sign", sign)
- url := d.capableURL + "?" + params.Encode()
- // http
- var (
- req *http.Request
- resp *http.Response
- )
- if req, err = http.NewRequest("POST", url, nil); err != nil {
- log.Error("VideoCapable cid(%s) http.NewRequest(POST,%s) error(%v)", cidStr, url, err)
- return
- }
- if resp, err = d.httpCli.Do(req); err != nil {
- log.Error("VideoCapable cid(%s) d.httpCli.Do() error(%v)", cidStr, err)
- return
- }
- defer resp.Body.Close()
- // Update successfully only when response is HTTP/200.(bvc said this)
- if resp.StatusCode != http.StatusOK {
- log.Error("VideoCapable cid(%s) sync cid result faild. StatusCode(%d)", cidStr, resp.StatusCode)
- return
- }
- var rb []byte
- if rb, err = ioutil.ReadAll(resp.Body); err != nil {
- log.Error("VideoCapable cid(%s) ioutil.ReadAll(resp.Body) error(%v)", cidStr, err)
- err = nil
- return
- }
- var res struct {
- Error int `json:"error"`
- Message string `json:"message"`
- }
- if err = json.Unmarshal(rb, &res); err != nil {
- log.Error("VideoCapable cid(%s) json.Unmarshal(%s) error(%v)", cidStr, string(rb), err)
- err = nil
- return
- }
- log.Info("VideoCapable cid(%s) capable(%d) res.error(%d) or res.message(%v) process end", cidStr, capable, res.Error, res.Message)
- return
- }
|