上传视频
This commit is contained in:
		
							
								
								
									
										17
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								README.md
									
									
									
									
									
								
							@@ -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));
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -614,6 +614,7 @@ func main() {
 | 
				
			|||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fmt.Println("safeParam", safeParam)
 | 
				
			||||||
		urls := models.GetVideoM3U8(safeParam)
 | 
							urls := models.GetVideoM3U8(safeParam)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// 将对象转换为有缩进的JSON输出
 | 
							// 将对象转换为有缩进的JSON输出
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										159
									
								
								models/video.go
									
									
									
									
									
								
							
							
						
						
									
										159
									
								
								models/video.go
									
									
									
									
									
								
							@@ -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)), ®ionId)
 | 
					 | 
				
			||||||
		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
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user