forked from all_user/stat_center
Initial commit
This commit is contained in:
@@ -0,0 +1,179 @@
|
||||
package proxy
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"stat/common/httpUtils"
|
||||
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
apiDomain = "http://file.dhuqh.com/file/upload"
|
||||
)
|
||||
|
||||
var (
|
||||
header = map[string]string{"Content-Type": "application/json"}
|
||||
)
|
||||
|
||||
const (
|
||||
Success = 200
|
||||
)
|
||||
|
||||
func UploadImg(fileName string, data []byte, domain string) (pathStr string, err error) {
|
||||
r := objreq{
|
||||
Name: fileName,
|
||||
Data: base64.StdEncoding.EncodeToString(data),
|
||||
}
|
||||
jsonbytes, err := json.Marshal(r)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if len(domain) == 0 {
|
||||
domain = apiDomain
|
||||
}
|
||||
url := domain
|
||||
if !strings.Contains(domain, "/file/upload") {
|
||||
url = domain + "/file/upload"
|
||||
}
|
||||
resp, err := httpUtils.Post(url, header, bytes.NewReader(jsonbytes))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
var or objresp
|
||||
if err = json.Unmarshal(resp.Data, &or); err != nil {
|
||||
return
|
||||
}
|
||||
if or.Code != Success {
|
||||
err = fmt.Errorf("上传失败:%s", or.Msg)
|
||||
return
|
||||
}
|
||||
pathStr = or.Object.Name
|
||||
return
|
||||
}
|
||||
|
||||
func fileServer() (url string) {
|
||||
return "http://ts.dhuqh.com"
|
||||
}
|
||||
|
||||
func PostOk(baseInfo *BaseInfo, domain string) (result *VideoOkResult, err error) {
|
||||
result = &VideoOkResult{}
|
||||
paramJson, err := json.Marshal(baseInfo)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if len(domain) == 0 {
|
||||
domain = fileServer()
|
||||
}
|
||||
url := domain
|
||||
if !strings.Contains(domain, "/video/shard/info") {
|
||||
url = domain + "/video/shard/info"
|
||||
}
|
||||
fr, err := httpUtils.Post(url, header, bytes.NewReader(paramJson))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if err = json.Unmarshal(fr.Data, result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func UploadVideo(domain string, body *ShardBody) (result *Result, err error) {
|
||||
if body == nil {
|
||||
return nil, errors.New("no video to upload")
|
||||
}
|
||||
if len(domain) == 0 {
|
||||
domain = fileServer()
|
||||
}
|
||||
url := domain
|
||||
if !strings.Contains(domain, "/video/shard/body") {
|
||||
url = domain + "/video/shard/body"
|
||||
}
|
||||
buf, err := json.Marshal(body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
resp, err := httpUtils.Post(url, header, bytes.NewBuffer(buf))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result = new(Result)
|
||||
if err = json.Unmarshal(resp.Data, result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func PostSearch(param *MediaSearchReq, domain string) (result *MediaSearchResp, err error) {
|
||||
result = &MediaSearchResp{}
|
||||
paramJson, err := json.Marshal(param)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if len(domain) == 0 {
|
||||
domain = fileServer()
|
||||
}
|
||||
url := domain
|
||||
if !strings.Contains(domain, "/video/search/list") {
|
||||
url = domain + "/video/search/list"
|
||||
}
|
||||
fr, err := httpUtils.Post(url, header, bytes.NewReader(paramJson))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if err = json.Unmarshal(fr.Data, result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func PostUpdate(param *MediasUpdateReq, domain string) (result *MediasUpdateResp, err error) {
|
||||
result = &MediasUpdateResp{}
|
||||
paramJson, err := json.Marshal(param)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if len(domain) == 0 {
|
||||
domain = fileServer()
|
||||
}
|
||||
url := domain
|
||||
if !strings.Contains(domain, "/video/update") {
|
||||
url = domain + "/video/update"
|
||||
}
|
||||
fr, err := httpUtils.Post(url, header, bytes.NewReader(paramJson))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if err = json.Unmarshal(fr.Data, result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func PostDelete(param *MediasDelReq, domain string) (result *MediasDelResp, err error) {
|
||||
result = &MediasDelResp{}
|
||||
paramJson, err := json.Marshal(param)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if len(domain) == 0 {
|
||||
domain = fileServer()
|
||||
}
|
||||
url := domain
|
||||
if !strings.Contains(domain, "/video/delete") {
|
||||
url = domain + "/video/delete"
|
||||
}
|
||||
fr, err := httpUtils.Post(url, header, bytes.NewReader(paramJson))
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if err = json.Unmarshal(fr.Data, result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,150 @@
|
||||
package proxy
|
||||
|
||||
import "time"
|
||||
|
||||
type objreq struct {
|
||||
Name string `json:"fileName"`
|
||||
Data string `json:"fileData"`
|
||||
}
|
||||
|
||||
type Obj struct {
|
||||
Domain string `json:"domain"`
|
||||
Name string `json:"fileName"`
|
||||
}
|
||||
|
||||
type objresp struct {
|
||||
Code int `json:"code"`
|
||||
Object Obj `json:"data"`
|
||||
Msg string `json:"msg"`
|
||||
}
|
||||
|
||||
type ShardBody struct {
|
||||
TaskId string `json:"taskId,omitempty"` // 文档md5
|
||||
Pos int `json:"pos,omitempty"` // 位置
|
||||
FileData string `json:"fileData,omitempty"` // 数据
|
||||
Type string `json:"type,omitempty"`
|
||||
TotalPos int `json:"totalPos,omitempty"` // 分片总数
|
||||
}
|
||||
|
||||
type Data struct {
|
||||
Id string `json:"id,omitempty"`
|
||||
VideoUri string `json:"videoUri,omitempty"`
|
||||
}
|
||||
|
||||
type Result struct {
|
||||
Code int `json:"code,omitempty"` //
|
||||
Data Data `json:"data,omitempty"` //
|
||||
Msg string `json:"msg,omitempty"` //
|
||||
}
|
||||
|
||||
type VideoOkResult struct {
|
||||
Code int `json:"code,omitempty"`
|
||||
Msg string `json:"msg,omitempty"` //
|
||||
Data string `json:"data,omitempty"`
|
||||
}
|
||||
|
||||
type BaseInfo struct {
|
||||
ID string `json:"id,omitempty"`
|
||||
Title string `json:"title,omitempty"` // 标题
|
||||
CheckSum string `json:"checkSum,omitempty"` // md5校验码
|
||||
VideoTime int32 `json:"videTime"` // 影片时长
|
||||
Publish string `bson:"publish,omitempty"` // 视频发布者
|
||||
Type string `json:"type"` // 视频:长视频/短视频--时间阈值
|
||||
Preview int32 `json:"preview"` // 预览普通视频:1:预览 2:
|
||||
Country string `json:"country"` // 国家 (国产、日本、欧美.... 前端固定)
|
||||
FirstTag string `json:"firstTag,omitempty"` // 一级标签
|
||||
SecondTags []string `json:"secondTags,omitempty"` // 二级标签标签
|
||||
CoverImg []string `json:"coverImg,omitempty"` // 封面
|
||||
PreFileName string `json:"preFileName,omitempty"` // 预览文件
|
||||
Status string `json:"status,omitempty"` // 当前状态
|
||||
Size int64 `json:"size"` // 文件size,单位byte
|
||||
Filename string `json:"filename,omitempty"` // 文件名称
|
||||
Desc string `json:"desc,omitempty"` // 详细描述
|
||||
Directors []string `json:"director,omitempty"` // 导演
|
||||
Actors []string `json:"actors,omitempty"` // 演员
|
||||
Studio string `json:"studio,omitempty"` // 工作室
|
||||
Bango string `json:"bango,omitempty"` // 番号,唯一
|
||||
Via string `json:"via,omitempty"` // 来源
|
||||
Remark string `json:"remark,omitempty"` // 备注
|
||||
AddedTime string `json:"addedTime,omitempty"` // 上架时间
|
||||
UploadTime string `json:"uploadTime,omitempty"` // 上传时间
|
||||
}
|
||||
|
||||
type VideoUpdate struct {
|
||||
ID string `json:"id,omitempty"`
|
||||
Title *string `json:"title,omitempty"` // 标题
|
||||
Publish *string `bson:"publish,omitempty"` // 视频发布者
|
||||
Type *string `json:"type"` // 视频:长视频/短视频--时间阈值
|
||||
Preview *int32 `json:"preview"` // 预览:1:预览 2:普通视频
|
||||
Country *string `json:"country"` // 国家 (国产、日本、欧美.... 前端固定)
|
||||
FirstTag *string `json:"firstTag,omitempty"` // 一级标签
|
||||
SecondTags *[]string `json:"secondTags,omitempty"` // 二级标签标签
|
||||
CoverImg *[]string `json:"coverImg,omitempty"` // 封面
|
||||
PreFileName *string `json:"preFileName,omitempty"` // 预览文件
|
||||
Status *string `json:"status,omitempty"` // 当前状态
|
||||
Desc *string `json:"desc,omitempty"` // 详细描述
|
||||
Directors *[]string `json:"director,omitempty"` // 导演
|
||||
Actors *[]string `json:"actors,omitempty"` // 演员
|
||||
Studio *string `json:"studio,omitempty"` // 工作室
|
||||
Bango *string `json:"bango,omitempty"` // 番号,唯一
|
||||
Via *string `json:"via,omitempty"` // 来源
|
||||
Remark *string `json:"remark,omitempty"` // 备注
|
||||
AddedTime *string `json:"addedTime,omitempty"` // 上架时间
|
||||
UploadTime *string `json:"uploadTime,omitempty"` // 上传时间
|
||||
}
|
||||
|
||||
type VideoSearch struct {
|
||||
ID string `json:"id,omitempty"`
|
||||
Title *string `json:"title,omitempty"` // 标题
|
||||
Publish *string `bson:"publish,omitempty"` // 视频发布者
|
||||
Type *string `json:"type"` // 视频:长视频/短视频--时间阈值
|
||||
Preview *int32 `json:"preview"` // 预览:1:预览 2:普通视频
|
||||
Country *string `json:"country"` // 国家 (国产、日本、欧美.... 前端固定)
|
||||
FirstTag *string `json:"firstTag,omitempty"` // 一级标签
|
||||
SecondTags *[]string `json:"secondTags,omitempty"` // 二级标签标签
|
||||
Status *string `json:"status,omitempty"` // 当前状态
|
||||
Directors *[]string `json:"director,omitempty"` // 导演
|
||||
Actors *[]string `json:"actors,omitempty"` // 演员
|
||||
Studio *string `json:"studio,omitempty"` // 工作室
|
||||
Bango *string `json:"bango,omitempty"` // 番号,唯一
|
||||
Via *string `json:"via,omitempty"` // 来源
|
||||
Remark *string `json:"remark,omitempty"` // 备注
|
||||
AddedTime *string `json:"addedTime,omitempty"` // 上架时间
|
||||
UploadTime *string `json:"uploadTime,omitempty"` // 上传时间
|
||||
Start *time.Time `json:"start"` // 开始时间
|
||||
End *time.Time `json:"end"` // 结束时间
|
||||
}
|
||||
|
||||
type UploadVideoBodyResp struct {
|
||||
Id string `json:"id"` // 文件服返回的上传文件Id
|
||||
VideoUri string `json:"videoUri"` // 文件服返回的视频uri
|
||||
}
|
||||
|
||||
type MediaSearchReq struct {
|
||||
PageNum int64 `json:"pageNum"`
|
||||
PageSize int64 `json:"pageSize"`
|
||||
Param *VideoSearch `json:"param"`
|
||||
}
|
||||
|
||||
//MediaSearchReq 媒体搜索请求返回
|
||||
type MediaSearchResp struct {
|
||||
Total int64 `json:"total"`
|
||||
List []BaseInfo `json:"list"`
|
||||
}
|
||||
|
||||
type MediasDelReq struct {
|
||||
Ids []string `json:"id"`
|
||||
}
|
||||
|
||||
//MediasDelResp 请求批量删除媒体回复
|
||||
type MediasDelResp struct {
|
||||
}
|
||||
|
||||
type MediasUpdateReq struct {
|
||||
Ids []string `json:"id"`
|
||||
VideoUpdate
|
||||
}
|
||||
|
||||
//MediasUpdateResp 请求批量更新媒体回复
|
||||
type MediasUpdateResp struct {
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"mime/multipart"
|
||||
"stat/service/storage/proxy"
|
||||
"strconv"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var (
|
||||
buffer = bytes.Buffer{}
|
||||
mtx sync.Mutex
|
||||
)
|
||||
|
||||
// web后台上传使用, form-data方式上传
|
||||
func UploadImage(ctx context.Context, f *multipart.FileHeader, domain string) (path string, err error) {
|
||||
if f == nil {
|
||||
return "", errors.New("file is nil!")
|
||||
}
|
||||
var file multipart.File
|
||||
if file, err = f.Open(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
defer file.Close()
|
||||
|
||||
mtx.Lock()
|
||||
defer mtx.Unlock()
|
||||
buffer.Reset()
|
||||
if _, err = buffer.ReadFrom(file); err != nil {
|
||||
return
|
||||
}
|
||||
return proxy.UploadImg(f.Filename, buffer.Bytes(), domain)
|
||||
}
|
||||
|
||||
func UploadVideoBody(ctx context.Context, form *multipart.Form, domain string) (*proxy.Result, error) {
|
||||
if form == nil {
|
||||
return nil, errors.New("multipart from is nil")
|
||||
}
|
||||
sb, err := makeShardBodyByForm(form)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return proxy.UploadVideo(domain, sb)
|
||||
}
|
||||
|
||||
func VideoBody(ctx context.Context, taskId, typ, domain string, pos int, data []byte) (*proxy.Result, error) {
|
||||
body := &proxy.ShardBody{
|
||||
TaskId: taskId,
|
||||
Pos: pos,
|
||||
FileData: base64.StdEncoding.EncodeToString(data),
|
||||
Type: typ,
|
||||
}
|
||||
if typ == "1" {
|
||||
body.Type = "AV"
|
||||
} else if typ == "2" {
|
||||
body.Type = "SP"
|
||||
}
|
||||
return proxy.UploadVideo(domain, body)
|
||||
}
|
||||
|
||||
func UploadVideoOK(ctx context.Context, in *proxy.BaseInfo, domain string) (*proxy.VideoOkResult, error) {
|
||||
if in.Type == "1" {
|
||||
in.Type = "AV"
|
||||
} else if in.Type == "2" {
|
||||
in.Type = "SP"
|
||||
}
|
||||
return proxy.PostOk(in, domain)
|
||||
}
|
||||
|
||||
func makeShardBodyByForm(form *multipart.Form) (*proxy.ShardBody, error) {
|
||||
poss := form.Value["pos"]
|
||||
taskIds := form.Value["taskId"]
|
||||
types := form.Value["type"]
|
||||
fs := form.File["file"]
|
||||
totalPoss := form.Value["totalChunks"]
|
||||
|
||||
var (
|
||||
pos, total int
|
||||
taskId string
|
||||
typ string
|
||||
f *multipart.FileHeader
|
||||
err error
|
||||
)
|
||||
|
||||
if len(fs) == 0 || fs[0] == nil {
|
||||
return nil, errors.New("no file")
|
||||
}
|
||||
f = fs[0]
|
||||
|
||||
if len(poss) == 0 || poss[0] == "" {
|
||||
return nil, errors.New("no pos")
|
||||
}
|
||||
if pos, err = strconv.Atoi(poss[0]); err != nil {
|
||||
return nil, fmt.Errorf("invalid pos")
|
||||
}
|
||||
if len(totalPoss) == 0 || totalPoss[0] == "" {
|
||||
return nil, errors.New("no totalPos")
|
||||
}
|
||||
if total, err = strconv.Atoi(totalPoss[0]); err != nil {
|
||||
return nil, fmt.Errorf("invalid totalPos")
|
||||
}
|
||||
|
||||
if len(taskIds) == 0 || taskIds[0] == "" {
|
||||
return nil, errors.New("no pos")
|
||||
}
|
||||
taskId = taskIds[0]
|
||||
|
||||
if len(types) == 0 || types[0] == "" {
|
||||
return nil, errors.New("no type")
|
||||
}
|
||||
if types[0] == "1" {
|
||||
typ = "AV"
|
||||
} else if types[0] == "2" {
|
||||
typ = "SP"
|
||||
} else {
|
||||
typ = types[0]
|
||||
}
|
||||
|
||||
file, ne := f.Open()
|
||||
if ne != nil {
|
||||
return nil, ne
|
||||
}
|
||||
defer file.Close()
|
||||
mtx.Lock()
|
||||
defer mtx.Unlock()
|
||||
buffer.Reset()
|
||||
if _, err = buffer.ReadFrom(file); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
resp := &proxy.ShardBody{
|
||||
TaskId: taskId,
|
||||
Pos: pos,
|
||||
FileData: base64.StdEncoding.EncodeToString(buffer.Bytes()),
|
||||
Type: typ,
|
||||
TotalPos: total,
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
Reference in New Issue
Block a user