Files
webp/models/video.go
2023-10-25 04:14:48 +08:00

115 lines
3.5 KiB
Go

package models
import (
"encoding/base64"
"encoding/json"
"fmt"
"log"
"regexp"
openapi "github.com/alibabacloud-go/darabonba-openapi/client"
"github.com/alibabacloud-go/tea/tea"
vod20170321 "github.com/alibabacloud-go/vod-20170321/v2/client"
"github.com/spf13/viper"
)
func GetVideoM3U8(content string) (blob string) {
if len(regexp.MustCompile(`image.gameuiux.cn`).FindStringSubmatch(content)) > 0 {
key := regexp.MustCompile(`^https?://image.gameuiux.cn/`).ReplaceAllString(content, "")
log.Println("GetVideoM3U8", key)
// 连接点播服务的OSS
client, _err := vod20170321.NewClient(&openapi.Config{
AccessKeyId: tea.String(viper.GetString("video.accessID")),
AccessKeySecret: tea.String(viper.GetString("video.accessKey")),
RegionId: tea.String("cn-shanghai"),
})
if _err != nil {
log.Println("Ea", _err.Error())
return
}
// 通过标题查询视频ID
response, _err := client.SearchMedia(&vod20170321.SearchMediaRequest{
Match: tea.String(fmt.Sprintf("Title='%s'", key)),
})
if _err != nil {
log.Println("Eb", _err.Error())
return
}
if len(response.Body.MediaList) > 0 && *response.Body.MediaList[0].MediaType == "video" {
// 通过ID查询视频播放地址
VideoId := response.Body.MediaList[0].Video.VideoId
log.Println("GetPlayInfo", response.Body.MediaList)
result, err := client.GetPlayInfo(&vod20170321.GetPlayInfoRequest{VideoId: VideoId})
if err != nil {
log.Println("Ex", err.Error())
return
}
log.Println("GetPlayInfo", result)
// TODO: 返回播放地址列表
return
}
// TODO: 保存到点播服务
// TODO: 返回生成后的视频地址(如果已经在生成, 上锁防止重复请求)
log.Println("无结果, 从OSS加载视频")
bucket := GetBucket("gameui-image2")
rest, err := bucket.GetObject(key)
if err != nil {
log.Println("读取视频失败", err)
return
}
defer rest.Close()
// 1.获取视频上传地址和凭证,并生成视频信息
createUploadVideoResponse, _err := client.CreateUploadVideo(&vod20170321.CreateUploadVideoRequest{
Title: tea.String(key),
FileName: tea.String(key),
})
if _err != nil {
log.Println("Ee", _err.Error())
return
}
// 解码base64
upload := struct {
Endpoint string `json:"Endpoint"`
Bucket string `json:"Bucket"`
FileName string `json:"FileName"`
}{}
data, _ := base64.StdEncoding.DecodeString(*createUploadVideoResponse.Body.UploadAddress)
json.Unmarshal(data, &upload)
if bucket := GetBucket(upload.Bucket); bucket != nil {
if err := bucket.PutObject(upload.FileName, rest); err != nil {
log.Println("上传视频失败", err)
return
}
}
fmt.Println("上传视频结束")
// fmt.Println("UploadAuth", *createUploadVideoResponse.Body.UploadAuth)
// 4.媒体上传完成之后,可以获取媒体播放信息进行播放
// 4.1 通过播放凭证播放
getPlayInfoReponse, _err := client.GetPlayInfo(&vod20170321.GetPlayInfoRequest{
VideoId: createUploadVideoResponse.Body.VideoId,
})
if _err != nil {
log.Println("Ef", _err.Error())
return
}
fmt.Println("GetPlayInfo", getPlayInfoReponse.Body.PlayInfoList)
//// 4.2 通过播放地址播放
//getVideoPlayAuthRequest := &vod20170321.GetVideoPlayAuthRequest{
// VideoId: uploadVideoId,
//}
//getVideoPlayAuthReponse, _err := client.GetVideoPlayAuth(getVideoPlayAuthRequest)
//if _err != nil {
// return _err
//}
//console.Log(util.ToJSONString(tea.ToMap(getVideoPlayAuthReponse)))
}
return
}