上传视频

This commit is contained in:
2023-10-25 04:14:48 +08:00
parent 533c6dc5d5
commit 9af1e9d609
3 changed files with 98 additions and 79 deletions

View File

@@ -13,6 +13,23 @@
// GET /img/{type}-{id}.{format}?width=320&height=320&fit=cover // GET /img/{type}-{id}.{format}?width=320&height=320&fit=cover
// 更优雅的实现, 使用查询参数的接口 (不幸的是CDN与OSS都不支持) // 更优雅的实现, 使用查询参数的接口 (不幸的是CDN与OSS都不支持)
// endpoint: oss-cn-shanghai-internal.aliyuncs.com
// 获取查询参数
let queryParam = "example query";
// 安全地编码查询参数
let safeParam = encodeURIComponent(queryParam);
// 创建一个带有安全查询参数的URL
let url = "http://example.com/tags?param=" + safeParam;
// 使用fetch API发送请求
fetch(url)
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
``` ```

View File

@@ -614,6 +614,7 @@ func main() {
return return
} }
fmt.Println("safeParam", safeParam)
urls := models.GetVideoM3U8(safeParam) urls := models.GetVideoM3U8(safeParam)
// 将对象转换为有缩进的JSON输出 // 将对象转换为有缩进的JSON输出

View File

@@ -1,104 +1,105 @@
package models package models
import ( import (
openapi "github.com/alibabacloud-go/darabonba-openapi/client" "encoding/base64"
//util "github.com/alibabacloud-go/tea-utils/service" "encoding/json"
//console "github.com/alibabacloud-go/tea-console/client"
env "github.com/alibabacloud-go/darabonba-env/client"
vod20170321 "github.com/alibabacloud-go/vod-20170321/v2/client"
"github.com/alibabacloud-go/tea/tea"
"log"
"fmt" "fmt"
"log"
"regexp" "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" "github.com/spf13/viper"
) )
// 使用AK&SK初始化账号Client
func InitVodClient (accessKeyId *string, accessKeySecret *string, regionId *string) (_result *vod20170321.Client, _err error) {
config := &openapi.Config{}
config.AccessKeyId = accessKeyId
config.AccessKeySecret = accessKeySecret
config.RegionId = regionId
_result = &vod20170321.Client{}
_result, _err = vod20170321.NewClient(config)
return _result, _err
}
func GetVideoM3U8(content string) (blob string) { func GetVideoM3U8(content string) (blob string) {
if len(regexp.MustCompile(`image.gameuiux.cn`).FindStringSubmatch(content)) > 0 { if len(regexp.MustCompile(`image.gameuiux.cn`).FindStringSubmatch(content)) > 0 {
key := regexp.MustCompile(`^https?://image.gameuiux.cn/`).ReplaceAllString(content, "") 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
}
// 从OSS中读取视频 // TODO: 保存到点播服务
// TODO: 返回生成后的视频地址(如果已经在生成, 上锁防止重复请求)
log.Println("无结果, 从OSS加载视频")
bucket := GetBucket("gameui-image2") bucket := GetBucket("gameui-image2")
body, err := bucket.GetObject(key) rest, err := bucket.GetObject(key)
if err != nil { if err != nil {
log.Println("读取视频失败", err) log.Println("读取视频失败", err)
return return
} }
defer body.Close() defer rest.Close()
// 先打印出视频对象 // 1.获取视频上传地址和凭证,并生成视频信息
fmt.Println(body) createUploadVideoResponse, _err := client.CreateUploadVideo(&vod20170321.CreateUploadVideoRequest{
Title: tea.String(key),
// 配置 FileName: tea.String(key),
accessKeyID := viper.GetString("video.accessKeyID") })
accessKeySecret := viper.GetString("video.accessKey")
//endpoint := viper.GetString("video.endpoint")
regionId := "cn-shanghai"
// 连接点播服务的OSS
client, _err := InitVodClient(env.GetEnv(tea.String(accessKeyID)), env.GetEnv(tea.String(accessKeySecret)), &regionId)
if _err != nil { if _err != nil {
return _err.Error() 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(client) fmt.Println("上传视频结束")
return "空" // 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)
//// 1.获取视频上传地址和凭证,并生成视频信息
//createUploadVideoRequest := &vod20170321.CreateUploadVideoRequest{
// Title: args[1],
// FileName: args[2],
//}
//createUploadVideoResponse, _err := client.CreateUploadVideo(createUploadVideoRequest)
//if _err != nil {
// return _err.Error()
//}
//console.Log(util.ToJSONString(tea.ToMap(createUploadVideoResponse)))
//// 媒体id
//uploadVideoId := createUploadVideoResponse.Body.VideoId
//console.Log(uploadVideoId)
//// 如果视频文件过大,上传超时后可以刷新视频凭证,然后继续上传
//refreshUploadVideoRequest := &vod20170321.RefreshUploadVideoRequest{
// VideoId: uploadVideoId,
//}
//refreshUploadVideoReponse, _err := client.RefreshUploadVideo(refreshUploadVideoRequest)
//if _err != nil {
// return _err
//}
//console.Log(util.ToJSONString(tea.ToMap(refreshUploadVideoReponse)))
//// 2.oss视频文件上传需要用户实现
//// 3.上传过程中,获取媒体上传详情
//getUploadDetailsRequest := &vod20170321.GetUploadDetailsRequest{
// MediaIds: uploadVideoId,
//}
//getUploadDetailsReponse, _err := client.GetUploadDetails(getUploadDetailsRequest)
//if _err != nil {
// return _err
//}
//console.Log(util.ToJSONString(tea.ToMap(getUploadDetailsReponse)))
//// 4.媒体上传完成之后,可以获取媒体播放信息进行播放
//// 4.1 通过播放凭证播放
//getPlayInfoRequest := &vod20170321.GetPlayInfoRequest{
// VideoId: uploadVideoId,
//}
//getPlayInfoReponse, _err := client.GetPlayInfo(getPlayInfoRequest)
//if _err != nil {
// return _err
//}
//console.Log(util.ToJSONString(tea.ToMap(getPlayInfoReponse)))
//// 4.2 通过播放地址播放 //// 4.2 通过播放地址播放
//getVideoPlayAuthRequest := &vod20170321.GetVideoPlayAuthRequest{ //getVideoPlayAuthRequest := &vod20170321.GetVideoPlayAuthRequest{
// VideoId: uploadVideoId, // VideoId: uploadVideoId,
@@ -110,4 +111,4 @@ func GetVideoM3U8(content string) (blob string) {
//console.Log(util.ToJSONString(tea.ToMap(getVideoPlayAuthReponse))) //console.Log(util.ToJSONString(tea.ToMap(getVideoPlayAuthReponse)))
} }
return return
} }